奇分频,先以占空比50%为例:
3分频:占空比1/3的 上升沿 采样的三分频和一个占空比1/3 下降沿 采样的三分频,或运算。
5分频:占空比2/5的 上升沿 采样的五分频和一个占空比2/5 下降沿 采样的五分频,或运算。
7分频:占空比3/7的 上升沿 采样的七分频和一个占空比3/7 下降沿 采样的七分频,或运算。
也就是说,N分频,就是把占空比 [(N-1)/2]/N的 上升沿 采样N分频和 下降沿 采样的N分频,或运算。
这边有一个要注意的就是什么时候拉高电平什么时候拉低,不然一不注意就变成2/3占空比了,那就应该做与运算了。
//5分频,占空比2/5的 上升沿有效与下降沿有效 5分频 做或cnt=1翻转一次 cnt==4翻转一次
module test (
input clk,
input rst_n,
output clk_div5
);
reg [2:0]cnt_pos,cnt_neg;
reg clk_div5_pos;
reg clk_div5_neg;
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
cnt_pos <= 0;
clk_div5_pos <= 0;
end
else if (cnt_pos == 4) begin
cnt_pos <= 0;
clk_div5_pos <= 1;
end
else if (cnt_pos == 1) begin
cnt_pos <= cnt_pos + 1;
clk_div5_pos <= 0;
end
else begin
cnt_pos <= cnt_pos + 1;
clk_div5_pos <= clk_div5_pos;
end
end
always @(negedge clk or negedge rst_n) begin
if (~rst_n) begin
cnt_neg <= 0;
clk_div5_neg <= 0;
end
else if (cnt_neg == 4) begin
cnt_neg <= 0;
clk_div5_neg <= 1;
end
else if (cnt_neg == 1) begin
cnt_neg <= cnt_neg + 1;
clk_div5_neg <= 0;
end
else begin
cnt_neg <= cnt_neg + 1;
clk_div5_neg <= clk_div5_neg;
end
end
assign clk_div5 = clk_div5_pos | clk_div5_neg ;
endmodule
testbench:
module tb_test ();
reg clk;
reg rst_n;
wire clk_div5;
initial begin
clk = 0;
rst_n = 0;
#10
rst_n = 1;
#500000000
$finish;
end
always #5 clk = ~clk;
test div_1(
.clk(clk),
.rst_n(rst_n),
.clk_div5(clk_div5)
);
endmodule