[RTLLM-p041] Miscellaneous/Frequency divider/freq_divbyodd


提交解答


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

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

奇數除頻器

請設計一個名為 freq_divbyodd 的奇數除頻器。

此模組根據參數 NUM_DIV 對輸入時脈 clk 進行除頻。NUM_DIV 必須為奇數,預設值為 5。

當:

NUM_DIV = 5

時,輸出時脈頻率為:

clk_div 頻率 = clk 頻率 ÷ 5

為了讓奇數除頻後的輸出具有接近 50% 的工作週期,模組分別在輸入時脈的上升沿與下降沿產生兩個部分時脈 clk_div1clk_div2,最後使用 OR 運算產生輸出 clk_div


模組名稱

freq_divbyodd

參數

參數名稱 預設值 說明
NUM_DIV 5 奇數除頻比例

輸入埠

埠名稱 位元寬度 說明
clk 1 輸入時脈訊號
rst_n 1 低電位有效的非同步 Reset

輸出埠

埠名稱 位元寬度 說明
clk_div 1 除頻後的輸出時脈

功能說明

Reset

當:

rst_n = 0

時,兩個計數器以及兩個部分時脈都必須清除為 0:

cnt1     = 0
cnt2     = 0
clk_div1 = 0
clk_div2 = 0
clk_div  = 0

Reset 為非同步操作,因此不需要等待輸入時脈邊緣。


上升沿計數器

cnt1 在每個 clk 上升沿進行計數。

計數範圍為:

0 ~ NUM_DIV - 1

當計數器到達 NUM_DIV - 1 時,計數器回到 0。

當:

cnt1 < NUM_DIV / 2

時:

clk_div1 = 1

否則:

clk_div1 = 0

下降沿計數器

cnt2 在每個 clk 下降沿進行計數。

其計數方式與 cnt1 相同,但因為更新時間比 cnt1 晚半個輸入時脈週期,因此 clk_div2clk_div1 之間具有半個時脈週期的相位差。


輸出時脈

最後的除頻輸出由兩個部分時脈進行 OR 運算:

assign clk_div = clk_div1 | clk_div2;

NUM_DIV = 5 時,輸出完整週期包含 5 個輸入時脈週期,因此:

輸出頻率 = 輸入頻率 ÷ 5

設計要求

  1. 模組名稱必須為 freq_divbyodd
  2. NUM_DIV 的預設值為 5。
  3. NUM_DIV 必須為大於 1 的奇數。
  4. 使用兩個計數器 cnt1cnt2
  5. cnt1 在輸入時脈上升沿更新。
  6. cnt2 在輸入時脈下降沿更新。
  7. 使用 clk_div1clk_div2 產生兩個部分時脈。
  8. 使用 OR 運算產生最終輸出 clk_div
  9. rst_n 為低電位有效的非同步 Reset。
  10. 時序邏輯必須使用 nonblocking assignment。

程式模板

module freq_divbyodd #(
    parameter NUM_DIV = 5
) (
    input  clk,
    input  rst_n,
    output clk_div
);

    // Write your code here

endmodule

評論

目前沒有評論。