名称:基于FPGA的清零计时器Verilog代码Quartus??实验箱
软件:Quartus
语言:Verilog
代码功能:
清零计时器
要求:
(1)按下按键S1,则红灯亮,并且七段数码管显示14,然后每秒倒计时减1直至清零。
(2)若倒计时中途再次按下按键S1,则数码管立刻再次显示14,并每秒倒计时减1直至清零。清零后红灯熄灭,绿灯闪烁(频率为4Hz)。
(3)外部输入脉冲信号频率为50mHz。
(4)扩展不限,例如点阵显示“十四天无新增”,等自由发挥。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
本代码已在实验箱验证,实验箱如下,其他开发板可以修改管脚适配:
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. 管脚分配
5. RTL图
6. Testbench
7. 仿真图
整体仿真图
分频模块
控制模块
显示模块
部分代码展示:
//控制模块 module?control( input?clk_1KHz,//时钟1KHz input?clk_4Hz,//4Hz(绿灯闪烁频率) input?clk_1Hz,?//1Hz input?s1,//按键 output?reg?led_red,//红灯 output?reg?led_green,//绿灯 output?[7:0]?led_water,//流水灯 output?[3:0]?data_one,//个位 output?[3:0]?data_ten//十位 ); reg?s1_bu0; reg?s1_bu1; always@(posedge?clk_1KHz) begin s1_bu0<=s1; s1_bu1<=s1_bu0; end wire?s1_p;//按键上升沿 assign?s1_p=s1_bu0?&?!s1_bu1;//按键上升沿 reg?[3:0]?cnt_one=4'd0;//个位 reg?[3:0]?cnt_ten=4'd0;//十位 reg?[2:0]?state=3'd0; parameter?s_idle=3'd0; parameter?s_start=3'd1; parameter?s_downcnt=3'd2; parameter?s_end=3'd3; always@(posedge?clk_1KHz) begin case(state) s_idle: if(s1_p)//S1按键 state<=s_start;//开始 else state<=s_idle; s_start: state<=s_downcnt;//倒计时 s_downcnt: if(s1_p)//S1按键 state<=s_start;//开始 else?if(cnt_ten==4'd0?&&?cnt_one==4'd0)//计数清零 state<=s_end;//结束 s_end: if(s1_p)//S1按键 state<=s_start;//开始 default:state<=s_idle; endcase end //红灯 always@(posedge?clk_1KHz) begin if(state==s_downcnt)//倒计时状态 led_red<=1;//红灯亮 else led_red<=0;//红灯灭 end //绿灯 always@(posedge?clk_1KHz) begin if(state==s_end)//倒计时结束 led_green<=clk_4Hz;//绿灯闪烁 else led_green<=0;//绿灯灭 end //倒计时 always@(posedge?clk_1KHz) begin if(state==s_start)//倒计时开始--14 begin cnt_ten<=4'd1; cnt_one<=4'd4; end else?if(state==s_downcnt)begin//倒计时 if(clk_1Hz)//秒脉冲 if(cnt_ten==4'd0?&&?cnt_one==4'd0) begin cnt_ten<=4'd0; cnt_one<=4'd0; end else?if(cnt_one==4'd0) begin cnt_ten<=cnt_ten-4'd1;//十位倒计时 cnt_one<=4'd9; end else cnt_one<=cnt_one-4'd1;//个位倒计时 end end assign?data_one=cnt_one;//个位 assign?data_ten=cnt_ten;//十位 //倒计时结束流水灯显示led_water reg?[7:0]?shift_led=8'b0000_0001; always@(posedge?clk_4Hz) begin if(state==s_idle)//开始 shift_led<=8'b0000_0001; else?if(state==s_end)//倒计时结束 shift_led<={shift_led[6:0],shift_led[7]};//循环移位 end assign?led_water=shift_led; endmodule
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=754
阅读全文