[笔记].等占空比分频器的几种写法.[Verilog]
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 <= 3
reg [2:0] cnt;
// 6 bit counter: 0 ~ 5
// 5 = 6 - 1
always @ (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;
end
end
// 0 ~ 2 -> 1
// 2 ~ 5 -> 0
// 2 = 6>>1 - 1
// 5 = 6 - 1
always @ (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;
end
end
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 <= 4
reg [3:0] cnt;
// 10 bit counter: 0 ~ 9
// 9 = 10 - 1
always @ (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;
end
end
// 0 ~ 4 -> 1
// 4 ~ 9 -> 0
// 4 = 10>>1 - 1
// 9 = 10 - 1
always @ (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;
end
end
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 - 1
always @ (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;
end
end
// log2(3) = 1.5850 <= 2
reg [1:0] cnt_n; // 下降沿計數子
// 3位下降沿計數器: 0 ~ 2
// 2 = 3 - 1
always @ (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;
end
end
reg o_clk_p; // 上升沿時鐘輸出寄存器
// 輸出上升沿時鐘
// 0 ~ 1 ↑-> 1
// (1+1) ~ 2 ↑-> 0
// 1 = 3>>1
// 2 = 3 - 1
always @ (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;
end
end
reg o_clk_n; // 下降沿時鐘輸出寄存器
// 輸出下降沿時鐘
// 0 ~ 1 ↓-> 1
// (1+1) ~ 2 ↓-> 0
// 1 = 3>>1
// 2 = 3 - 1
always @ (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;
end
end
assign 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 - 1
always @ (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;
end
end
// log2(5) = 2.3219 <= 3
reg [2:0] cnt_n; // 下降沿計數子
// 5位下降沿計數器: 0 ~ 4
// 4 = 5 - 1
always @ (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;
end
end
reg o_clk_p; // 上升沿時鐘輸出寄存器
// 輸出上升沿時鐘
// 0 ~ 2 ↑-> 1
// (2+1) ~ 4 ↑-> 0
// 2 = 5>>1
// 4 = 5 - 1
always @ (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;
end
end
reg o_clk_n; // 下降沿時鐘輸出寄存器
// 輸出下降沿時鐘
// 0 ~ 2 ↓-> 1
// (2+1) ~ 4 ↓-> 0
// 2 = 5>>1
// 4 = 5 - 1
always @ (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;
end
end
assign 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
安德魯? / CC BY 2.5
總結
以上是生活随笔為你收集整理的[笔记].等占空比分频器的几种写法.[Verilog]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 当年,兔子学姐靠这个面试小抄拿了个22k
- 下一篇: MySQL 存储引擎 | MyISAM