当前位置:   article > 正文

基于FPGA的简易计时闹钟设计Verilog代码VIVADO仿真_基于fpga的闹钟系统的设计

基于fpga的闹钟系统的设计

名称:基于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
源代码

 扫描文章末尾的公众号二维码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/796603
推荐阅读
相关标签
  

闽ICP备14008679号