FPGA设计时间基准电路和带使能的多周期计数器

FPGA设计时间基准电路和带使能的多周期计数器

这里写图片描述

• 设计时间基准电路和带使能的多周期计数器
• 时间基准电路生成同步时间基准信号
• 多周期计数器对时间基准信号进行计数
• 本质上是一个两级计数器级联的的电路结构
——>第一级计数器生成时间基准信号
——>第二级计数器用时间基准信号作为计数使能

整个设计的原理图

这里写图片描述

前面对系统时钟50Mhz进行分频的时间基准电路,其实就是一个计数器。后面为一个带使能端的多周期计数器,通过开发板的LED灯验证。

RTL电路

这里写图片描述

七段数码管器件例化代码

module key_smg(count, smg1 );
    input count ;
    output smg1 ;

    reg[3:0] count;
    reg[7:0] smg1 ;
    /************************************
    共阴极数码管
    0xc0,0xf9,0xa4,0xb0,
    0x99,0x92,0x82,0xf8,
    0x80,0x90,0x88,0x83,
    0xc6,0xa1,0x86,0x8e 
    ************************************/
    always@( count )
        begin
            //个位显示
            case( count )
                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 ;
                4'ha : smg1 = 8'h88 ;
                4'hb : smg1 = 8'h83 ;
                4'hc : smg1 = 8'hc6 ;
                4'hd : smg1 = 8'ha1 ;
                4'he : smg1 = 8'h86 ;
                4'hf : smg1 = 8'h8e ;
            endcase
endmodule

实验一:把计数器的0-15计数值经过译码,在DE0的HEX LED上显示成0-9-A-F的十六 进制数

这里写图片描述

实验二:修改时间基准发生器,设计一个使用2个HEXLED,精度为0.1秒,范围为0-9.9秒的计时秒表。并可以通过两个按键对秒表及时进行控制。

module key_smg(clk, key, smg1, smg2 );
    input clk, key;
    output smg1, smg2 ;
    //可变分频
,(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;
    reg[7:0] smg1, smg2 ;

    //分频
    always@(posedge clk )
    begin
        if( TIM == timer )
            begin
                TIM <= 0;
                div_clk <= ~div_clk;
            end 
        else 
            TIM <= TIM + 1'b1;
    end 
    //消抖
    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
    //数码管显示 
    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
endmodule

   程序中对系统时钟50MHz进行5M分频,得到0.1s的计时所用时钟,通过按键输入进行对计时值count的控制,数码管实时显示当前状态的计时值。

猜你喜欢

转载自blog.csdn.net/sinat_29862967/article/details/78714198
今日推荐