[RTLLM-p040] Miscellaneous/Frequency divider/freq_divbyeven
偶數除頻器
請設計一個名為 freq_diveven 的偶數除頻器。
此模組根據參數 NUM_DIV 對輸入時脈 clk 進行除頻。NUM_DIV 必須為偶數,輸出時脈 clk_div 每經過 NUM_DIV / 2 個輸入時脈週期反相一次,因此完整輸出週期包含 NUM_DIV 個輸入時脈週期。
本題預設:
NUM_DIV = 6
因此輸出頻率為:
clk_div 頻率 = clk 頻率 ÷ 6
模組名稱
freq_diveven
參數
| 參數名稱 | 預設值 | 說明 |
|---|---|---|
NUM_DIV |
6 | 時脈除頻比例,必須為偶數 |
輸入埠
| 埠名稱 | 位元寬度 | 說明 |
|---|---|---|
clk |
1 | 輸入時脈訊號 |
rst_n |
1 | 低電位有效的非同步 Reset |
輸出埠
| 埠名稱 | 位元寬度 | 說明 |
|---|---|---|
clk_div |
1 | 除頻後的輸出時脈 |
功能說明
Reset
當:
rst_n = 0
時,計數器與輸出時脈必須立即清除:
cnt = 0
clk_div = 0
計數操作
當 rst_n = 1 時,計數器在每個 clk 上升沿進行計數。
如果:
cnt < NUM_DIV / 2 - 1
則計數器加 1:
cnt <= cnt + 1'b1;
當計數器到達:
NUM_DIV / 2 - 1
時,執行:
cnt <= 0;
clk_div <= ~clk_div;
除頻範例
當:
NUM_DIV = 6
時,計數器依序變化:
0 → 1 → 2 → 0 → 1 → 2 → 0
每經過 3 個輸入時脈週期,clk_div 反相一次。
因此完整輸出週期需要 6 個輸入時脈週期:
輸出頻率 = 輸入頻率 ÷ 6
設計要求
- 模組名稱必須為
freq_diveven。 NUM_DIV必須為偶數。- 預設除頻比例為 6。
- 使用 4 位元計數器
cnt。 rst_n為低電位有效的非同步 Reset。- Reset 時將
cnt與clk_div清除為 0。 - 每經過
NUM_DIV / 2個輸入時脈週期反相一次輸出。 - 時序邏輯必須使用 nonblocking assignment。
程式模板
module freq_diveven #(
parameter NUM_DIV = 6
) (
input clk,
input rst_n,
output reg clk_div
);
reg [3:0] cnt;
// Write your code here
endmodule
評論