[RTLLM-p045] Miscellaneous/Others/width_8to16
8 位元轉 16 位元資料寬度轉換器
請設計一個名為 width_8to16 的資料寬度轉換模組,將連續到達的兩筆 8 位元資料組合成一筆 16 位元資料。
第一筆有效的 8 位元資料必須放在 data_out 的高 8 位元,第二筆有效資料放在低 8 位元:
data_out = {第一筆資料, 第二筆資料}
例如,依序收到:
第一筆資料 = 8'hA0
第二筆資料 = 8'hA1
則輸出為:
data_out = 16'hA0A1
只有當 valid_in 為 1 時,data_in 才是有效資料。
收到第一筆有效資料時,模組必須暫存該資料,但不可立即產生有效輸出。收到第二筆有效資料後,模組將兩筆資料組合至 data_out,並將 valid_out 拉高一個時脈週期。
若兩筆有效資料之間存在數個 valid_in = 0 的週期,第一筆資料仍必須保留,直到第二筆有效資料到達。
模組名稱
width_8to16
輸入埠
| 埠名稱 | 位元寬度 | 說明 |
|---|---|---|
clk |
1 | 時脈訊號 |
rst_n |
1 | 低電位有效的非同步 Reset |
valid_in |
1 | 輸入資料有效訊號 |
data_in |
8 | 輸入的 8 位元資料 |
輸出埠
| 埠名稱 | 位元寬度 | 說明 |
|---|---|---|
valid_out |
1 | 16 位元輸出資料有效訊號 |
data_out |
16 | 組合後的 16 位元資料 |
功能說明
Reset
當:
rst_n = 0
時,模組必須清除所有內部狀態:
data_lock = 0
data_out = 0
valid_out = 0
flag = 0
第一筆有效資料
當 valid_in = 1 且目前正在等待第一筆資料時:
data_lock <= data_in;
此時:
valid_out = 0
第一筆資料只會被暫存在 data_lock 中。
第二筆有效資料
當 valid_in = 1 且先前已經收到第一筆資料時:
data_out <= {data_lock, data_in};
同時:
valid_out = 1
完成輸出後,模組重新等待下一組資料的第一筆輸入。
无效輸入週期
當:
valid_in = 0
時,不接收 data_in,並將:
valid_out = 0
若模組已經收到第一筆資料,該資料必須繼續保留。
資料組合範例
輸入時序如下:
| 時脈週期 | valid_in |
data_in |
動作 |
|---|---|---|---|
| 1 | 1 | 8'h12 |
暫存第一筆資料 |
| 2 | 0 | 不重要 | 等待第二筆資料 |
| 3 | 0 | 不重要 | 等待第二筆資料 |
| 4 | 1 | 8'h34 |
輸出 16'h1234 |
| 5 | 1 | 8'h56 |
暫存下一組第一筆資料 |
| 6 | 1 | 8'h78 |
輸出 16'h5678 |
設計要求
- 模組名稱必須為
width_8to16。 - 每兩筆有效的 8 位元資料組成一筆 16 位元資料。
- 第一筆有效資料放在輸出的高 8 位元。
- 第二筆有效資料放在輸出的低 8 位元。
- 收到第一筆資料時不可產生有效輸出。
- 收到第二筆資料時,
valid_out拉高一個時脈週期。 valid_in = 0的週期不得改變資料配對狀態。data_out在沒有新輸出時保持原值。rst_n為低電位有效的非同步 Reset。- 時序邏輯必須使用 nonblocking assignment。
程式模板
module width_8to16 (
input clk,
input rst_n,
input valid_in,
input [7:0] data_in,
output reg valid_out,
output reg [15:0] data_out
);
// Write your code here
endmodule
評論