あなたの質問の例には、次のようなわずかな間違いがあります。
always @ (posedge clk or negedge reset) begin
if (~reset) begin //<-- Reset when rest low
//Initialize the signals
end
else begin
//do something
end
end
信号が低くなるとトリガーされるnegedge reset
ため、リセット条件を一致させる必要があります。これはアクティブ LOW リセットです。アクティブ ハイ リセット (次の場合にリセットreset == 1
) の場合:
always @ (posedge clk or posedge reset) begin //<--Posedge trigger reset
if (reset) begin //<-- Reset when rest high
//Initialize the signals
end
else begin
//do something
end
end
リセット条件は 0 である必要はありません。何でもかまいませんが、既知の静的な値でなければなりません。つまり、NOTnext_state
などa+b
です。フリップフロップのリセット ピンに接続されているため、名前をリセットしておきます。
ASIC では、電力が供給されていないときにリセット状態になるため、アクティブ LOW リセットが推奨されます。チップの起動時に、クロックのポーズエッジでリセットを同期的にリリースすることがよくあります。多くの場合、最低 2 つの posges が必要です。これにより、短時間のリセット グリッチが回避されます。
チップの電源投入時にアクティブ ロー リセットを適用する必要があるため、電源投入時にすべてが既知の状態になるため、非同期リセットを使用します。同期リセットでは、最初の状態がどうなるかわかりません。同期リセットは、多くの場合、データをクリアする必要があるステート マシンとフィルターによって使用されます。非同期リセットは、既知の値を設定するためのパワーオン リセット (POR) に使用されます。
このif (reset) else
構造は、合成ツールがそれを非同期リセット付きのフリップフロップとして認識できるようにするために使用されます。別の構造を試してみると、うまくシミュレートでき、(誤って) 合成することさえできますが、シミュレーションの作成では表示されないハードウェアのバグが簡単に発生する可能性があります。デバッグは非常に困難です。
セットリセット フリップフロップ (SR Flip-Flop)について読むことに興味があるかもしれません。トグル機能のないただのJK。
以下を使用して暗示することができます。
always @ (posedge clk or negedge reset or posedge set) begin
if (~reset) begin
//reset the signals
end
else if (set) begin
//set the signals
end
else begin
//do something
end
end