Verilog改变变量的值

时间:2013-04-02 18:53:52

标签: verilog fpga

我正在实施一个简单的计数器,它计算按下按钮的时间。我写了以下代码:

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

1 个答案:

答案 0 :(得分:1)

您希望在敏感列表中缺少组合总是阻止的一些信号。

为使您的代码可以正确合成,组合块必须对每个输入信号敏感。

第一个始终屏蔽always @(curbtns)需要对prevbtnscurbtnscounter敏感。

第二个块always @(btns or sw)也需要对prevbtns敏感(我看不到这个块中使用的sw,应该去掉它。)

我建议将两个块都更改为always @*,以便可以自动推断列表,如果更改逻辑并忘记更改列表,则不会破坏脆弱点。