赞
踩
名称:基于FPGA的简易计时闹钟设计Verilog代码VIVADO仿真(文末获取)
软件:VIVADO
语言:Verilog
代码功能:
简易计时闹钟:有四位数码管,前两位计分钟表示00~99分钟,后面两位记秒,值为00~59秒。有三个按键,第一个是分键,第二个是秒键,第三个是启动/暂停键。功能:分秒两键同时按下清零且停止计时,外于设置态,按一次分键分钟加1,99增1变为0;按一次秒键秒增159增1变为0。此状态下按启动/暂停键开始计时,设置值为0000则为正计时,设置值为非零值则为倒计时。正计时时,按启动暂停键会暂停计时,再按启动/暂停键则会继续计时。倒计时时,减到零时停止减数且发出警示蜂鸣声,直到启动/暂停键被按下时进入设置态且同时显示前设置值和停止发出蜂鸣声。
1. 工程文件
2. 程序文件
3. 程序编译
4. 仿真文件(testbech)
5. 仿真图
整体仿真图
同时按下2键,设置0000,启动正计时
正计时
暂停,继续
同时按下2键,设置0102,启动倒计时
倒计时
倒计时结束报警,按下启动暂停键取消报警,同时显示前设置值
部分代码展示:
`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2019/12/15 16:40:03 // Design Name: // Module Name: easy_clock // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // // module easy_clock( input clk_100Hz,//时钟100Hz input min_BTN,//分键,按下高电平 input sec_BTN,//秒键,按下高电平 input ONOFF_BTN,//启动暂停键 output reg Alarm_on,//蜂鸣器报警 output [3:0] SMG_weixuan,//数码管位选 output reg [7:0] SMG_duanxuan//数码管段选 ); reg clk_1Hz=0;//时钟1Hz //100Hz分频到1Hz reg [7:0] div_cnt=8'd0; always@(posedge clk_100Hz) if(div_cnt>=8'd99) div_cnt<=8'd0; else div_cnt<=div_cnt+8'd1; always@(posedge clk_100Hz) if(div_cnt>=8'd49) clk_1Hz<=1; else clk_1Hz<=0; reg [2:0] current_state=state_zhengjishi; parameter state_qingling=0,//清零计时值 state_shezhi=1,//设置态 state_qidong=2,//启动 state_zhengjishi=3,//正计时 state_daojishi=4,//倒计时 state_zanting=5,//暂停 state_tingzhi=6;//停止 //计时分秒 reg [7:0] minute=8'd0; reg [7:0] second=8'd0; //前设置值 reg [7:0] minutebefore=8'd0; reg [7:0] secondbefore=8'd0; //状态机控制 always@(posedge clk_1Hz) begin case(current_state) state_qingling: current_state<=state_shezhi;//设置态 state_shezhi: if(ONOFF_BTN==1)//启动、暂停键 if(minute==6'd0 && second==6'd0)//设置值0000 current_state<=state_zhengjishi;//正计时 else current_state<=state_daojishi;//倒计时 state_daojishi: if(minute==6'd0 && second==6'd0)//计时结束 current_state<=state_tingzhi;//停止 state_zhengjishi: if(ONOFF_BTN==1)//启动暂停键 current_state<=state_zanting;//暂停计时 else if(min_BTN==1 && sec_BTN==1)//2键同时按下 current_state<=state_qingling;//清零计时值 state_zanting: if(ONOFF_BTN==1)//启动暂停键 current_state<=state_zhengjishi;//正计时 state_tingzhi: if(ONOFF_BTN==1)//启动暂停键 current_state<=state_shezhi;//设置 default: current_state<=state_qingling;//清零计时值 endcase end always@(posedge clk_1Hz) case(current_state) state_qingling:begin//清零 minute<=8'd0; second<=8'd0; end state_shezhi:begin//设置态 minutebefore<=minute;//前设置值 secondbefore<=second;//前设置值 if(min_BTN==1)//设置分 begin if(minute==8'd99) minute<=8'd0; else minute<=minute+8'd1; end if(sec_BTN==1)//设置秒 begin if(second==8'd59) second<=8'd0; else second<=second+8'd1; end end state_zhengjishi://正计时 if(minute==8'd99 && second==8'd59)begin minute<=8'd0; second<=8'd0; end else if(second==8'd59) begin
扫描文章末尾的公众号二维码
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。