基于FPGA的整数倍分频器设计.doc

上传人:白大夫 文档编号:3410463 上传时间:2019-08-22 格式:DOC 页数:9 大小:32.50KB
返回 下载 相关 举报
基于FPGA的整数倍分频器设计.doc_第1页
第1页 / 共9页
亲,该文档总共9页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《基于FPGA的整数倍分频器设计.doc》由会员分享,可在线阅读,更多相关《基于FPGA的整数倍分频器设计.doc(9页珍藏版)》请在三一文库上搜索。

1、基于FPGA的整数倍分频器设计1、前言分频器是FPGA设计中使用频率非常高的基本单元之一。尽管目前在大部分设计中还广泛使用集成锁相环(如Altera的PLL,Xilinx的DLL)来进行时钟的分频、倍频以及相移设计,但是,对于时钟要求不太严格的设计,通过自主设计进行时钟分频的实现方法仍然非常流行。首先这种方法可以节省锁相环资源,再者这种方式只消耗不多的逻辑单元就可以达到对时钟的操作目的。2、整数倍分频器的设计2.1 偶数倍分频偶数倍分频器的实现非常简单,只需要一个计数器进行计数就能实现。如需要N分频器(N为偶数),就可以由待分频的时钟触发计数器进行计数,当计数器从0计数到N/2-1时,将输出时

2、钟进行翻转,并给计数器一个复位信号,以使下一个时钟开始从零计数。以此循环,就可以实现偶数倍分频。以10分频为例,相应的verilog代码如下:regclk_div10;reg 2:0cnt;always(posedge clk or posedge rst) beginif(rst)begin /复位cnt=0;clk_div10=0;endelseif(cnt=4) begincnt=0; /清零clk_div10=clk_div10; /时钟翻转endelsecnt=cnt+1;end2.2 奇数倍分频奇数倍分频因占空比不同,主要有以下两种方法。对于非50%占空比的分频,与偶数倍分频类似,

3、只需要一个计数器就能实现特定占空比的时钟分频。如需要1/11占空比的十一分频时钟,可以在计数值为9和10时均进行时钟翻转,该方法也是产生抽样脉冲的有效方法。相应的verilog代码如下:always (posedge clk or posedge rst) beginif(rst)begin /复位cnt=0;clk_div11=0;endelseif(cnt=9) beginclk_div11=clk_div11; /时钟翻转cnt=cnt+1; /继续计数endelseif(cnt=10) beginclk_div11=clk_div11; /时钟翻转cnt=0; /计数清零endelse

4、cnt=cnt+1;end对于50%奇数分频器的设计,用到的思维是错位半个时钟并相或运算。具体实现步骤如下:分别利用待分频时钟的上升沿与下降沿进行(N-1)/2)/N分频,最后将这两个时钟进行或运算即可。以三分频为例,相应的电路原理图和时序仿真图如图1和图2所示,相应代码如下:reg clk1;reg1:0cnt1;always(posedge clk or posedge rst) beginif(rst)begin /复位cnt1=0;clk1=0;endelseif(cnt1=1) beginclk1=clk1; /时钟翻转cnt1=cnt1+1; /继续计数endelseif(cnt1

5、=2) beginclk1=clk1; /时钟翻转cnt1=0; /计数清零endelsecnt1=cnt1+1;endreg clk2;reg1:0cnt2;always(negedge clk or posedge rst) beginif(rst)begin /复位cnt2=0;clk2=0;endelseif(cnt2=1) beginclk2=clk2; /时钟翻转cnt2=cnt2+1; /继续计数endelseif(cnt2=2) beginclk2=clk2; /时钟翻转cnt2=0; /计数清零endelsecnt2=cnt2+1;endassignclk_div3=clk1

