Altifigence Academy

29 / 63 · 概念

状態数・カウンタ幅・未使用コード

カウント範囲から記憶ビット数を求め、不正な状態からの回復方針を定義します。

数を数える回路も状態機械です

0~9 を繰り返すカウンタには 10 状態が必要で、最小の記憶幅は ⌈log⁡210⌉=4\lceil\log_2 10\rceil=4 ビットです。ただし 4 ビットレジスタレジスタ 複数ビットの状態を記憶する回路です。このコースの同期式レジスタは、クロックエッジで定められた入力を記憶します。 詳しく見るには 16 パターンあるので、幅を合わせるだけでは modulo-10 の機能は完成しません。

N=⌈log⁡2M⌉,unused codes=2N−MN=\left\lceil\log_2 M\right\rceil,\qquad \text{unused codes}=2^N-M

M は最大値ではなく状態数です。0 から M-1 まで数えることと、M まで数えることは異なります。M=1 をパラメータとして許すなら、記憶幅を最小 1 ビットにし、常に 0 を保つようにします。

4 ビットの記憶には 16 コードありますが、modulo-10 が正常状態として使うのは 10 個です。幅を決めた後、比較・回復の方針も加える必要があります。

記憶幅と循環条件は別々に設計
  1. 10 状態: 正常な count は 0~9
  2. 4 ビット記憶: 16 コードのうち 10~15 は未使用
  3. 次状態: en=1 かつ count≥9 なら 0

範囲外の状態も設計の一部です

4 ビット modulo-10 カウンタが何らかの理由で 12 になったら、次はどうしますか。「発生しない」と仮定できる初期化・リセットリセット 状態を仕様で定めた初期値に戻す制御です。同期式か非同期式か、他の制御より優先されるかを合わせて定めます。 詳しく見る条件を示すか、9 以上なら 0 に戻す方針を設けます。回復機能がすべてのハードウェア故障への耐性を保証するわけではありません。

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

この例は不正値 10~15 も、en=1 のエッジで回復します。enable が 0 ならその値も保持するため、即時回復が必要な仕様では条件の優先順位を変えます。

幅の確認と機能の確認は別です

0~999 は 10 ビットで十分ですが、自由に増加させると 1023 まで進みます。仕様の最大状態で 0 に戻す比較・選択回路が必要です。メモリアドレス・繰返し回数・パケット長のカウンタでは、この違いが不正アクセスや長さの誤りにつながります。

自分で考えてみましょう

0~99 を繰り返すカウンタの最小幅と未使用コード数を求めてください。その幅で単に +1 するだけだと何が変わりますか。

解説を見る

100 状態なので 7 ビットで、未使用コードは 128−100=28128-100=28 個です。単純な増加回路は 99 で戻らず 127 まで進むので、modulo-100 ではなく modulo-128 になります。

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