シフトレジスタ
CoddyのVerilogジャーニー「基礎」セクションの一部。レッスン 86/90。
チャレンジ
シフトレジスタは、各クロックエッジでデータを左から右へシフトします。各ビットは次の位置へ移動します。
4ビットシフトレジスタの動作
Initial: q0=0, q1=0, q2=0, q3=0
Each clock: q0 = d, q1 = old q0, q2 = old q1, q3 = old q2
Shifting in d = 1, 0, 1, 0:
Clock 1 (d=1): q0=1, q1=0, q2=0, q3=0
Clock 2 (d=0): q0=0, q1=1, q2=0, q3=0
Clock 3 (d=1): q0=1, q1=0, q2=1, q3=0
Clock 4 (d=0): q0=0, q1=1, q2=0, q3=14クロックサイクル後、最初の入力ビットはq3に到達します。
モジュールインターフェース
| ポート | 方向 | 幅 | 説明 |
|---|---|---|---|
clk | 入力 | 1ビット | クロック信号 |
reset | 入力 | 1ビット | すべての出力を0にリセット |
d | 入力 | 1ビット | データ入力 |
q0 | 出力 | 1ビット | 1番目のフリップフロップの出力 |
q1 | 出力 | 1ビット | 2番目のフリップフロップの出力 |
q2 | 出力 | 1ビット | 3番目のフリップフロップの出力 |
q3 | 出力 | 1ビット | 4番目のフリップフロップの出力 |
あなたの課題は、以下のモジュールを完成させることです。
実行すること:
reset時に、すべての出力を0に設定する- 各立ち上がりクロックエッジで、データを左から右へシフトする:
q0にdを格納するq1に古いq0を格納するq2に古いq1を格納するq3に古いq2を格納する
自分で試してみよう
module shift_register (
input clk,
input reset,
input d,
output reg q0,
output reg q1,
output reg q2,
output reg q3
);
// TODO: always @(posedge clk or posedge reset) を追加
// リセット時: q0<=0, q1<=0, q2<=0, q3<=0
// それ以外: データをシフト: q0 <= d, q1 <= q0, q2 <= q1, q3 <= q2
endmodule
基礎のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