Altifigence Academy

16 / 37 · 概念

モジュロ・飽和カウンタと終了パルス

最大値の扱いと terminal-count 信号の正確なサイクルを設計します。

範囲超過には三つの異なる方針があります

同じ N ビットレジスタレジスタ 複数ビットの状態を記憶する回路です。このコースの同期式レジスタは、クロックエッジで定められた入力を記憶します。 詳しく見るでも、最大値で循環するか、最大値を保つか、エラーを報告するかは仕様で定めます。

Cnextwrap=(C+1) mod 2NC_{next}^{wrap}=(C+1)\bmod2^N
Cnextsat=min⁡(C+1,2N−1)C_{next}^{sat}=\min(C+1,2^N-1)

8 ビットで 255 の次が 0 のモジュロカウンタと、255 を保つ飽和カウンタは別の機能です。負と正の両方が必要な累算器では、signed の範囲と両端の飽和境界も考えます。

下の各列は一つの立上りエッジ立上りエッジ クロックが 0 から 1 に変わる瞬間です。CLK=1 の区間全体を指すレベルとは区別します。 詳しく見るの記録です。入力はエッジ直前、「更新後」の状態は更新直後です。列の並びはサンプル順で、物理的な伝搬遅延伝搬遅延 入力が変わってから、出力が正しい値に安定するまでの時間です。論理式の等価性と時間特性は別の性質です。 詳しく見るではありません。初期 count=8、reset=0、enable=1 です。同じ入力でも modulo-10・4 ビット循環・4 ビット飽和は異なる軌跡になります。

最大値の後の三つの方針
波形データを表示
波形データ:各文字は一つの区間、ドットは前の状態の保持、p はクロック 1 周期を表します。
信号波形バスの値
エッジ234523452E0 → E1 → E2 → E3 → E4 → E5 → E6 → E7 → E8
更新後 mod102345234529 → 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7
更新後 wrap42345234529 → 10 → 11 → 12 → 13 → 14 → 15 → 0 → 1
更新後 sat42345234..9 → 10 → 11 → 12 → 13 → 14 → 15

modulo-M の最後の状態と比較する

有効な 10 エッジごとにパルスを出すなら、状態 0~9 を使い、enable のある有効エッジだけ数えます。pulse を「このエッジで 9 を消費し 0 に戻った」という意味でレジスタ化できます。

SystemVerilog
always_ff @(posedge clk) begin
  if (rst) begin
    count <= 4'd0;
    pulse <= 1'b0;
  end else begin
    pulse <= 1'b0;
    if (en) begin
      if (count == 4'd9) begin
        count <= 4'd0;
        pulse <= 1'b1;
      end else count <= count + 4'd1;
    end
  end
end

pulse にデフォルト代入があるので、次のエッジで 0 に戻ります。単に count==9 を出力すると、enable=0 で停止した際に数サイクル 1 のままになることがあります。終了状態と完了イベントを区別します。

周期を数える基準

リセット後の count=0 から、enable=1 のエッジを 10 回通ると最初の pulse が出ます。最初を 0 番と呼ぶか 1 番と呼ぶかより、入力・状態・出力表の定義を一貫させることが重要です。

下の実習は modulo-16 です。初期 1110 から一エッジ進むと 1111、次で 0000 です。1111 で enable=0 にして停止してください。保持と飽和は同じ値に見えても、再開時の動作は異なります。飽和カウンタなら同条件で何になるべきか比較してください。

4 ビット最大値で停止または循環

同期 reset は enable より優先されます。enable=0 なら保持中の値を維持します。 q=1110; q_next = (q + 1) mod 16

自分で考えてみましょう

上の回路が count=9、pulse=0 のとき、en=0 のエッジを二回、en=1 のエッジを一回通ると count と pulse はどうなりますか。

解説を見る

停止した二エッジでは count=9、pulse=0 を保持します。三つ目で count=0、pulse=1 になります。その次のエッジではデフォルト代入により pulse=0 に戻ります。

選択はこのブラウザに適用されます。フッターからいつでも変更できます。