[RTLLM-p041] Miscellaneous/Frequency divider/freq_divbyodd
奇數除頻器
請設計一個名為 freq_divbyodd 的奇數除頻器。
此模組根據參數 NUM_DIV 對輸入時脈 clk 進行除頻。NUM_DIV 必須為奇數,預設值為 5。
當:
NUM_DIV = 5
時,輸出時脈頻率為:
clk_div 頻率 = clk 頻率 ÷ 5
為了讓奇數除頻後的輸出具有接近 50% 的工作週期,模組分別在輸入時脈的上升沿與下降沿產生兩個部分時脈 clk_div1 與 clk_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_div2 與 clk_div1 之間具有半個時脈週期的相位差。
輸出時脈
最後的除頻輸出由兩個部分時脈進行 OR 運算:
assign clk_div = clk_div1 | clk_div2;
當 NUM_DIV = 5 時,輸出完整週期包含 5 個輸入時脈週期,因此:
輸出頻率 = 輸入頻率 ÷ 5
設計要求
- 模組名稱必須為
freq_divbyodd。 NUM_DIV的預設值為 5。NUM_DIV必須為大於 1 的奇數。- 使用兩個計數器
cnt1與cnt2。 cnt1在輸入時脈上升沿更新。cnt2在輸入時脈下降沿更新。- 使用
clk_div1與clk_div2產生兩個部分時脈。 - 使用 OR 運算產生最終輸出
clk_div。 rst_n為低電位有效的非同步 Reset。- 時序邏輯必須使用 nonblocking assignment。
程式模板
module freq_divbyodd #(
parameter NUM_DIV = 5
) (
input clk,
input rst_n,
output clk_div
);
// Write your code here
endmodule
評論