[RTLLM-p042] Miscellaneous/Frequency divider/freq_divbyfrac


提交解答


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

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

3.5 倍分數除頻器

請設計一個名為 freq_divbyfrac 的分數除頻器,將輸入時脈頻率除以 3.5。

由於:

3.5 = 7 / 2

模組必須同時利用輸入時脈的上升沿與下降沿進行計數。每一個輸入時脈週期包含兩個時脈邊緣,因此 3.5 個輸入時脈週期等於 7 個半週期。

除頻器使用一個模 7 計數器,在輸入時脈的每個上升沿與下降沿更新。輸出時脈在其中 3 個半週期維持高電位,並在另外 4 個半週期維持低電位。

因此輸出週期為:

7 × 半個輸入時脈週期
= 3.5 × 輸入時脈週期

模組名稱

freq_divbyfrac

參數

參數名稱 預設值 說明
MUL2_DIV_CLK 7 除頻比例乘以 2 後的整數值

本題的實際除頻比例為:

MUL2_DIV_CLK / 2 = 7 / 2 = 3.5

輸入埠

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

輸出埠

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

功能說明

Reset

當:

rst_n = 0

時,內部計數器清除為 0,輸出時脈清除為低電位:

cnt     = 0
clk_div = 0

雙邊沿計數

計數器在輸入時脈的上升沿與下降沿都會更新:

always @(posedge clk or negedge clk or negedge rst_n)

計數範圍為:

0 → 1 → 2 → 3 → 4 → 5 → 6 → 0

每次計數代表半個輸入時脈週期。


中間時脈

模組產生兩個中間訊號:

clk_div1
clk_div2

當計數器為 0 或 1 時:

clk_div1 = 1

當計數器為 2 時:

clk_div2 = 1

最後將兩個中間訊號進行 OR 運算:

clk_div = clk_div1 | clk_div2;

因此輸出波形每 7 個半週期重複一次:

1 1 1 0 0 0 0

輸出高電位持續 3 個半週期,低電位持續 4 個半週期。


除頻結果

假設輸入時脈週期為:

Tclk

輸出時脈週期為:

7 × Tclk / 2 = 3.5 × Tclk

因此輸出頻率為:

Fout = Fin / 3.5

設計要求

  1. 模組名稱必須為 freq_divbyfrac
  2. 使用低電位有效的非同步 Reset。
  3. Reset 時將計數器與輸出清除為 0。
  4. 同時使用輸入時脈的上升沿與下降沿。
  5. 計數器必須循環計數 0 至 6。
  6. 一個輸出週期必須包含 7 個輸入半週期。
  7. 輸出高電位持續 3 個半週期。
  8. 輸出低電位持續 4 個半週期。
  9. 最終輸出由兩個中間時脈進行 OR 運算產生。
  10. 時序邏輯必須使用 nonblocking assignment。

程式模板

module freq_divbyfrac (
    input  clk,
    input  rst_n,
    output clk_div
);

    // Write your code here

endmodule

評論

目前沒有評論。