名称:基于FPGA的简易计时闹钟设计Verilog代码VIVADO仿真(文末获取)
软件:VIVADO
语言:Verilog
代码功能:
简易计时闹钟:有四位数码管,前两位计分钟表示00~99分钟,后面两位记秒,值为00~59秒。有三个按键,第一个是分键,第二个是秒键,第三个是启动/暂停键。功能:分秒两键同时按下清零且停止计时,外于设置态,按一次分键分钟加1,99增1变为0;按一次秒键秒增159增1变为0。此状态下按启动/暂停键开始计时,设置值为0000则为正计时,设置值为非零值则为倒计时。正计时时,按启动暂停键会暂停计时,再按启动/暂停键则会继续计时。倒计时时,减到零时停止减数且发出警示蜂鸣声,直到启动/暂停键被按下时进入设置态且同时显示前设置值和停止发出蜂鸣声。
1. 要求
2. 工程文件
3. 程序文件
4. 程序编译
5. Testbench
6. 仿真图
整体仿真图
同时按下分钟秒钟键,然后设置为0000,进入正计时
正计时暂停后启动
再次同时按下分钟秒钟键,然后设置为2分10秒,进入倒计时
倒计时
倒计时结束,蜂鸣器buzzer变为高电平,按下启动暂停按键后变低,并显示前设置值
部分代码展示:
`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2019/12/07 22:11:00 // Design Name: // Module Name: alarm_clock // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // module alarm_clock( input clk,//时钟1Hz input minute_key,//分键,按下高电平 input second_key,//秒键,按下高电平 input startstop_key,//启动暂停键 output reg buzzer,//蜂鸣器 output reg [7:0] minute0_HEX,//分钟十位数码管 output reg [7:0] minute1_HEX,//分钟个位数码管 output reg [7:0] second0_HEX,//秒钟十位数码管 output reg [7:0] second1_HEX//秒钟个位数码管 ); reg [2:0] state=3'd0; parameter idle_state=3'd0; parameter clear_state=3'd1;//清零 parameter set_state=3'd2;//设置 parameter start_state=3'd3;//启动 parameter upcount_state=3'd4;//正计时 parameter downcount_state=3'd5;//倒计时 parameter pause_state=3'd6;//暂停计时 parameter stop_state=3'd7;//停止计时 reg [7:0] minute=8'd0; reg [7:0] second=8'd0; //状态机控制 always@(posedge clk) case(state) idle_state: if(minute_key==1 && second_key==1)//分秒2键同时按下 state<=clear_state;//清零 else state<=idle_state; clear_state: state<=set_state;//设置 set_state: if(startstop_key==1)//启动暂停键 if(minute==6'd0 && second==6'd0)//设置值0000 state<=upcount_state;//正计时 else state<=downcount_state;//倒计时 else state<=set_state;//设置 upcount_state: if(startstop_key==1)//启动暂停键 state<=pause_state;//暂停计时 else if(minute_key==1 && second_key==1)//分秒2键同时按下 state<=clear_state;//清零 else state<=upcount_state;//正计时 pause_state: if(startstop_key==1)//启动暂停键 state<=upcount_state;//正计时 else state<=pause_state;//暂停计时 downcount_state: if(minute==6'd0 && second==6'd0)//减到0时 state<=stop_state;//停止计时 else state<=downcount_state;//倒计时 stop_state: if(startstop_key==1)//启动暂停键 state<=set_state;//设置 else state<=stop_state;//停止计时 default:; endcase //存储前设置值 reg [7:0] minute_buf=8'd0; reg [7:0] second_buf=8'd0; always@(posedge clk) if(state==set_state) if(startstop_key==1)//启动暂停键 begin minute_buf<=minute;//存储前设置值 second_buf<=second;//存储前设置值 end always@(posedge clk) case(state) clear_state:begin//清零 minute<=8'd0; second<=8'd0; end set_state:begin//设置时间 if(minute_key==1)//分 if(minute==8'd99)//99 minute<=8'd0; else minute<=minute+8'd1; else ; if(second_key==1)//秒 if(second==8'd59)//59 second<=8'd0; else second<=second+8'd1; else ; end upcount_state://正计时 if(minute==8'd99 && second==8'd59)begin minute<=8'd0; second<=8'd0; end else if(second==8'd59) begin minute<=minute+8'd1; second<=8'd0; end else begin minute<=minute; second<=second+8'd1; end downcount_state://倒计时 if(minute==8'd0 && second==8'd0)begin minute<=8'd0; second<=8'd0; end else if(second==8'd0) begin minute<=minute-8'd1; second<=8'd59; end else begin minute<=minute; second<=second-8'd1; end stop_state: if(startstop_key==1)begin//启动暂停键
源代码
扫描文章末尾的公众号二维码