我正在实施一个简单的计数器,它计算按下按钮的时间。我写了以下代码:
module lock(
anodes,cathodes,leds,
sw,btns,clk );
//input declarations
input[7:0] sw;
input[3:0]btns;
input clk;
always @(curbtns)
begin
if( prevbtns!=0 && curbtns==0)
begin
counter_next = counter + 5'b00001;
end
else
counter_next = counter;
prevbtns = curbtns;
end
always @(btns or sw)
begin
case(btns)
4'b0001:curbtns=4'b0001;
4'b0010:curbtns=4'b0010;
4'b0100:curbtns=4'b0100;
4'b1000:curbtns=4'b1000;
4'b0000:curbtns=4'b0000;
default:curbtns = prevbtns;
endcase
end
always @(posedge clk)
begin
counter <=counter_next;
create_slow_clock(clk,slow_clock);
end
endmodule
当我在icraus verilog中模拟上面的代码时,它似乎正在工作,但在实际的FPGA上我的计数器没有改变。增量变量的逻辑是否存在任何问题。
更新的代码(工作)
always @(curbtns or prevbtns or counter)
begin
if( prevbtns!=0 && curbtns==0)
begin
counter_next = counter + 5'b00001;
end
else
counter_next = counter;
end
always @(posedge clk)
begin
counter <=counter_next;
prevbtns <=curbtns;
create_slow_clock(clk,slow_clock);
end
答案 0 :(得分:1)
您希望在敏感列表中缺少组合总是阻止的一些信号。
为使您的代码可以正确合成,组合块必须对每个输入信号敏感。
第一个始终屏蔽always @(curbtns)
需要对prevbtns
,curbtns
和counter
敏感。
第二个块always @(btns or sw)
也需要对prevbtns
敏感(我看不到这个块中使用的sw
,应该去掉它。)
我建议将两个块都更改为always @*
,以便可以自动推断列表,如果更改逻辑并忘记更改列表,则不会破坏脆弱点。