名稱:電話撥號顯示器verilog代碼ego1開發(fā)板vivado軟件(代碼在文末下載)
軟件:VIVADO
語言:Verilog
代碼功能:
電話撥號顯示:
1、具體0~9的數(shù)字按鍵。
2、有開始、撥出、接通、刪除按鍵。
3、按下“開始”按鍵后,可以按數(shù)字鍵進行撥號,每按一次數(shù)字,整體號碼左移一位,輸入錯誤時可以刪除。
4、輸入完號碼后,按下“撥出鍵”撥出,此時號碼會在數(shù)碼管上滾動顯示。
5、按下“接通”鍵后,開始通話計時,數(shù)碼管顯示時間分、秒。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
本代碼已在ego1開發(fā)板驗證,開發(fā)板如下,其他開發(fā)板可以修改管腳適配:
演示視頻:
設(shè)計文檔:
1. 工程文件
2. 程序文件
3. 程序編譯
4. RTL圖
5. 管腳分配
6. Testbench
7. 仿真圖
整體仿真圖
電話輸入模塊
控制模塊
顯示模塊
部分代碼展示:
//控制模塊 module?tele_ctrl( input?clk,//50M input?reset,//復(fù)位 input?key_start,//開始 input?key_call,//撥出 input?key_connect,//接通 input?[43:0]?telephone_num,//輸入號碼 output?[31:0]?display_number,//顯示值 output?[2:0]?current_state//當(dāng)前狀態(tài) ); parameter?second_time_cnt=32'd100_000_000; //定義狀態(tài) parameter?s_idle=3'd0; parameter?s_num=3'd1; parameter?s_shift=3'd2; parameter?s_time=3'd3; reg?[2:0]?state=3'd0; assign?current_state=state; //狀態(tài)機控制 always@(posedge?clk?or?negedge?reset) if(reset==0) state<=s_idle; else case(state) s_idle: if(key_start)//開始 state<=s_num; s_num: if(key_call)//撥出 state<=s_shift; s_shift://移位 if(key_connect) state<=s_time; s_time://計時 state<=s_time; default:; endcase reg?[31:0]?second_cnt; reg??second_en; always@(posedge?clk?or?negedge?reset) if(reset==0)begin second_cnt<=32'h0; second_en<=0; end else?if(state==s_time?||?state==s_shift)//計時 if(second_cnt>=second_time_cnt)begin//計時1秒 second_cnt<=32'h0; second_en<=1; end else?begin second_cnt<=second_cnt+32'h1;//計數(shù) second_en<=0; end else?begin second_cnt<=32'h0; second_en<=0; end reg?[7:0]?second; reg?[7:0]?minute; always@(posedge?clk?or?negedge?reset) if(reset==0)begin second<=8'h0; minute<=8'h0; end else?if(state==s_time)//計時狀態(tài) if(second>=8'd59)begin//計時1秒 second<=8'h0; minute<=minute+8'h1;//分計時 end else?begin second<=second+8'h1;//秒計時 minute<=minute; end else?begin second<=8'h0; minute<=8'h0; end wire?[3:0]?second_ten; wire?[3:0]?second_one; wire?[3:0]?minute_ten; wire?[3:0]?minute_one; assign?second_ten=second/10; assign?second_one=second%10; assign?minute_ten=minute/10; assign?minute_one=minute%10; reg?[43:0]?number; always@(posedge?clk?or?negedge?reset) if(reset==0) number<=44'h0; else?if(state==s_num)//撥號 number<=telephone_num; else?if(state==s_shift?&&?second_en)//1秒移位1次 number<={number[39:0],number[43:40]}; else?if(state==s_time)//顯示時間 number<={32'd0,minute_ten,minute_one,second_ten,second_one}; assign?display_number=number[31:0]?; endmodule
點擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=310
閱讀全文