分频器是指使输出信号频率为输入信号频率整数分之一的电子电路。在许多电子设备中如电子钟、频率合成器等,需要各种不同频率的信号协同工作,常用的方法是以稳定度高的晶体振荡器为主振源,通过变换得到所需要的各种频率成分,分频器是一种主要变换手段。 下面以Verilog HDL 语言为基础介绍占空比为50%的分频器。 1、偶分频 偶分频电路指的是分频系数为 2、4、6、8 ... 等偶数整数的分频电路,我们可以直接进行分频。 设计代码: 1 //rtl 2 module divider( 3 clk, 4 rst_n, 5 clk_div 6 ); 7 input clk; 8 input rst_n; 9 output clk_div; 10 reg clk_div; 11 12 parameter NUM_DIV = 6; 13 reg [3:0] cnt; 14 15 always @(posedge clk or negedge rst_n) 16 if(!rst_n) begin 17 cnt <= 4'd0; 18 clk_div <= 1'b0; 19 end 20 else if(cnt < NUM_DIV / 2 - 1) begin 21 cnt <= cnt + 1'b1; 22 clk_div <= clk_div; 23 end 24 else begin 25 cnt <= 4'd0; 26 clk_div <= ~clk_div; 27 end 28 endmodule
仿真程序:
View Code
可以看到,clk的上升沿,采样到cnt=2的时候,就翻转,采样到0和1的时候,保持。这样就可以做到一半高电平,一半低电平。 2、奇分频
由于奇分频需要保持分频后的时钟占空比为 50% ,所以不能像偶分频那样直接在分频系数的一半时使时钟信号翻转(高电平一半,低电平一半)。 在此我们需要利用输入时钟上升沿和下降沿来进行设计。 接下来我们设计一个 5 分频的模块,设计思路如下:
采用计数器 cnt1 进行计数,在时钟上升沿进行加 1 操作,计数器的值为 0、1 时,输出时钟信号 clk_div 为高电平;计数器的值为2、3、4 时,输出时钟信号 clk_div 为低电平,计数到 5 时清零,从头开始计数。我们可以得到占空比为 40% 的波形 clk_div1。
采用计数器 cnt2进行计数,在时钟下降沿进行加 1 操作,计数器的值为 0、1 时,输出时钟信号 clk_div 为高电平;计数器的值为2、3、4 时,输出时钟信号 clk_div 为低电平,计数到 5 时清零,从头开始计数。我们可以得到占空比为 40% 的波形 clk_div2。
clk_div1 和clk_div2 的上升沿到来时间相差半个输入周期,所以将这两个信号进行或操作,即可得到占空比为 50% 的5分频时钟。程序如下: 设计代码:
View Code
仿真代码:
View Code
对其进行测试和验证(此仿真波形是三分频,占空比50%),即上述程序吧NUM_DIV改成3即可,得到如下波形: 3.任意占空比的任意分频 在verilog程序设计中,我们往往要对一个频率进行任意分频,而且占空比也有一定的要求这样的话,对于程序有一定的要求。 设计代码:
View Code
仿真代码:
View Code
分频的应用很广泛,一般的做法是先用高频时钟计数,然后使用计数器的某一位输出作为工作时钟进行其他的逻辑设计,上面的程序就是一个体现。 设计代码:
View Code
仿真代码:
View Code
继续让我们来看如何实现任意占空比,比如还是由50M分频产生880Hz,而分频得到的信号的占空比为30%。
56818×30%=17045
设计代码:
View Code
仿真代码:
View Code
4 小结
通过以上几个例子对比不难发现,借助计数器来实现任意点空比的任意分频的方法简单,且用verilog语言进行行为描述时,代码简洁、易懂、通用。
通过以上的学习,对分频器有了比较深刻的认识,将在以后的学习中会有广泛的应用。 原出处:https://www./article/166 如有什么疑问,欢迎讨论:QQ:447574829
|
|