[RTLLM-p045] Miscellaneous/Others/width_8to16


提交解答


分數: 5
時間限制: 2.0s
記憶體限制: 256M

作者:
題目代碼
題目類型
允許的語言
Verilog

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

設計要求

  1. 模組名稱必須為 width_8to16
  2. 每兩筆有效的 8 位元資料組成一筆 16 位元資料。
  3. 第一筆有效資料放在輸出的高 8 位元。
  4. 第二筆有效資料放在輸出的低 8 位元。
  5. 收到第一筆資料時不可產生有效輸出。
  6. 收到第二筆資料時,valid_out 拉高一個時脈週期。
  7. valid_in = 0 的週期不得改變資料配對狀態。
  8. data_out 在沒有新輸出時保持原值。
  9. rst_n 為低電位有效的非同步 Reset。
  10. 時序邏輯必須使用 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

評論

目前沒有評論。