1.1 概念
奇数分频,指的是分频后的频率和分频前的的频率比例是奇数,比如100Mhz时钟,进行三分频后就是33.333Mhz。
1.2 实现原理
分别用上升沿计数到N/2 +1,分频后输出时钟进行翻转,再计数到N/2输出out_clk1;再用下降沿计数到到N/2 +1,分频后输出时钟进行翻转,再计数到N/2输出out_clk2; 将out_clk1与out_clk2相或即可。
1.3 五分频电路设计
下面展示 功能代码
。
`timescale 1ns / 1ps
///
// Verilog 功能代码如下:
module divide_5(
input sys_clk ,
input sys_rst_n,
output div_clk
);
parameter N=5 ;
reg [3:0] cnt1 ;
reg [3:0] cnt2 ;
reg clk1 ;
reg clk2 ;
always @ (posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)begin
cnt1 <= 4'b1 ;
clk1 <= 1'b0 ;
end
else if(clk1 == 1'b0)
if(cnt1 == N/2 +1) begin
clk1 <= ~ clk1 ;
cnt1 <= 1'b1 ;
end
else
cnt1 <= cnt1 + 1'b1 ;
else if(cnt1 == N/2) begin
clk1 <= ~ clk1 ;
cnt1 <= 1'b1 ;
end
else
cnt1 <= cnt1 + 1'b1 ;
always @ (negedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)begin
cnt2 <= 4'b1 ;
clk2 <= 1'b0 ;
end
else if(clk2 == 1'b0)
if(cnt2 == N/2 +1) begin
clk2 <= ~ clk1 ;
cnt2 <= 1'b1 ;
end
else
cnt2 <= cnt2 + 1'b1 ;
else if(cnt2 == N/2) begin
clk2 <= ~ clk2 ;
cnt2 <= 1'b1 ;
end
else
cnt2 <= cnt2 + 1'b1 ;
assign div_clk = clk1 | clk2 ;
endmodule
仿真代码如下:
module tb_divide_5(
);
reg clk ;
reg rst ;
wire out ;
initial begin
clk = 1'b0 ;
rst = 1'b0 ;
#200
rst = 1'b1 ;
end
always #5 clk = ~clk ;
divide_5 divide_5_inst(
.sys_clk (clk),
.sys_rst_n(rst),
.div_clk(out)
);
endmodule