轉自 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期
作者: 唐曉燕, 樑光勝, 王瑋,