1.奇数分频:
设计思路:将两个模N计数器(一个上升沿触发、一个下降沿触发)相或
eg:五分频
module v_jsfp(
input clk,
input rst,
output clk_5
);//实现五分频
reg [2:0] m;
reg [2:0] n;
reg clk1,clk2;//两个模五计数器
initial
begin
m=0;
n=0;
clk1=0;
clk2=0;
end
always@(posedge clk)
begin
if(!rst)
begin
m=0;
clk1=0;
end
else
begin
if(m==4)
m<=0;
else
m<=m+1;
end
if(m<2)
begin
clk1<=1;
end
else
clk1<=0;
end
always@(negedge clk)
begin
if(!rst)
begin
n<=0;
clk2<=0;
end
else
begin
if(n==4)
n<=0;
else
n<=n+1;
end
if(n<2)
begin
clk2<=1;
end
else
clk2<=0;
end
assign clk_5=clk1|clk2;
endmodule
仿真:
若要实现任意奇数N分频,parameter N=*
clk1:前(N-1)/2的计数周期为高电平,
clk2:前(N-1)/2的计数周期为高电平。
2.半整数分频
计思路:若要实现(N-1).5分频,要设计一个模N计数器,一个脉冲扣除电路加在模N计数器之后,每来N个脉冲就扣除半个脉冲。
eg:3.5分频
module v_div3_5(
input clk,
input rst,
output reg clk_out
);
reg clk1;
wire clk2;
reg [3:0] cnt;
initial
begin
cnt=0;
clk1=0;
end
xor xor1(clk2,clk1,clk);
always@(posedge clk_out or negedge rst)//二分频
begin
if(!rst)
clk1<=0;
else
clk1<=~clk1;
end
always@(posedge clk2 or negedge rst)//模四分频器
begin
if(!rst)
begin
cnt<=0;
clk_out<=0;
end
else
begin
if(cnt==3)
begin
cnt<=0;
clk_out<=1;
end
else
begin
cnt<=cnt+1;
clk_out<=0;
end
end
end
endmodule
仿真:
3.小数分频
设计思路:先设计两个不同分频比的整数分频器,然后通过控制两种分频比出现的不同次数来获得所需的小数分频值,从而实现平均意义上的小数分频,称为双模前置小数分频器。
实现X=M.N分频,M<X<M+1
以实现5.1分频为例:M=5,N1=9,N2=1,即9次五分频1次六分频。
module v_div5_1(
input clk,
input rst,
output reg clk_out
);
reg [3:0] cnt1,cnt2;
initial
begin
cnt1=0;
cnt2=0;
end
always@(posedge clk or negedge rst)
begin
if(!rst)
begin
cnt1<=0;
cnt2<=0;
clk_out<=0;
end
else
begin
if(cnt1<9)
begin
if(cnt2<4)
begin
cnt2=cnt2+1;
clk_out=0;
end
else
begin
cnt2=0;
clk_out=1;
cnt1=cnt1+1;
end
end
else
begin
if(cnt2<5)
begin
cnt2=cnt2+1;
clk_out=0;
end
else
begin
cnt2=0;
cnt1=0;
clk_out=1;
end
end
end
end
endmodule
仿真: