分频器的设计
分频器的设计
内容:
- 通用分频器;
- 偶分频;
- 奇分频;
- 半数分频。
实现:
- 通用分频器
分频公式
N是分频系数。
通用分频器的实现方法:应用N进制计数器,将要被分频的信号作为计数器的时钟脉冲,分频信号作为输出。取M值在计数到0至N-1期间,0-M设置输出为低,M-N-1设置为高。M可调。
//通用N分频器
module fp_N (
input clk,
input en, //使能信号
input [11:0]N, //分频系数
input [11:0]M, //高低电平分界值
output fp_out
);
reg [11:0]cnt;
assign fp_out=(cnt<M)?1'b0:1'b1; //PWM
//分频过程
always @(posedge clk) begin
if(!en)
cnt<=12'b0;
else if(cnt<N-1)
cnt<=cnt+1'b1;
else
cnt<=12'b0;
end
endmodule
仿真结果:
- 偶分频
分频系数N为偶数。有两种实现方法,一是取M=N/2.二是应用N/2进制计数器,计满则输出翻转。
代码:
//偶分频
module fp_even (
input clk,en,
input [11:0]N_even,
output reg fp_out
);
reg [11:0]cnt;
always @(posedge clk) begin
if(!en)
begin
cnt<=12'b0;
fp_out<=1'b0;
end
else
if(cnt<(N_even/2-1))
cnt<=cnt+1'b1;
else
begin
cnt<=12'b0;
fp_out<=~fp_out;
end
end
endmodule
仿真结果:
- 奇分频
N为计数。做两个(N-1)/2进制计数器,一个上升沿触发,一个下降沿触发,然后两个输出相或。
代码:
//奇分频
module fp_odd(
input clk,en,
input [11:0]N_odd,
output fp_out
);
reg [11:0]cnt1,cnt2;
(*synthesis,probe_port,keep *) wire fp1,fp2;
assign fp1=(cnt1<=(N_odd-1)/2)?0:1;
assign fp2=(cnt2<=(N_odd-1)/2)?0:1;
assign fp_out=fp1|fp2;
always @(posedge clk) begin
if(!en)
cnt1<=12'b0;
else if(cnt1<N_odd-1)
cnt1<=cnt1+1'b1;
else
cnt1<=12'b0;
end
always @(negedge clk) begin
if(!en)
cnt2<=12'b0;
else if(cnt2<N_odd-1)
cnt2<=cnt2+1'b1;
else
cnt2<=12'b0;
end
endmodule
仿真结果:
- 半数分频
分频系数为整数的一半,比如10.5.
半数分频的原理:计数开始前,先将T触发器清零。经过异或门控制N进制计数器的时钟脉冲。先在时钟上升沿计数,计满,co变高,T触发器输出翻转,接着在时钟下降沿计数。中间计满的那次,数字状态只有半个时钟。
代码:
//半整数分频
module fp10p5 (
input clk,clr_n,
output fp_out
);
reg [3:0]cnt;
(* synthesis,probe_port,keep *) wire co;
reg q;
wire cnt_clk;
assign cnt_clk=clk^q;
assign fp_out=q;
assign co=(cnt==4'd10);
always @(posedge cnt_clk) begin //counter 10
if(cnt==4'd10)
cnt<=4'd0;
else
cnt<=cnt+1'b1;
end
always @(posedge co,negedge clr_n) //TFF
if(!clr_n)
q<=0;
else
q<=~q;
endmodule
仿真结果:
总结:
最简单的是偶分频,难一点的是奇分频和半数分频。分别利用了两种边沿技巧。
参考:
- 张俊涛,陈晓莉.现代EDA技术及其应用.[M].北京,清华大学出版社。