原创 奇数倍分频(Verilog)

2009-2-18 23:47 7120 8 9 分类: FPGA/CPLD

奇数倍分频(Verilog<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


奇数倍分频的方法:(5分频为例)


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />点击看大图



(n=N-1)
,图中,COUNT0采用上沿计数,COUNT1采用下沿计数,DIV0DIV1是分别是上沿触发器和下沿触发器的输出,计数为0~n/2-1)时DIV0DIV1<='1' 此处为0~1,计数为n/2~n-1)时DIV0DIV1<='0'此处为2~4DIV5_CLKDIV0DIV1的或门输出。
在使用该电路时,需要注意:
1DIV0DIV1DIV5_CLK的约束要严,越快越好。不然,无法保证1:1的占空比。
2MCLK频率要求较高,尽量不要出现窄脉冲,尤其是在高频电路里。
3COUNT1可有可无,视时钟频率高低而定。频率越高,COUNT1越需要。


 


奇数倍分频(5分频)的方法:  


`timescale 1ns / 1ps


 


module div(MCLK,DIV5_CLK,DIV0,DIV1,COUNT0);


 


input  MCLK;                 //时钟输入


 


output DIV5_CLK;             //5分频输出


output DIV0,DIV1;             //(N-1)/2分频输出


reg DIV0;


reg DIV1;


 


parameter N = 5;                 // 设置分频数N(奇数)


parameter M = 2;                 // (N-1)/2


 


output [2:0]COUNT0;              //计数器计数寄存器


reg[2:0] COUNT0;


reg[2:0] COUNT1;


 


always@(posedge MCLK)          //MCLK上升沿分频


    begin


           if(COUNT0==2)


         begin


           DIV0=0;


         end


       else if(COUNT0==5)


          begin


                    COUNT0=0;


            DIV0=1;


          end


                     COUNT0=COUNT0+1;


    end


 


always@(negedge MCLK)         //MCLK下降沿分频


    begin


           if(COUNT1==2)


         begin


           DIV1=0;


         end


       else if(COUNT1==5)


         begin


            DIV1=1;


            COUNT1=0;


         end


                     COUNT1=COUNT1+1;


    end


 


assign DIV5_CLK=DIV0|DIV1;     //两路(N-1)/2分频输出相或


 


endmodule


 


 


Post-Route Simulation仿真输出:


 


点击看大图



 


   当要去其他奇数分频数时,可以改变NM的值


parameter N = 5;                 // 设置分频数N(奇数)


parameter M = 2;                 // (N-1)/2


 


为了方便观察,增加DIV0DIV1两个输出信号,波形仿真如下:


 

点击看大图 



 


   我在编写程序的时候,开始的时候always里写成了非阻塞赋值了,仿真结果错误,错误程序如下:


 


always@(posedge MCLK)          //MCLK上升沿分频


    begin


           if(COUNT0==M)


         begin


           DIV0<=0;


         end


       else if(COUNT0==N)


          begin


                    COUNT0<=0;


             DIV0<=1;


          end


                     COUNT0<=COUNT0+1;


    end


 


仿真波形如下:



 

点击看大图 


 

可以看到计数器COUNT0根本没有在COUNT0==5的时候归零,这是为什么呢?这是由于我没有很好理解非阻塞和阻塞赋值的区别,这里用到非阻塞,导致if里面的幅值与COUNT0<=COUNT0+1是同时进行的,也就是说当COUNT==5时,理应COUNT归零,当这时COUNT0<=COUNT0+1COUNT0==6if也就无效了。所以要注意非阻塞与阻塞赋值的差别:(可参考我转载的另两篇博文)


Verilog 非阻塞赋值的仿真/综合问题(一)


Verilog 非阻塞赋值的仿真/综合问题(二)


 


也可以改成


 


always@(posedge MCLK)


    begin


           if(COUNT0==1)


         begin


                        DIV0<=0;


                            COUNT0<=COUNT0+1;


         end


       else if(COUNT0==4)


          begin


                    COUNT0<=0;


            DIV0<=1;


          end


               else COUNT0<=COUNT0+1;


        end


 


always@(negedge MCLK)


    begin


           if(COUNT1==1)


         begin


                        DIV1<=0;


                            COUNT1<=COUNT1+1;


         end


       else if(COUNT1==4)


          begin


                    COUNT1<=0;


            DIV1<=1;


          end


               else COUNT1<=COUNT1+1;


        end


 


assign DIV5_CLK=DIV0|DIV1;


 


Post-Route Simulation仿真输出:



 

点击看大图


 


     通常的计数器都是用非阻塞赋值的,基本上的代码如上,if……else……


 


本文工程文件:https://static.assets-stash.eet-china.com/album/old-resources/2009/2/18/1fce3a90-f22e-4153-8f18-31740b2b5b67.rar


 

参考资料:


1)            N倍奇数分频器.(Verilog) -- 小時不識月


http://blog.ednchina.com/2006tx_yafeng/146438/message.aspx


2(原創) 如何設計除頻器? (SOC) (Verilog) (MegaCore) - OO无双博客园


http://www.cnblogs.com/oomusou/archive/2008/07/31/verilog_clock_divider.html


3)            奇数分频(5分频器为例)--shuhuai


http://old.blog.edu.cn/user2/52459/archives/2008/2166031.shtml


4)            任意数分频(包括奇偶数和小数)的各种设计方法[综合电子]_老古开发网文章


http://www.laogu.com/wz_1260.htm

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户448481 2014-8-23 10:43

还是用最后一种分频吧,时序电路用非阻塞赋值

coyoo 2014-2-20 09:57

这跟语言没有关系,唯一区别是添加综合属性的语法有些区别而已。

用户1530460 2014-2-19 20:17

verilog中怎么加才能不让优化?

ytuxiaobin_573863401 2013-11-27 17:15

这两种方法都试过,一样的效果,在对信号加了signaltap监控之后,可以防止信号在布线的时候被优化掉,然后禁止signaltap有一定的几率在布线时候不被优化

coyoo 2013-11-27 15:57

哪种方法?我这里介绍了不止一种方法。

ytuxiaobin_573863401 2013-11-27 14:27

我通过试验验证,这种方法在RTL级确实没有优化掉,但是在布线后,通过chip planer看,添加的lce还是被优化掉了
相关推荐阅读
藤井树 2015-10-12 14:43
印制电路板的抗干扰设计 zz
印制电路板的抗干扰设计     作者:中船重工集团第707所 肖麟芬   摘   要:本文以印制电路板的电磁兼容性为核心,分析了电磁干扰的产生机理...
藤井树 2013-10-22 15:32
2010.5.30 黄草梁上包饺子一日登山活动——摘韭菜篇
        上次桃花节的时候也有野韭菜,那时候的我连草和韭菜叶分不清,才回去的韭菜也不敢吃,哈哈,这次可算真正见识了韭菜,黄草梁也叫韭菜梁,因为满山遍野都是野韭菜而闻名,比较圆比较粗的就是野韭...
藤井树 2013-10-22 15:28
2010.5.30 黄草梁上包饺子一日登山活动——包饺子篇
摘韭菜回来,大家已经忙开了 我也装模作样地“工作着” 哈哈,还不让我包,包饺子是技术活,一定要皮薄馅厚才有资格包,像我这样的只能旁观了 摘的韭菜应该足够了,旁边那个袋子是我摘来带回学校的 ...
藤井树 2013-08-09 15:19
datasheet下载网站整理(查IC芯片手册)【原创】
*************************************************************************         作为电子工程师,芯片的dat...
藤井树 2010-06-04 00:21
陈伟宁王辉一家捐助渠道(北京菲亚特—英菲尼迪)
       王辉的最新消息请关注 http://chenweining.org/       目前事故责任认定已经出来了——陈家全责。        发信人: program (程序), 信区: D...
藤井树 2010-06-01 13:43
2010.5.30 黄草梁上包饺子一日登山活动——美景篇
这天不得不说的是天空,蓝蓝的天空,白白的云    绿油油的山脊  我、洪涛哥哥、huangna妹妹还有她同事小艾走在黄草梁上    在蓝天白云下合影       阳光照过来,景色真美 象鼻山,走不...
EE直播间
更多
我要评论
1
8
关闭 站长推荐上一条 /3 下一条