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

名称:基于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//启动暂停键

  

源代码

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值