6、 | clk2; /或运算图1 50%占空比的三分频电路原理图图2 50%占空比的三分频时序仿真图3、小数倍分频器的设计3.1 半整数分频器半整数N+0.5分频器设计思路:首先进行模N+1的计数,在计数到N时,将输出时钟赋值为1,而当回到计数0时,又赋值为0,这样,当计数值为N时,输出时钟才为1。因此,只要保持计数值N为半个时钟周期即是该设计的关键。从中可以发现。因为计数器是通过时钟上升沿计数,故可在计数为N时对计数触发时钟进行翻转,那么,时钟的下降沿就变成了上升沿。即在计数值为N期间的时钟下降沿变成了上升沿。也就是说,计数值N只保持了半个时钟周期。由于时钟翻转下降沿变成上升沿,因此,计数值变

7、为0。所以,每产生一个N+0.5分频时钟的周期,触发时钟都要翻转一次。图3给出了通用半整数分频器的电路原理图。以2.5倍分频为例,相应的电路verilog代码如下,时序仿真图如图4所示。/异或运算assignclk_in=clk有哪些作文lk_div2;/模3计数器reg clk_out;reg 1:0cnt;always(posedge clk_in or posedge rst) beginif(rst)begin /复位cnt=0;clk_out=0;endelseif(cnt=1) beginclk_out=clk_out; /时钟翻转cnt=cnt+1; /继续计数endelseif

8、(cnt=2) beginclk_out=clk_out; /时钟翻转cnt=0; /计数清零endelsecnt=cnt+1;end/2分频reg clk_div2;always(posedge clk_out or posedge rst) beginif(rst) clk_div2=0; /复位else clk_div2=clk_div2;end图3 通用半整数分频器的电路原理图图4 2.5倍分频器时序仿真图3.2 任意小数分频器小数分频器的实现方法有很多中,但其基本原理都一样的,即在若干个分频周期中采取某种方法使某几个周期多计或少计一个数,从而在整个计数周期的总体平均意义上获得一个小数

9、分频比。一般而言,这种分频由于分频输出的时钟脉冲抖动很大,故在设计中的使用已经非常少。但是,这也是可以实现的。以8.7倍分频为例,本文仅仅给出双模前置小数分频原理的verilog代码及其仿真图(如图6),具体原理可以参考刘亚海的基于FPGA的小数分频器的实现以及毛为勇的基于FPGA的任意小数分频器的设计。图5 小数分频器的电路原理图/8分频reg clk_div8;reg2:0cnt_div8;always(posedge clk or posedge rst) beginif(rst)begin /复位clk_div8=0;cnt_div8=0;endelseif(cnt_div8=3d7)

10、 beginclk_div8=1; /置1cnt_div8=0;endelseif(cnt_div8=3d0) beginclk_div8=0; /置0cnt_div8=cnt_div8+1;endelsecnt_div8=cnt_div8+1;end/9分频reg clk_div9;reg3:0cnt_div9;always(posedge clk or posedge rst) beginif(rst)begin /复位clk_div9=0;cnt_div9=0;endelseif(cnt_div9=3d8) beginclk_div9=1; /置1cnt_div9=0;endelseif

11、(cnt_div9=3d0) beginclk_div9=0; /置0cnt_div9=cnt_div9+1;endelsecnt_div9=cnt_div9+1;end/控制信号parameterDiv8Num=3;reg ctrl;reg3:0AddValue;always(posedge clk or posedge rst) beginif(rst)begin /复位ctrl=0;AddValue=10-7;endelseif(AddValue10) beginctrl=0;AddValue=AddValue+Div8Num;endelse beginctrl=1;AddValue=AddValue-10;endend/选择输出reg clk_out;always (ctrlor posedge clk or posedge rst) beginif(rst) clk_out=0; /复位elseif(ctrl) clk_out=clk_div8;elseclk_out=clk_div9;end图6 8.7分频器的时序仿真图4、总结分频器是FPGA的基础,而且在FPGA逻辑电路设计的时候是经常使用的,希望大家对以上的整数倍分频和半整数倍分频能熟练掌握。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1