16 / 37 · 概念
モジュロ・飽和カウンタと終了パルス
最大値の扱いと terminal-count 信号の正確なサイクルを設計します。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
範囲超過には三つの異なる方針があります
同じ N ビットレジスタレジスタ 複数ビットの状態を記憶する回路です。このコースの同期式レジスタは、クロックエッジで定められた入力を記憶します。 詳しく見るでも、最大値で循環するか、最大値を保つか、エラーを報告するかは仕様で定めます。
8 ビットで 255 の次が 0 のモジュロカウンタと、255 を保つ飽和カウンタは別の機能です。負と正の両方が必要な累算器では、signed の範囲と両端の飽和境界も考えます。
下の各列は一つの立上りエッジ立上りエッジ クロックが 0 から 1 に変わる瞬間です。CLK=1 の区間全体を指すレベルとは区別します。 詳しく見るの記録です。入力はエッジ直前、「更新後」の状態は更新直後です。列の並びはサンプル順で、物理的な伝搬遅延伝搬遅延 入力が変わってから、出力が正しい値に安定するまでの時間です。論理式の等価性と時間特性は別の性質です。 詳しく見るではありません。初期 count=8、reset=0、enable=1 です。同じ入力でも modulo-10・4 ビット循環・4 ビット飽和は異なる軌跡になります。
波形データを表示
| 信号 | 波形 | バスの値 |
|---|---|---|
| エッジ | 234523452 | E0 → E1 → E2 → E3 → E4 → E5 → E6 → E7 → E8 |
| 更新後 mod10 | 234523452 | 9 → 0 → 1 → 2 → 3 → 4 → 5 → 6 → 7 |
| 更新後 wrap4 | 234523452 | 9 → 10 → 11 → 12 → 13 → 14 → 15 → 0 → 1 |
| 更新後 sat4 | 2345234.. | 9 → 10 → 11 → 12 → 13 → 14 → 15 |
modulo-M の最後の状態と比較する
有効な 10 エッジごとにパルスを出すなら、状態 0~9 を使い、enable のある有効エッジだけ数えます。pulse を「このエッジで 9 を消費し 0 に戻った」という意味でレジスタ化できます。
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
endpulse にデフォルト代入があるので、次のエッジで 0 に戻ります。単に count==9 を出力すると、enable=0 で停止した際に数サイクル 1 のままになることがあります。終了状態と完了イベントを区別します。
周期を数える基準
リセット後の count=0 から、enable=1 のエッジを 10 回通ると最初の pulse が出ます。最初を 0 番と呼ぶか 1 番と呼ぶかより、入力・状態・出力表の定義を一貫させることが重要です。
下の実習は modulo-16 です。初期 1110 から一エッジ進むと 1111、次で 0000 です。1111 で enable=0 にして停止してください。保持と飽和は同じ値に見えても、再開時の動作は異なります。飽和カウンタなら同条件で何になるべきか比較してください。
同期 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 に戻ります。