《FPGA全程进阶---实战演练》第九章 计数器要注意

本文探讨了使用Verilog语言实现计数器的方法,并通过四个示例详细分析了不同的计数逻辑及其仿真结果,帮助读者深入理解触发器工作原理及精确控时技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  本小节我们来做一个好玩的事情,就是计数器,还记得在做LED自加实验时我们就曾经提到过关于计数器的相关议题,那么这节我们就来讨论讨论。

  探讨一下如下的问题:请用verilog记八个数的写法,分析这个可以更好的理解触发器的工作原理。

 

1.
    reg [3:0]cnt;
    always@(posedge clk or negedge rst_n) begin
        if(!rst_n)
            cnt <= 4'd0;
        else if (cnt < 4'd8)
            cnt <= cnt + 1'b1;
        else
            cnt <= 4'd0;
    end
2.
    reg [3:0]cnt;
    always@(posedge clk or negedge rst_n) begin
        if(!rst_n)
            cnt <= 4'd0;
        else if (cnt < 4'd8 - 1)
            cnt <= cnt + 1'b1;
        else
            cnt <= 4'd0;
    end
3.
        reg [3:0]cnt;
    always@(posedge clk or negedge rst_n) begin
        if(!rst_n)
            cnt <= 4'd1;
        else if (cnt < 4'd8 )
            cnt <= cnt + 1'b1;
        else
            cnt <= 4'd1;
    end

4.
        reg [3:0]cnt;
    always@(posedge clk or negedge rst_n) begin
        if(!rst_n)
            cnt <= 4'd1;
        else if (cnt < 4'd7 )
            cnt <= cnt + 1'b1;
        else
            cnt <= 4'd1;
    end

 

  对应的仿真结果为:

1.计数为9个。

wps7D57.tmp

2.计数为8个

wps7D77.tmp

3.计数为8个

wps7D88.tmp

4.计数为7个

wps7D89.tmp

  在else if语句中的判断条件为 cnt < 4’d7或者cnt  <4’d8,以cnt < 4’d7为例,当cnt =4’d7显然是不满足条件的,所以利用跳出自加程序,执行else语句,但是cnt = 4’d7也会被打印输出,这是由于时序电路在时钟的节奏下一拍一拍的输出,当时钟上升沿来临时,这时cnt = 4’d7,然后等待下一个时钟沿到来把cnt = 4’d7打入到锁存器里面去,然后再在下一个时钟沿来临将cnt = 4’d0打入。以此类推。

  针对上述的四种情况,大家在写一些利用计数器进行分频的程序时,若是精确控时,请注意cnt小于的常数是多少,这一点务必搞清楚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值