用错位异或法原理实现 奇数分频模块:
原理:对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发的模N计数,
计数到某一选定值时进行输出时钟翻转,
然后经过(N-1)/ 2再次进行翻转得到一个占空比非50%奇数N分频时钟。
再者同时进行下降沿触发的模N计数,
到和上升沿触发输出时钟翻转选定值相同值时,进行输出时钟翻转,
同样经过(N-1)/2时,
输出时钟再次翻转生成占空比非50%的奇数N分频时钟。
两个占空比非50%的N分频时钟相或运算,得到占空比为50%的N分频奇数时钟。
源代码:
module clk_div_9(
clk_in,
rst_n,
clk_out
);
input clk_in;
input rst_n;
output clk_out;
reg [4:0] cnt_p;
reg [4:0] cnt_n;
reg clk_out_p;
reg clk_out_n;
assign clk_out = clk_out_p | clk_out_n;
always @(posedge clk_in) begin
if (!rst_n) begin
clk_out_p <= 0;
cnt_p <= 0;
end
else begin
if ((cnt_p==4'b0000) || (cnt_p==4'b0100)) begin
clk_out_p <= !clk_out_p;
cnt_p <= cnt_p + 1;
end
else if (cnt_p == 4'b1000) begin
clk_out_p <= clk_out_p;
cnt_p <= 4'b0000;
end
else begin
clk_out_p <= clk_out_p;
cnt_p <= cnt_p + 1;
end
end
end
always @(negedge clk_in) begin
if (!rst_n) begin
clk_out_n <= 0;
cnt_n <= 0;
end
else begin
if ((cnt_n==4'b0000) || (cnt_n==4'b0100)) begin
clk_out_n <= !clk_out_n;
cnt_n <= cnt_n + 1;
end
else if (cnt_n == 4'b1000) begin
clk_out_n <= clk_out_n;
cnt_n <= 4'b0000;
end
else begin
clk_out_n <= clk_out_n;
cnt_n <= cnt_n + 1;
end
end
end
endmodule