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 @(curbtns)に敏感である必要があります。prevbtnscurbtnscounter

2番目のブロックalways @(btns or sw)も敏感である必要があります(とにかく、このブロックで使用されているprevbtnsとは思わないので、削除する必要があります)。sw

リストが自動的に推論されるように、両方のブロックを に変更することをお勧めしalways @*ます。これは、ロジックを変更してリストを変更するのを忘れた場合に壊れやすいポイントではありません。

于 2013-04-02T19:00:23.430 に答える