[SugerTangYL]时钟管理(分频器、倍频器、锁相环)Verilog ⽬录
前⾔
数字电路中,时钟是⼗分重要的。我们经常需要各种频率的时钟,⽐如UART串⼝需要各种⽐特率等等,因此今天主要讲讲如何使⽤Verilog⽣成不同频率的时钟。
⼀、偶分频
所谓偶分频,是将基准时钟分频⾄原来的1\(2n),基本思路是每计满n个基准时钟(计数器0到n-1),使输出端翻转。这种分频⽅法⼀般能满⾜⼤部分的分频需求,实现起来也较为简单。例如下⾯代码,是将50MHz的基准时钟分频成100KHz的时钟信号,则计数器需计满249时翻转。
module divider(clk_Reference,ret_n,qout);
input clk_Reference;//基准时钟
input ret_n;//复位信号,可删去。
output reg qout;//输出分频时钟信号
reg [7:0] cnt;//分配的存储单元,位宽随需求变化。
parameter Frequency_Reference = 50_000_000;//输⼊基准时钟的频率
parameter Frequency_Demand = 100_000;//所需时钟的频率
parameter Number_Flip = Frequency_Reference/(2*Frequency_Demand)-1;//经计算后的计满翻转数
always @(podge clk_Reference or negedge ret_n) begin
if(!ret_n) cnt <= 8'b0;
el begin
if(cnt == Number_Flip) begin
cnt <= 8'b0;
qout <= ~qout;//翻转
end
el cnt <= cnt + 1'b1;
end
end
endmodulechristina perri
上述代码声明了参数,只需要在模块调⽤时修改参数值,便能获得其他频率的时钟,不过基准频率得是输出频率的偶数倍,具体调⽤形式为:
divider divider_1(clk_Reference,ret_n,qout);
library怎么读defparam divider_1.Frequency_Demand = 300_000;//采⽤层次命名法可以精准修改某⼀模块的参数
其仿真波形如下:
⼆、奇分频
⾸先看⼀个三分频的波形时序图,按照之前的思路,我们需要在基准时钟的1.5个周期时翻转,但想要计数器计⼩数⽐较⿇烦。所以我采⽤基准时钟的上升沿和下降沿分别产⽣脉冲信号,然后将两信号相或,就得到了奇分频的信号。利⽤下降沿脉冲相⽐上升沿脉冲滞后半个基准时钟周期的特点,我们得到1.5个基准时钟周期的⾼低电平。
对于两个⼦信号,要求⾼电平时间⽐低电平时间少⼀个基准时钟周期,如此才能得到占空⽐为50%的时钟信号。
综上,Verilog代码如下:
module divider(clk_Reference,ret_n,qout);
input clk_Reference;//基准时钟
input ret_n;//复位信号
output qout;//分频时钟
parameter N = 3;//分频系数
reg [7:0] cnt_p;
make someone happyreg clk_p;
//产⽣上升沿⼦时钟
always @(podge clk_Reference or negedge ret_n) begin
if(!ret_n) cnt_p <= 8'b0;
el begin
if(cnt_p == (( N-1 )/2)-1) clk_p <= 1'b1;
el if(cnt_p == N-2) clk_p <= 1'b0;
el ;
if(cnt_p == N-1) cnt_p <= 8'b0;
el cnt_p <= cnt_p + 1'b1;
end
expertend
reg [7:0] cnt_n;
reg clk_n;
/
/产⽣下降沿⼦时钟
always @(negedge clk_Reference or negedge ret_n) begin
翻译公司报价
if(!ret_n) cnt_n <= 8'b0;
el begin
if(cnt_n == (( N-1 )/2)-1) clk_n <= 1'b1;
el if(cnt_n == N-2) clk_n <= 1'b0;
el;
if(cnt_n == N-1) cnt_n <= 8'b0;
el cnt_n <= cnt_n + 1'b1;
endicon是什么意思
end
assign qout = clk_p | clk_n;//两⼦时钟相或
endmodule
此例程也做了参数化,可修改分频系数这⼀参数来得到其他奇分频时钟信号,具体实例化⽅法同上⽂。 仿真波形图如下,可见与设想波形相同。
三、倍频器
由于在数字电路中,想要使得信号发⽣变化,前提往往需要出现边沿。⽽我们的基准时钟,⼀个周期内只有⼀个上升沿和⼀个下降沿,如果将基准时钟倍频两倍,则需要在上升沿和下降沿之间出现⼀个边沿。于是,我们采取电路延迟的⽅式获得这⼀个边沿。时序图如下:
如果想要占空⽐为50%的时钟的话,只需要调节延迟时间为基准时钟周期的1/4即可,时序图如下:
综上,输出倍频时钟由基准时钟和延迟时钟异或得到。Verilog代码如下:
module divider(clk_Reference,ret_n,qout,clk_d);
input clk_Reference;//基准时钟
女孩英文名字大全2013input ret_n;//复位信号
stb
output qout;//倍频时钟
output reg clk_d;
always @(podge clk_Reference or negedge ret_n) begin
if(!ret_n) ;
el clk_d <= #5 ~clk_d;
end
assign qout = clk_Reference ^ clk_d;
endmodule
从原理看得出,这种⽅法利⽤的是门延迟,但是在实际情况下门延迟很难控制,这种⽅法的可靠性并不⾼。因此我常采⽤锁相环倍频电路来实现倍频。
四、锁相环(PLL)
1. 模拟锁相环
锁相环(Pha Locked Loop)是⼀种反馈控制电路,由鉴相器(PD)、环路滤波器(LPF)和压控振荡器组成。特点是利⽤外部输⼊的参考时钟控制环路内部振荡信号的频率和相位。锁相环在⼯作过程中,当输出信号的频率与输⼊信号频率相等时,环路被锁定,称为⼊锁。维持锁定的直流控制电压由鉴相器提供,因此鉴相器的两个输⼊信号间留有⼀定的相位差。电路结构如下:
(1)鉴相器
鉴相器通常由模拟乘法器组成,设外界输⼊的信号电压和压控振荡器输出端反馈电压分别为:
反馈电压中的ω0为压控振荡器的固有频率。则经过乘法器后,乘法器输出电压uD(t)为:
(2)环路滤波器
环路滤波器是⼀种低通滤波器。它的作⽤是滤除掉来⾃鉴相器输出电压中的⾼频分量和噪声分量。在上⾯uD(t)的式⼦中,和频分量(⾼频分量)对我们⽆⽤,因此此处使⽤滤波器,来获得⼲净的差频分量 uc(t)。
(3)压控振荡器
压控振荡器是⼀种以电压输⼊来控制振荡频率的震荡器。其输出⾓频率与输⼊电压之间的关系如下:
khz
其中ko为压控灵敏度。因此可通过控制电压来提升或降低压控振荡器的输出频率。改变后的电压再作为反馈信号输⼊到鉴相器中,重复多次即可使得压控振荡器输出电压频率与鉴相器输⼊的基准电压频率相同。
综上,我们只需要在反馈回路中加⼊N分频器,使得反馈信号变为原来的1/N,再利⽤锁相环的特性,就能得到N倍频率的时钟信号。电路图如下:
在使⽤Quartus做FPGA开发时,可以调⽤ip核来直接使⽤锁相环。具体调⽤操作流程别⼈有很详细的教程,此处就不解释啦。
holister2.全数字锁相环
对于全数字锁相环,是将连续信号离散化处理,故由鉴相器、数据缓冲器和数控振荡器组成。其中的数控振荡器⼀般是调节分频系数或调节DDS查表步长的⽅式实现,但这些都需要⼀个系统基准时钟,因此⽆法实现将基准时钟做到倍频,只能实现在最⾼频率时钟内的全数字锁相环。下边的转载博客提供给有需求的同学。
总结