今天就跟大家聊聊有关Verilog如何实现偶数、奇数、半整数、分数分频以及画电路图用D触发器实现分频,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
通常我们说对原时钟进行N分频,即分频后的时钟的一个周期是原时钟周期的N倍。N可以为偶数、奇数、半整数、分数(小数)。
1.偶数分频
Verilog:N为偶数,使用一个计数器循环0-(N-1)进行计数,在N/2-1与N-1分别将输出取反,即完成了N分频。
若果采用D触发器画出分频器,单个D触发器的反向输出到输入就构成了一个简单的2分频器,以此为基础,其分频输出作为下一级D触发器的时钟,如此串联起来,x个串联就是2^x分频,属于偶数分频,如图1[1].
图1 用D触发器分频
2.奇数分频
Verilog:N为奇数,使用一个计数器循环0-(N-1)进行计数,控制(N-1)/2个高电平,(N+1)/2个低电平,称为A;然后将此A电平信号延迟半个时钟周期称为B,最后输出C = A|B,即为占空比为50%的奇数分频器。另一种方案是(N+1)/2个高电平,(N-1)/2个低电平,那么最后输出C=A&B。
以C = A|B为例,将A延时半个时钟周期的方法有2种,方法1是直接使用下降沿的锁存器对A锁存得到B,方法2得到B的原理与A相同,不过是在下降沿检测(假设A是上升沿检测)。
图2 奇数分频波形
采用D触发器的话,采用方法1,用一个下降沿的D触发器锁存A=clkp1得到信号B=clkn1,把信号A和信号B做逻辑“与”就得到了占空比50%的分频时钟信号clkout[1]。
图3奇数分频
下面给出N为正整数的分频器设计,主要原理是N[0]=1为奇数分频,0为偶数分频。
module practice_demo( input clk, input arst, output clk_div ); parameter N = 5;reg [2:0] cnt;reg clk_a;reg clk_b;wire clk_c; always@(posedge clk or posedge arst)begin if(arst) cnt <= 0; else if(cnt == N-1) cnt <= 0; else cnt <= cnt + 1; end always@(posedge clk or posedge arst)begin if(arst) clk_a<= 0; else if(cnt == (N-1)/2 || cnt == N-1) clk_a<= ~clk_a; else clk_a<= clk_a; end /*****************方法1**********************/always@(negedge clk or posedge arst)begin if(arst) clk_b <= 0; else clk_b <= clk_a;end/******************方法2********************///always@(negedge clk or posedge arst)//begin// if(arst)// clk_b<= 0;// else if(cnt == (N-1)/2 || cnt == N-1)// clk_b<= ~clk_b;// else// clk_b<= clk_b; //end/*********************************************/ assign clk_c = clk_a | clk_b;//N[0]=1奇数,否则偶数assign clk_div = N[0] ? clk_c : clk_a; endmodule
3 半整数分频
说明:占空比非50%
网上广为流传的一种分频结果是,半分频多出来那半个周期为高电平,其余为低电平。例如N=5.5,以原时钟的一半为单位,可以分频输出1高10低。原理是用计数器循环计数0-10即11个周期,控制输出X前6周期高电平,后5周期低电平,然后再使用计数器得到一个下降沿触发的5低6高的输出Y,最后输出Z = X&Y。
图4半整数分频的波形
给出Verilog设计:
module for_practice(input clk,input arst,output clk_div );parameter N = 5;//5.5分频reg[31:0]cnt1;reg clkx;reg clky;always@(posedge clk or posedge arst)begin if(arst) cnt1 <= 0; else if(cnt1 == 2*N) cnt1 <= 0; else cnt1 <= cnt1+ 1; end always@(posedge clk or posedge arst)begin if(arst) clkx <= 0; else if(cnt1 == 2*N)////// clkx <= 1; else if(cnt1 == N)/////// clkx <= 0; end always@(negedge clk or posedge arst)begin if(arst) clky <= 0; else if(cnt1 == 0)/////// clky <= 0; else if(cnt1 == N)////// clky <= 1; end assign clk_div = clkx & clky; endmodule
另外一种做法是想得到接近50%的占空比,例如5分频得到3个高电平,2.5个低电平,其思路是控制clk,使得计数器值等于某一值只保持半个周期。参考[3]
4分数(小数)分频
此部分主要参考[1][2].
说明:占空比非50%
比如8.7分频。因为没办法用计数器表示0.7这种数字,所以就用一个等效的概念来进行8.7分频,原时钟87个周期的总时间等于分频后的时钟10个周期的总时间;
先做3次8分频得到时钟周期数是24,再做7次9(8加1)分频得到时钟周期数63,总共就87个时钟周期;在这87个时钟周期里面分频时钟跳变20次总共10个周期。分数分频器的原理可以用下图来概括。
图5分数分频的原理
用整数部分zn(=8)作为一个分频系数,zn加1(=9)作为另外一个分频系数组成一个小数分频器。
根据上面的原理可以列出下面的二元一次方程组
zn*N+(zn+1)*M=87 ……(1)
N+M=10 ……(2)
可以解出N和M的值分别是3和7。
ACC计数器设计,在这里ZN=8:
ACC计数器就是控制做N次ZN分频和M次ZN+1次分频,具体控制过程可以分为以下几种情况:
第1种情况 :先做N次ZN分频,再做M次ZN+1次分频;
第2种情况:先做M次ZN+1次分频,再做N次ZN分频;
第3种情况 :把N次ZN分频平均插入到M次ZN+1分频中;
第4种情况 :把M次ZN+1次分频平均插入到N次ZN分频中。
组合N次ZN分频和M次ZN+1次分频的情况很多。第1、2种情况前后时钟频率不太均匀,因此相位抖动比较大;
第3、4种情况前后时钟频率均匀性稍好,因此相位抖动会减小,因此最终采用3或4。如图6
图6分数分频的几种控制过程
看完上述内容,你们对Verilog如何实现偶数、奇数、半整数、分数分频以及画电路图用D触发器实现分频有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/220006.html