[RTLLM-p042] Miscellaneous/Frequency divider/freq_divbyfrac
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
設計要求
- 模組名稱必須為
freq_divbyfrac。 - 使用低電位有效的非同步 Reset。
- Reset 時將計數器與輸出清除為 0。
- 同時使用輸入時脈的上升沿與下降沿。
- 計數器必須循環計數 0 至 6。
- 一個輸出週期必須包含 7 個輸入半週期。
- 輸出高電位持續 3 個半週期。
- 輸出低電位持續 4 個半週期。
- 最終輸出由兩個中間時脈進行 OR 運算產生。
- 時序邏輯必須使用 nonblocking assignment。
程式模板
module freq_divbyfrac (
input clk,
input rst_n,
output clk_div
);
// Write your code here
endmodule
評論