专栏名称: EETOP
EETOP电子网(中国电子顶级开发网)是国内最顶级的电子行业工程师社区,涉及:嵌入式、智能硬件、半导体集成电路设计及制造等。 为您分享论坛精华内容、行业最新资讯、产品及技术 。 网址:www.eetop.cn bbs.eetop.cn
目录
相关文章推荐
EETOP  ·  双11 优惠即将结束!芯片就业 & ... ·  2 天前  
EETOP  ·  芯片成本飙升 国产手机现涨价潮! ·  3 天前  
JRS玩机社  ·  599起的迷你主机 區克OUMAX 开箱实测 ·  5 天前  
JRS玩机社  ·  599起的迷你主机 區克OUMAX 开箱实测 ·  5 天前  
ZOL中关村在线  ·  Lecoo来酷M2721UL评测:4K超清画 ... ·  1 周前  
51好读  ›  专栏  ›  EETOP

奇数分频的Verilog实现

EETOP  · 公众号  · 硬件  · 2017-07-11 12:58

正文

来源:EETOP BLOG

从功能上来说,时钟分频电路主要分为整数分频和小数分频,而整数分频又分为奇数分频和偶数分频。

下面主要讲整数分频(这里讲的整数分频的占空比都是50%):

1、偶数分频

           偶数分频是分频电路中最简单的。例如我们要进行2N(N为正整数)分频(clk_2N),对于50%的占空比来说,则表明clk_2N中有N个周期的高电平和N个周期的低电平(此处的周期是指原始时钟clk的周期)。所以在Verilog实现中主要考虑两点:

1)   实现一个模N计数器

2)   在模N计数器计满时,将输出时钟翻转

根据上面的两点,写出Verilog代码

always@(posedge clk or negedge rst_n)            // 实现模N计数器
begin
if(rst_n)
count<=0;
else if(count==N-1)
count<=0;
else
count<=count+1;
end

always@(posedge clk or negdege rst_n)           // 计数器计到(N-1)将输出时钟翻转
begin
if(!rst_n)
clk_2N<=0;
else if(count==N-1)
clk_2N<=~clk_2N;
else
clk_2N<=clk_2N;
end


2、奇数分频

        当我们需要奇数(2N+1)分频,且占空比为50%时,偶数分频所采用的方法已经不适用了,因为2N+1的一半是N+0.5,单独对一个时钟计数是得不到0.5个时钟周期的,因为一个计数器只能对时钟的上升沿或者下降沿采样(不能同时采样两个边沿),所以一个周期之内只能计一次,无法得到0.5。但是我们注意到在一个时钟周期内,上升沿和下降沿之间刚好隔0.5个时钟周期。

         既然一个时钟无法得到0.5的计数,而一个时钟周期的上升沿和下降沿之间刚好隔0.5个时钟周期,综合这两点,计数分频的实现思路就出来了:采用两个完全一样的时钟,然后用两个计数器分别对这两个时钟计数,其中一个计数器采用上升沿计数,另一个计数器采用下降沿计数(相当于是一个时钟,然后两个计数器分别采样上升沿和下降沿),然后利用偶数分频的办法,利用两个计数器,得到两个中间时钟变量,然后利用两个中间时钟变量进行逻辑操作,衍生出0.5个时钟周期。

所以实现2N+1的奇数分频有以下两种思路:

1)  得到中间时钟clk1、clk2(周期为2N+1,N个周期的高电平,N+1个周期的低电平),clk1、clk2的相位相差180度,也就是clk1、clk2是分别对原始时钟的上升沿和下降沿采样得到的,相隔半个时钟周期,最后将两个时钟取或,就能在各自的时钟上加上0.5个周期的高电平,实现占空比为50%的奇数分频。

2)  上面的方法是将两个时钟取或,其实也可以取与,相当于在原来的高电平上减去0.5个周期的高电平,这就要求得到的clk1、clk2含有N+1个周期的高电平。

            根据上面的思路,写出思路1的Verilog实现代码,思路2实现类似,不做说明。

always@(posedge clk or negedge rst_n)     // 对上升沿计数
begin
if(!rst_n)
count1<=0;
else if(count1==2N)
count1<=0;
else
count1<=count1+1;
end

always@(posedge clk or negedge rst_n)  // 中间时钟clk1
begin
if(!rst_n)
clk1<=0;
esle if(count1==N||count1==2N)
clk1<=~clk1;
else
clk1<=clk1;
end

assign clk_inv = ~clk;          // 将原始时钟翻转

always@(posedge clk_inv or negedge rst_n)     // 对下降沿计数
begin
if(!rst_n)
count2<=0;
else if(count2==2N)
count2<=0;
else
count2<=count2+1;
end

always@(posedge clk_inv or negedge rst_n)  // 中间时钟clk2
begin
if(!rst_n)
clk2<=0;
else if(count2==N||count2==2N)
clk2<=~clk2;
else
clk2<=clk2;
end

assign clk_2N+1 = clk1|clk2;    // 2N+1分频时钟输出

注:由于触发器基本都是上升沿采样的,所以当我们写(negedge clk)时,综合出来的电路其实是在触发器的时钟输入端加了一级反相器,所以在上面的代码中,笔者直接采用上升沿采样,更直观的表现出最后的电路。


推荐阅读:

    史上最全数字IC&FPGA设计合集!



EETOP微信群

为了更好地便于大家交流学习,EETOP按区域组建了一些微信群,欢迎所在区域的网友加入各自的区域群,加群方法: 先加 jack_eetop 为好友,发送如下信息:加群+区域+单位(或院校)+职业。如果加入的是以省为单位的群,则需按以下格式发送加群信息:加群+省名+城市名+单位(或院校)+职业

比如: 加群+北京+利达科技+数字IC设计

加群+浙江+杭州+xxx公司+xxx设计

目前先开通如下9个区域群,欢迎对号入座。

长按二维码,加群主为好友,拉你入群

武汉   北京   合肥    苏州   上海 

深圳  成都   西安  浙江

(如果不在所在省市,也欢迎加群)

此外,我们也会陆续开通一些行业群,现已开通:

汽车电子 , GPU&FPGA深度学习物联网

(行业加群方式: )

欢迎业内人士加入

请按如下格式填写:加群+物联网(或 GPU等)+所在城市及单位

加群前请务必在朋友圈分享至少一篇EETOP的微信文章



点击阅读原文查看更多