我正在Nexys4 FPGA上编写一个秒表程序。我可以启动,停止和重置秒表,但是我在实现增量功能时遇到了麻烦。增量功能是一个按钮,按下时,将时钟增加1毫秒。因此,如果七段显示显示1:002并且按下增量按钮,则显示屏将显示1:003。这是我的柜台代码片段:
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停止。我无法弄清楚如何让它增加一点。每当我点击增量时,就会永远计算。有什么想法吗?
由于
答案 0 :(得分:0)
如果没有状态机代码,我只能猜测问题。您还需要发布状态机代码以符合猜测。
但是,计数器继续增加的最可能原因是Cen也很高(2&#39; b01)而状态是2&#b;。
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)在增量部分(状态= 2&#39; b11),您仍然需要检查并递增所有4位数(Dig0-3),因为递增Dig0(超过9次)将导致翻转到下一个数字等等。
2)最好在单个always块中更新状态机变量。所以最好将语句state = 2'b0
移到状态机中。
3)同样如评论中已经建议的那样,您可以使用单个计数器并对数字进行解码。