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

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秒的计时。设计的关键是按键消抖以及按键值对应的标志位设计。

猜你喜欢

转载自blog.csdn.net/sinat_29862967/article/details/78754950