[RTLLM-p022] Memory/shifter/right_shifter
8 位元右移暫存器
題目說明
請設計一個名為 right_shifter 的 8 位元右移暫存器。
模組具有一個 1 位元序列輸入 d。在每一次 clk 上升沿,暫存器 q 的內容向右移動一個位元,並將新的輸入位元 d 放入最高位元 q[7]。
初始狀態下,暫存器 q 必須設定為:
00000000
每次時脈上升沿的操作為:
q[7] ← d
q[6] ← q[7]
q[5] ← q[6]
q[4] ← q[5]
q[3] ← q[4]
q[2] ← q[3]
q[1] ← q[2]
q[0] ← q[1]
等價的向量表示方式為:
q ← {d, q[7:1]}
模組介面
| 埠 | 方向 | 位元寬度 | 說明 |
|---|---|---|---|
clk |
input | 1 | 時脈訊號 |
d |
input | 1 | 每個時脈週期移入的序列資料 |
q |
output reg | 8 | 右移暫存器目前的內容 |
運作範例
假設初始狀態為:
q = 00000000
依序輸入以下位元:
1, 0, 1, 0, 1, 1, 1
則每次時脈上升沿後的結果為:
輸入 1:10000000
輸入 0:01000000
輸入 1:10100000
輸入 0:01010000
輸入 1:10101000
輸入 1:11010100
輸入 1:11101010
最後:
q = 11101010
初始化要求
本題沒有 Reset 輸入,因此必須使用 initial 區塊將 q 初始化為零:
initial begin
q = 8'b00000000;
end
設計要求
- 模組名稱必須為
right_shifter。 q必須宣告為 8 位元暫存器。- 使用
initial將q初始化為零。 - 在每個
clk上升沿執行右移。 - 將輸入
d放入q[7]。 - 原本的
q[0]在右移後被捨棄。 - 必須使用時序邏輯與 nonblocking assignment。
程式設計模板
module right_shifter (
input clk,
input d,
output reg [7:0] q
);
// Write your code here
endmodule
評論