N-0.5倍分頻(Verilog)

轉自  http://bbs.ednchina.com/BLOG_ARTICLE_200329.HTM


採用模N計數器可以實現。對於進行n+0.5分頻,首先進行模n的計數,在計數到n-1時,輸出時鐘賦爲‘1’,回到計數0時,又賦爲0,因此,可以知道,當計數值爲n-1時,輸出時鐘才爲1,因此,只要保持計數值n-1爲半個輸入時鐘週期,即實現了n+0.5分頻時鐘,因此保持n-1爲半個時鐘週期即是一個難點。具體如下:因爲計數器是通過時鐘上升沿計數,因此可以在計數爲n-1時對計數觸發時鐘進行翻轉,那麼時鐘的下降沿變成了上升沿。即在計數值爲n-1期間的時鐘下降沿變成了上升沿,則計數值n-1只保持了半個時鐘週期,由於時鐘翻轉下降沿變成上升沿,因此計數值變爲0。因此,每產生一個n-0.5分頻時鐘的週期,觸發時鐘都是要翻轉一次。這個過程所要做的就是對CLK進行適當的變換,使之送給計數器的觸發時鐘每經歷N-0.5個週期就翻轉一次。N-0.5倍:取N=3,分頻原理示意圖如下:


 


  clk爲爲輸入時鐘;


  divclk爲計數器計數時鐘;


 


 


點擊看大圖


 



 


原理框圖如下:


 


 


點擊看大圖


 



  程序


代碼如下:


module divN_half(clk,divN_half);


 


input clk;            //時鐘輸入


output divN_half;     //N-0.5輸出


 


parameter N = 3;     // 設置分頻數N-0.5中的N


parameter M = 1;     // 2^(M+1)>3


 


reg [M:0]count;


reg divN_half;


reg div2;


 


assign divclk="clk"^div2;              //時鐘輸入與2分頻異或


 


always@(posedge divclk)                  //N計數器


  begin


     if(count<N-1)


            begin


               count<=count+1;


                       divN_half<=0;


                end


         else


            begin


               count<=0;


                       divN_half<=1;


                end


  end


 


always@(posedge divN_half)              //2分頻


   begin


           div2<=~div2;


   end


 


endmodule


 


Post-Route Simulation的仿真波形如下:


 


點擊看大圖


 



可以看到,實現了N-0.5(N=3,3-0.5=2.5)分頻。


 


觀察的波形信號加上divclk(計數器計數時鐘)、div2(二分頻信號),可以看到仿真波形如預期。



 


點擊看大圖


 


 當設計N取其他數時,可以在程序中改參數:


parameter N = 3;     // 設置分頻數N-0.5中的N


parameter M = 1;     // 2^(M+1)>3


 


本文工程文件:http://space.ednchina.com/Upload/2009/2/18/5667006d-7df7-44bd-8de2-ea92191ceca1.rar


 


參考資料:


1)     任意數分頻(包括奇偶數和小數)的各種設計方法[綜合電子]_老古開發網文章


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


2)     任意分頻的verilog語言實現_淡淡啲菋噵


http://hi.baidu.com/wan_yi/blog/item/d8c997990f3d6d0d6f068c4b.html


3)  用Verilog實現基於FPGA的通用分頻器,<<電子與電腦>>2006年 第05期 
作者: 唐曉燕, 樑光勝, 王瑋,


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章