FPGA基础实验:秒表(计时器)

来源:互联网 发布:淘宝如何网购 编辑:程序博客网 时间:2024/05/19 23:15

FPGA基础实验:秒表(计时器)

本实验是通过时间基准、带使能计数器、两个8段数码管,三个电路模块进行设计。

时间基准点路和带使能的计数器在上一个实验已经介绍过了。这里我们主要介绍按键输入的控制电路设计,以及两个数码管显示。

首先我们看简单的:两个数码管显示

reg[7:0] count;   //为计时值    //数码管显示     always@( count )        begin            //个位显示            case( count%10 )                4'h0 : smg1 = 8'hc0 ;                4'h1 : smg1 = 8'hf9 ;                4'h2 : smg1 = 8'ha4 ;                4'h3 : smg1 = 8'hb0 ;                4'h4 : smg1 = 8'h99 ;                4'h5 : smg1 = 8'h92 ;                4'h6 : smg1 = 8'h82 ;                4'h7 : smg1 = 8'hf8 ;                4'h8 : smg1 = 8'h80 ;                4'h9 : smg1 = 8'h90 ;            endcase            //十位显示            case( count/10)                4'h0 : smg2 = 8'h40 ;                4'h1 : smg2 = 8'h49 ;                4'h2 : smg2 = 8'h24 ;                4'h3 : smg2 = 8'h30 ;                4'h4 : smg2 = 8'h19 ;                4'h5 : smg2 = 8'h12 ;                4'h6 : smg2 = 8'h02 ;                4'h7 : smg2 = 8'h78 ;                4'h8 : smg2 = 8'h00 ;                4'h9 : smg2 = 8'h10 ;            endcase        end

可以看到,十位和个位的十六进制显示编码不一样,这里我们设计的是0–9.9s计时器,所以考虑到十位上小数点的存在,把所谓的“七段数码管(没有小数点)”变成了八段数码管。

按键输入是本设计的重点,而且这里还涉及到一个必须考虑的问题:按键消抖,我们先看程序一步一步分析:

    input  key;     //定义按键输入    input  clk;   //系统时钟50MHz    //定义分频参数(5M=0.1s)    parameter timer = 5000_000;    //分频时钟,开始/停止标识    reg div_clk, st_flag ;    wire[1:0] key;    reg[1:0] keyin;   //缓存按键值,消抖时用    reg[22:0] TIM;    //计数分频    reg[8:0] count;   //计时值    //时钟分频,0.1s    always@(posedge clk )    begin        if( TIM == timer )            begin                TIM <= 0;                div_clk <= ~div_clk;            end         else             TIM <= TIM + 1'b1;    end     //按键消抖,通过TIM的计数,大约20ms    always@(posedge TIM[20] )    begin        keyin <= key ;    end     //key[0]开始停止标识,  key[1]实现复位功能    always@(negedge keyin[0] )     //都为低电平有效    begin        st_flag <= ~st_flag ;        //开始暂停标志位    end     //按键输入控制计时功能    always@( posedge div_clk )    begin        if( !keyin[1] && !st_flag  )                count <= 0;        else if( !st_flag )                count <= count;        else if( count==100 )                count <= 0;            count <= count + 1'b1;    end

通过按键的控制(key0为开始暂停键、key1为复位键),可以实现零到9.9秒的计时。设计的关键是按键消抖以及按键值对应的标志位设计。