[RTLLM-p046] Miscellaneous/Others/synchronizer
多位元 MUX 型跨時脈同步器
請設計一個名為 synchronizer 的多位元跨時脈同步器,將 clk_a 時脈域中的 4 位元資料同步至 clk_b 時脈域。
來源時脈域包含:
data_in:4 位元輸入資料。data_en:資料有效訊號。
題目保證:
data_en為高電位時,data_in保持不變。data_en至少維持 3 個clk_b週期。- 相鄰兩筆資料的變化間隔至少為 10 個
clk_b週期。 data_in的變化頻率很低。
在 clk_a 時脈域中,輸入資料與有效訊號分別儲存在 data_reg 與 en_data_reg。
在 clk_b 時脈域中,en_data_reg 經過兩級 D 觸發器同步。當同步後的有效訊號為高電位時,將穩定的 data_reg 載入輸出 dataout。
模組名稱
synchronizer
輸入埠
| 埠名稱 | 位元寬度 | 說明 |
|---|---|---|
clk_a |
1 | 來源時脈 |
clk_b |
1 | 目的時脈 |
arstn |
1 | clk_a 時脈域的低電位有效非同步 Reset |
brstn |
1 | clk_b 時脈域的低電位有效非同步 Reset |
data_in |
4 | 來源時脈域的輸入資料 |
data_en |
1 | 來源時脈域的資料有效訊號 |
輸出埠
| 埠名稱 | 位元寬度 | 說明 |
|---|---|---|
dataout |
4 | 同步至 clk_b 時脈域的輸出資料 |
功能說明
來源時脈域
在每個 clk_a 上升沿:
data_reg <= data_in;
en_data_reg <= data_en;
當 arstn = 0 時:
data_reg = 0
en_data_reg = 0
有效訊號同步
在 clk_b 時脈域中,使用兩級 D 觸發器同步 en_data_reg:
en_clap_one <= en_data_reg;
en_clap_two <= en_clap_one;
當 brstn = 0 時,兩級同步暫存器清除為 0。
輸出資料
當同步後的有效訊號 en_clap_two 為 1 時:
dataout <= data_reg;
當 en_clap_two 為 0 時,dataout 保持原值。
設計要求
- 模組名稱必須為
synchronizer。 data_in與data_en屬於clk_a時脈域。dataout屬於clk_b時脈域。- 使用
data_reg儲存來源資料。 - 使用
en_data_reg儲存來源有效訊號。 - 使用兩級 D 觸發器同步有效訊號。
- 當同步後的有效訊號為高電位時更新
dataout。 - 當同步後的有效訊號為低電位時保持
dataout。 arstn與brstn均為低電位有效非同步 Reset。- 時序邏輯必須使用 nonblocking assignment。
程式模板
module synchronizer (
input clk_a,
input clk_b,
input arstn,
input brstn,
input [3:0] data_in,
input data_en,
output reg [3:0] dataout
);
// Write your code here
endmodule
評論