[RTLLM-p049] Miscellaneous/Others/parallel2serial
4 位元平行轉序列轉換器
請設計一個名為 parallel2serial 的平行轉序列模組,將每筆 4 位元平行輸入資料 d 轉換為 1 位元序列輸出 dout。
輸出順序必須由最高位元至最低位元:
d[3] → d[2] → d[1] → d[0]
當模組載入一筆新的平行資料時,valid_out 輸出 1,表示目前的 dout 為該筆資料的最高位元 d[3]。
接下來三個時脈週期,valid_out 輸出 0,並依序輸出:
d[2]、d[1]、d[0]
每完成四個位元的序列輸出後,模組重新載入目前的平行輸入 d,開始下一輪轉換。
模組名稱
parallel2serial
輸入埠
| 埠名稱 | 位元寬度 | 說明 |
|---|---|---|
clk |
1 | 時脈訊號 |
rst_n |
1 | 低電位有效的非同步 Reset |
d |
4 | 4 位元平行輸入資料 |
輸出埠
| 埠名稱 | 位元寬度 | 說明 |
|---|---|---|
valid_out |
1 | 新一筆序列資料開始輸出的指示訊號 |
dout |
1 | 序列資料輸出 |
功能說明
Reset
當:
rst_n = 0
時,模組必須清除內部資料、計數器與有效訊號:
data = 0000
cnt = 0
valid_out = 0
dout = 0
載入平行資料
當計數器 cnt 等於 3 時,在下一個 clk 上升沿載入新的平行資料:
data <= d;
同時:
cnt <= 0;
valid <= 1;
由於 dout 連接至 data[3],載入後首先輸出最高位元 d[3]。
序列輸出
在其他時脈週期中,資料暫存器向左旋轉一個位元:
data <= {data[2:0], data[3]};
因此最高位元依序為:
原始 data[3]
原始 data[2]
原始 data[1]
原始 data[0]
同時:
valid <= 0;
輸出範例
若載入:
d = 4'b1011
則輸出時序為:
| 週期 | valid_out |
dout |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 0 | 0 |
| 3 | 0 | 1 |
| 4 | 0 | 1 |
下一個週期會重新載入目前的 d,並再次將 valid_out 設為 1。
設計要求
- 模組名稱必須為
parallel2serial。 - 輸入資料寬度為 4 位元。
- 序列輸出順序為 MSB 至 LSB。
- 載入新資料時,
valid_out輸出 1。 - 載入時首先輸出
d[3]。 - 接下來三個週期依序輸出
d[2]、d[1]、d[0]。 - 使用 2 位元計數器記錄輸出位置。
rst_n為低電位有效的非同步 Reset。- 時序邏輯必須使用 nonblocking assignment。
程式模板
module parallel2serial (
input clk,
input rst_n,
input [3:0] d,
output valid_out,
output dout
);
// Write your code here
endmodule
評論