FPGA的计数器设计

       FPGA设计中的所有有关时间的内容都要通过计数器来实现,计时的本质是对时钟周期计数,以时钟周期为基准,通过计数多少个时钟周期来确定时间。

       计数器设计规则:

       规则1:三要素——初值、加1条件、结束值。

       规则2:计数器初值为0。

       规则3:使用计数器的结束值时,要满足加1条件。

       规则4:结束条件必须同时满足加1条件,结束值是x-1的形式。

       规则5:当取某个数时,assign形式必须为:(加1条件)&&(cnt==计数值-1)。

       规则6:结束后回到0。

       规则7:若需要限定范围,使用“>=” 、 “<”两种符号。

       规则8:设计步骤——先写计数器的always段,条件用名字代替;然后用assign写出加1条件;最后用assign写出结束条件。

       规则9:命名要符合规范。

       计数器设计实例:实现1ms与10ms计数

module temp( clk , rst_n );

input clk;          //50MHz时钟信号
input rst_n;        //复位信号

//----------------------------------------------------

reg [15:0] cnt_1ms; //1ms计数寄存器 16位最高计数65536
wire add_cnt_1ms;   //加1条件
wire end_cnt_1ms;   //计数器结束条件

always @( posedge clk or negedge rst_n ) begin
    if( !rst_n )
        cnt_1ms <= 16'd0;       //计数器初值
    if( add_cnt_1ms ) begin     //满足加1条件
        if( end_cnt_1ms )
            cnt_1ms <= 16'd0; 
        else
            cnt_1ms <= cnt_1ms + 1'b1; 
    end
end

assign add_cnt_1ms = 1'b1;
assign end_cnt_1ms = add_cnt_1ms && ( cnt_1ms == 50000-1 )  //计数值50000

//-----------------

reg [3:0] cnt_10ms;    //10ms计数寄存器
wire add_cnt_10ms;     //加1条件
wire end_cnt_10ms;     //计数器结束条件

always @( posedge clk or negedge rst_n ) begin
    if( !rst_n )
        cnt_10ms <= 4'd0;
    else if( add_cnt_10ms ) begin
        if( end_cnt_10ms )
            cnt_10ms <= 4'd0;
        else
            cnt_10ms <= cnt_10ms + 1'b1; 
    end
end

assign add_cnt_10ms = end_cnt_1ms;   //1ms计满10ms计数
assign end_cnt_10ms = add_cnt_10ms && ( cnt_10ms == 10-1 );  //10ms计满end_cnt_10ms置1

//----------------------------------------------------

endmodule

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值