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

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

软件:VIVADO

语言:Verilog

代码功能:

简易计时闹钟:有四位数码管,前两位计分钟表示00~99分钟,后面两位记秒,值为00~59秒。有三个按键,第一个是分键,第二个是秒键,第三个是启动/暂停键。功能:分秒两键同时按下清零且停止计时,外于设置态,按一次分键分钟加1,99增1变为0;按一次秒键秒增159增1变为0。此状态下按启动/暂停键开始计时,设置值为0000则为正计时,设置值为非零值则为倒计时。正计时时,按启动暂停键会暂停计时,再按启动/暂停键则会继续计时。倒计时时,减到零时停止减数且发出警示蜂鸣声,直到启动/暂停键被按下时进入设置态且同时显示前设置值和停止发出蜂鸣声。


FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com


演示视频:

设计文档:

设计文档.doc

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//启动暂停键

  

代码文件(付费下载):



1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 基于FPGA的简易计时闹钟设计Verilog代码VIVADO仿真

注册为本站会员,充值100得150,详情咨询客服

目前为止共有 *** 位优秀的会员加入! 立刻加入会员