您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于verilog的分频器设计-(可实现任意整数分频)
1.讲废话就像鱼儿离不开水一样,在CPLD/FPGA的世界里,没有时钟也是万万不行的。不仅如此,有时候在我们的设计中或多或少会需要用到不同频率的时钟信号,这就要求我们对系统时钟进行分频。如果你现在去网上搜索关于FPGA分频器的设计,会有不少大牛已经做出来了。比如“任意奇数分频”“任意偶数分频”“任意小数分频”,类似云云。作为一个爱折腾的小菜,我总是觉得,搞这么多好麻烦哦,我不就是需要分一下频嘛,干哈还要整出这么多样式出来,顿时觉得不会再爱了。后来的后来,我实在受不了这么多种分频方法给我带来的困扰和烦恼,决定来一个大统一,把“任意偶数分频”和“任意奇数分频”整合成一个模块,实现“任意整数分频”。所以,各位大大们,如果实在没事儿,就不要再“捡肥皂”了,试一试下面的分频方法吧,相信会让你在以后的FPGA道路上走得更加顺畅和游刃有余。2.晒干货例化时,仅需要按您的需求修改代码中带★号的参数ps.这里只有一处需要修改/******************************************************************************************Author:BobLiuE-mail:shuangfeiyanworld@163.comDevice:EP2C8Q208C8Tool:Quartus8.1Function:实现时钟的任意分频Version:2012-1-9v1.0********************************************************************************************/modulediv_N(inputCLK,//基准时钟outputCLK_div_N//N分频后得到的时钟);wire[31:0]N=20;//★N为分频系数,N≥2即可,N的值为CLK除以CLK_div_N后取整(四舍五入)/********************产生备用时钟1***************/reg[31:0]cnt1;regCLK_div_N_1;always@(posedgeCLK)beginif(N[0]==0)//如果N为偶数,比N%2==0这种判断方式更节省资源beginif(N==2)//如果N为2CLK_div_N_1=~CLK_div_N_1;elsebeginif(cnt1==((N-2)1))//比cnt1==(N-2)/2这种判断方式更节省资源begincnt1=0;CLK_div_N_1=~CLK_div_N_1;endelsecnt1=cnt1+1;endendelse//如果N为奇数beginif(cnt1==N-1)cnt1=0;elsecnt1=cnt1+1;if((cnt1==N-1)||(cnt1==(N-1)/2))CLK_div_N_1=~CLK_div_N_1;else;endend/***********************产生备用时钟2*********************/wireCLK0=(N%2)?(~CLK):0;//如果N为偶数,备用时钟2(CLK_div_N_2)恒为0,即不需要用到此备用时钟reg[31:0]cnt2;regCLK_div_N_2;always@(posedgeCLK0)beginif(cnt2==N-1)cnt2=0;elsecnt2=cnt2+1;if((cnt2==N-1)||(cnt2==(N-1)/2))CLK_div_N_2=~CLK_div_N_2;end/********************产生最终分频时钟************************/assignCLK_div_N=CLK_div_N_1|CLK_div_N_2;endmodule3.扯犊子忘了交代一点,上面的设计可实现任意整数分频,任意小数分频这样的精度要求还没有加进去,请小伙伴儿们见谅啊。不过根据我的使用经验,可实现任意整数分频就够了,反正我目前还没遇到过非要采用小数分频才能用的高要求。
本文标题:基于verilog的分频器设计-(可实现任意整数分频)
链接地址:https://www.777doc.com/doc-7171679 .html