1

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

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
4

1 回答 1

1

您看起来在组合 always 块的敏感度列表中缺少一些信号。

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

第一个 always 块always @(curbtns)需要对prevbtnscurbtns和敏感counter

第二块always @(btns or sw)也需要敏感prevbtns(反正我没看到sw用在这个块中,应该去掉它)。

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

于 2013-04-02T19:00:23.430 回答