文章目錄
1 偶數分頻(1)2的冪分頻
案例I 二分頻
i: div_2.v
module div_2( input i_clk, input i_rst_n, output o_clk);reg [0:0] cnt;always @ (posedge i_clk, negedge i_rst_n) if (!i_rst_n) cnt <= 0; else cnt <= cnt + 1'b1;assign o_clk = cnt[0];endmodule
ii:RTL視圖(QII綜合結果)
圖1 二分頻的RTL視圖
iii:模擬波形(QII模擬結果)
圖2 二分頻的模擬波形
案例II 四分頻
i:div_4.v
module div_4( input i_clk, input i_rst_n, output o_clk);reg [1:0] cnt;always @ (posedge i_clk, negedge i_rst_n) if (!i_rst_n) cnt <= 0; else cnt <= cnt + 1'b1;assign o_clk = cnt[1];endmodule
ii:RTL視圖(QII綜合結果)
圖3 四分頻的RTL視圖
iii:模擬波形(QII模擬結果)
圖4 四分頻的模擬波形
(2)不是2的冪分頻
案例I 六分頻
i:div_6.v
module div_6( input i_clk, input i_rst_n, output reg o_clk);// log2(6) = 2.5850 <= 3reg [2:0] cnt; // 6 bit counter: 0 ~ 5// 5 = 6 - 1always @ (posedge i_clk, negedge i_rst_n)begin if (!i_rst_n) cnt <= 0; else begin if (cnt == 5) cnt <= 0; else cnt <= cnt + 1'b1; endend // 0 ~ 2 -> 1 // 2 ~ 5 -> 0// 2 = 6>>1 - 1// 5 = 6 - 1always @ (posedge i_clk, negedge i_rst_n)begin if (!i_rst_n) o_clk <= 0; else begin if (cnt <= 2) o_clk <= 1; else o_clk <= 0; endend endmodule
ii:RTL視圖(QII綜合結果)
圖5 六分頻的RTL視圖
gt;iii:模擬波形(QII模擬結果)
圖6 六分頻的模擬波形
案例II 十分頻
i:div_10.v
module div_10( input i_clk, input i_rst_n, output reg o_clk);// log2(10) = 3.3219 <= 4reg [3:0] cnt; // 10 bit counter: 0 ~ 9// 9 = 10 - 1always @ (posedge i_clk, negedge i_rst_n)begin if (!i_rst_n) cnt <= 0; else begin if (cnt == 9) cnt <= 0; else cnt <= cnt + 1'b1; endend // 0 ~ 4 -> 1 // 4 ~ 9 -> 0// 4 = 10>>1 - 1// 9 = 10 - 1always @ (posedge i_clk, negedge i_rst_n)begin if (!i_rst_n) o_clk <= 0; else begin if (cnt <= 4) o_clk <= 1; else o_clk <= 0; endend endmodule
ii:RTL視圖(QII綜合結果)
圖7 十分頻的RTL視圖
iii:模擬波形(QII模擬結果)
圖8 十分頻的模擬波形
2 奇數分頻
案例I 三分頻
i. div_3.v
module div_3( input i_clk, input i_rst_n, output o_clk); // log2(3) = 1.5850 <= 2 reg [1:0] cnt_p; // 上升沿計數子 // 3位上升沿計數器: 0 ~ 2// 2 = 3 - 1always @ (posedge i_clk, negedge i_rst_n)begin if (!i_rst_n) cnt_p <= 0; else begin if (cnt_p == 2) cnt_p <= 0; else cnt_p <= cnt_p + 1'b1; endend// log2(3) = 1.5850 <= 2 reg [1:0] cnt_n; // 下降沿計數子// 3位下降沿計數器: 0 ~ 2// 2 = 3 - 1always @ (negedge i_clk, negedge i_rst_n)begin if (!i_rst_n) cnt_n <= 0; else begin if (cnt_n == 2) cnt_n <= 0; else cnt_n <= cnt_n + 1'b1; endend reg o_clk_p; // 上升沿時鐘輸出寄存器// 輸出上升沿時鐘// 0 ~ 1 ↑-> 1// (1+1) ~ 2 ↑-> 0// 1 = 3>>1// 2 = 3 - 1always @ (posedge i_clk, negedge i_rst_n)begin if (!i_rst_n) o_clk_p <= 0; else begin if (cnt_p <= 1) // 1 = 3>>1 o_clk_p <= 1; else o_clk_p <= 0; endend reg o_clk_n; // 下降沿時鐘輸出寄存器// 輸出下降沿時鐘// 0 ~ 1 ↓-> 1// (1+1) ~ 2 ↓-> 0// 1 = 3>>1// 2 = 3 - 1always @ (negedge i_clk, negedge i_rst_n)begin if (!i_rst_n) o_clk_n <= 0; else begin if (cnt_n <= 1) // 1 = 3>>1 o_clk_n <= 1; else o_clk_n <= 0; endendassign o_clk = o_clk_n & o_clk_p; // 按位與(作用:掩碼) endmodule
ii:RTL視圖(QII綜合結果)
圖9 三分頻的RTL視圖
iii:模擬波形(QII模擬結果)
圖10 三分頻的模擬波形
案例II 五分頻
i. div_5.v
module div_5( input i_clk, input i_rst_n, output o_clk); // log2(5) = 2.3219 <= 3 reg [2:0] cnt_p; // 上升沿計數子 // 5位上升沿計數器: 0 ~ 4// 4 = 5 - 1always @ (posedge i_clk, negedge i_rst_n)begin if (!i_rst_n) cnt_p <= 0; else begin if (cnt_p == 4) cnt_p <= 0; else cnt_p <= cnt_p + 1'b1; endend// log2(5) = 2.3219 <= 3 reg [2:0] cnt_n; // 下降沿計數子// 5位下降沿計數器: 0 ~ 4// 4 = 5 - 1always @ (negedge i_clk, negedge i_rst_n)begin if (!i_rst_n) cnt_n <= 0; else begin if (cnt_n == 4) cnt_n <= 0; else cnt_n <= cnt_n + 1'b1; endend reg o_clk_p; // 上升沿時鐘輸出寄存器// 輸出上升沿時鐘// 0 ~ 2 ↑-> 1// (2+1) ~ 4 ↑-> 0// 2 = 5>>1// 4 = 5 - 1always @ (posedge i_clk, negedge i_rst_n)begin if (!i_rst_n) o_clk_p <= 0; else begin if (cnt_p <= 2) // 2 = 5>>1 o_clk_p <= 1; else o_clk_p <= 0; endend reg o_clk_n; // 下降沿時鐘輸出寄存器// 輸出下降沿時鐘// 0 ~ 2 ↓-> 1// (2+1) ~ 4 ↓-> 0// 2 = 5>>1// 4 = 5 - 1always @ (negedge i_clk, negedge i_rst_n)begin if (!i_rst_n) o_clk_n <= 0; else begin if (cnt_n <= 2) // 2 = 5>>1 o_clk_n <= 1; else o_clk_n <= 0; endendassign o_clk = o_clk_n & o_clk_p; // 按位與(作用:掩碼) endmodule
ii:RTL視圖(QII綜合結果)
圖11 五分頻的RTL視圖
iii:模擬波形(QII模擬結果)
圖12 五分頻的模擬波形
參考資料
1. 真 OO無雙,(原創) 如何設計除頻器? (SOC) (Verilog) (MegaCore)
http://www.cnblogs.com/oomusou/archive/2008/07/31/verilog_clock_divider.html
2. 小時不識月,N倍奇數分頻器.(Verilog)
http://blog.ednchina.com/2006tx_yafeng/146438/message.aspx
3. 小時不識月,N倍偶數分頻器.(Verilog)
http://blog.ednchina.com/2006tx_yafeng/146525/message.aspx