【问题标题】:How to increment 4 bit counter by 1 bit when a button is pressed按下按钮时如何将 4 位计数器增加 1 位
【发布时间】:2017-01-20 17:05:35
【问题描述】:

我正在 Nexys4 FPGA 上编写秒表程序。我可以启动、停止和重置秒表,但在实现增量功能时遇到了问题。增量功能是一个按钮,当按下该按钮时,时钟将增加 1 毫秒。因此,如果七段显示器显示 1:002,按下增量按钮,显示器将显示 1:003。这是我的计数器代码的 sn-p:

always @ (posedge (clk), posedge(rst))
begin 


if (rst == 1'b1)begin
        Dig0 <= 4'b0000;
        Dig1 <= 4'b0000;
        Dig2 <= 4'b0000;
        Dig3 <= 4'b0000;
    end 

//increment if inc
else if(state == 2'b11)// && Dig3 < 4'b1001)begin
begin
    Dig0 <= Dig0 + 4'b0001;
    state <= 2'b00;
end


//only continue if Cen is 01 & not inc
else if(Cen == 2'b01)begin  

    //add 1 to first digit up till 9
    Dig0 <= Dig0 + 1'b1;

    //reset if == 10    
        if(Dig0 > 4'b1001)begin
            Dig0 <= 4'b0000;

            //add 1 to second digit (when first resets) up till 9
            Dig1 <= Dig1 + 1'b1;
            end
            //reset if == 10
            if(Dig1 == 4'b1010)begin
                Dig1 <= 4'b0000;

                //add 1 to third digit (when second reset) up till 9
                Dig2 <= Dig2 + 1'b1;
                end
                //reset if == 10
                if(Dig2 == 4'b1010)begin
                    Dig2 <= 4'b0000;

                    //add 1 to fourth digit (when third reset) up till 9
                    Dig3 <= Dig3 + 1'b1;
                    end
                    //reset if == 10
                    if(Dig3 > 4'b1001)begin
                        Dig3 <= 4'b0000;

                    end         
    end 

Cen 来自一个状态机,其中状态 2'b11 是递增,2'b01 是计数,2'b00 是停止。我不知道如何让它只增加一点。每当我点击增量时,就会永远计数。有什么想法吗?

谢谢

【问题讨论】:

  • 拥有 1 个计数器并将其解码为显示数字不是更容易吗?整理代码缩进也会更容易阅读和发现错误。
  • 正如摩根所说,修复你的缩进。

标签: verilog counter


【解决方案1】:

如果没有状态机代码,我只能对问题进行猜测。您还需要发布状态机代码以符合猜测。

但计数器继续递增的最可能原因是 Cen 也很高 (2'b01) 而 state 为 2'b11。

Cycle 1 ) - state == 2'b11 , Cen == 2'b01 
            Dig0 +1 , state = 0 

Cycle 2 )  - state = 0 , Cen == 2'b01 
              goes to else clause and the counter continues to increment 
              as long as Cen is 2'b01

您可能还需要解决一些问题。

1) 在增量部分 (state = 2'b11 ) 您仍然需要检查并递增所有 4 位数 ( Dig0-3 ) 因为递增 Dig0 ( 超过 9 次 ) 将导致翻转到下一个数字等等。

2) 最好在单个始终块中更新状态机变量。所以最好将语句state = 2'b0 移动到状态机中。

3) 同样,正如 cmets 中已经建议的那样,您可以有一个计数器并将其解码为数字。

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2015-04-25
    • 2020-01-23
    • 1970-01-01
    相关资源
    最近更新 更多