[RTLLM-p050] Miscellaneous/Others/serial2parallel
8 位元序列轉平行轉換器
請設計一個名為 serial2parallel 的序列轉平行資料轉換模組。
模組在每個 clk 上升沿檢查輸入有效訊號 din_valid。當 din_valid = 1 時,接收一位序列資料 din_serial。
每收到 8 位有效的序列資料後,模組將其組合為一筆 8 位元平行資料,並透過 dout_parallel 輸出。序列資料依照輸入順序,由最高位元至最低位元排列。
例如,依序收到:
1, 1, 1, 1, 0, 0, 0, 0
則輸出為:
dout_parallel = 8'b11110000
在第 8 位有效資料被接收時,dout_valid 必須輸出 1,表示 dout_parallel 已包含一筆完整資料。其他週期中,dout_valid 必須為 0。
模組名稱
serial2parallel
輸入埠
| 埠名稱 | 位元寬度 | 說明 |
|---|---|---|
clk |
1 | 時脈訊號 |
rst_n |
1 | 低電位有效的 Reset |
din_serial |
1 | 序列輸入資料 |
din_valid |
1 | 序列輸入資料有效訊號 |
輸出埠
| 埠名稱 | 位元寬度 | 說明 |
|---|---|---|
dout_parallel |
8 | 8 位元平行輸出資料 |
dout_valid |
1 | 平行輸出資料有效訊號 |
功能說明
Reset
當:
rst_n = 0
時,內部移位暫存器、計數器與輸出皆清除為 0。
接收序列資料
當:
din_valid = 1
時,在 clk 上升沿接收 din_serial,並將其加入移位暫存器:
data_shift <= {data_shift[6:0], din_serial};
第一個收到的資料最後會位於 dout_parallel[7],第八個收到的資料會位於 dout_parallel[0]。
無效輸入
當:
din_valid = 0
時:
- 不接收
din_serial - 計數器保持不變
- 已接收的資料保持不變
dout_valid輸出 0
完成一筆資料
當第 8 位有效資料到達時:
dout_parallel <= {data_shift[6:0], din_serial};
dout_valid <= 1'b1;
完成輸出後,計數器重新歸零,開始接收下一筆 8 位元資料。
設計要求
- 模組名稱必須為
serial2parallel。 - 只在
din_valid = 1時接收輸入資料。 - 每 8 位有效輸入組成一筆平行輸出。
- 第一個輸入位元放在
dout_parallel[7]。 - 最後一個輸入位元放在
dout_parallel[0]。 - 收到第 8 位資料時,
dout_valid輸出 1。 dout_valid只維持一個時脈週期。din_valid = 0時不得增加接收計數。rst_n為低電位有效 Reset。- 時序邏輯使用 nonblocking assignment。
程式模板
module serial2parallel (
input clk,
input rst_n,
input din_serial,
input din_valid,
output reg [7:0] dout_parallel,
output reg dout_valid
);
// Write your code here
endmodule
評論