一、偶数分频器
100Mhz二分频后为50Mhz. 偶数分频实现比较简单,假设为N(偶数)分频,只需计数到N/2 -1 然后时钟翻转,计数器清零。
使用Verilog语言设计4分频电路。
module divide_2
(
input clk,
input rst_n,
output reg out_clk
);
parameter N = 4; //N为偶数
reg [N/2-1:0] cnt;
always @ (posedge clk or negedge rst_n) begin
if(!rst_n)begin
cnt <= 0;
out_clk <= 0;
end
else bigin
if(cnt==N/2-1)begin
out_clk <= ~out_clk;
cnt <= 0;
end
else
cnt <= cnt + 1;
end
end
endmodule
二、奇数分频器
分频方法(占空比为50%)
当 out_clk1 为 0 时, cnt_1 在 clk 时钟上升沿进行计数,当计数到 N/2+1 时 out_clk1 进行翻
转,同时 cnt_1 赋值为初始值 0 , 当 out_clk1 为 1 时, cnt_1 在 clk 时钟上升沿进行计数,当计数到
N/2 时 out_clk1 进行翻转,同时 cnt_1 赋值为初始值 0。
当 out_clk2 为 0 时, cnt_2 在 clk 时钟下降沿进行计数,当计数到 N/2+1 时 out_clk2 进行翻
转,同时 cnt_2 赋值为初始值 0 , 当 out_clk2 为 1 时, cnt_2 在 clk 时钟下降沿进行计数,当计数到
N/2 时 out_clk2 进行翻转,同时 cnt_2 赋值为初始值 0。
最后分频的结果为out_clk1和out_clk2相或
N/2取整 小数舍弃
以5分频为例 波形图如同所示
代码如下
module divide_5
(
input clk,
input rst_n,
output out_clk
);
parameter N = 5
reg [N/2 :0] cnt_1 ;
reg [N/2 :0] cnt_2 ;
reg out_clk1 ;
reg out_clk2 ;
always @ (posedge clk or negedge rst_n) begin //上升沿输出 out_clk1
if(!rst_n) begin
out_clk1 <= 0;
cnt_1 <= 0;
end
else begin
if(out_clk1 == 0) begin
if(cnt_1 == N/2+1) begin
out_clk1 <= ~out_clk1;
cnt_1 <= 0;
end
else
cnt_1 <= cnt_1+1;
end
else if(cnt_1 == N/2) begin
out_clk1 <= ~out_clk1;
cnt_1 <= 1;
end
else
cnt_1 <= cnt_1+1;
end
end
always @ (negedge clk or negedge rst_n) begin //下降沿输出 out_clk2
if(!rst_n) begin
out_clk2 <= 0;
cnt_2 <= 0;
end
else begin
if(out_clk2 == 0) begin
if(cnt_2 == N/2+1) begin
out_clk2 <= ~out_clk2;
cnt_2 <= 0;
end
else
cnt_2 <= cnt_2+1;
end
else if(cnt_2 == N/2) begin
out_clk2 <= ~out_clk2;
cnt_2 <= 0;
end
else
cnt_2 <= cnt_2+1;
end
end
assign out_clk = out_clk1 | out_clk2;
endmodule