我們在做fpga設計時,有時會用到時鐘頻率奇數分頻的頻率,例如筆者fpga的晶振為50m,當我們需要10m的時鐘時,一種方式可以使用dcm或pll獲取,系統會內部分頻到10m,但其實verilog內部也完全能實現,所以我們還是來了解一下。有這樣乙個歡樂的時鐘了,我們要得到以下的分頻效果:
奇數分頻的難點就在於,三分頻要求1.5倍的時鐘時間翻轉一次,這樣整體的週期時間是原來的3倍,即三分頻。五分頻亦類似。而恰恰verilog不允許你在兩個always模組裡對同一reg賦值。
那怎麼得到三分頻的時鐘呢?請看下圖
如果生成這樣乙個占空比2/3,週期三倍於時鐘的訊號(2行)。同時產生乙個超前或落後於它半個clock週期時間的訊號(3行),對兩訊號做與運算
,得到的結果就恰好是三分頻的時鐘(4行);而verilog中恰好不允許你在兩個always模組裡對同一reg賦值,但允許你在clock的posedge和negedge分別對兩個不相關的訊號賦值。
同樣的,五分頻
[cpp]view plain
copy
print?
assign clkout=state1[1]&state2[1];
always@(posedge clk)
begin
case(state1)
begin
3'b010:state<=3'b011;
3'b011:state<=3'b100;
3'b100:state<=3'b101;
3'b101:state<=3'b110;
3'b110:state<=3'b111;
3'b111:state<=3'b010;
endcase
end
always@(negedge clk)
begin
case(state2)
3'b010:state<=3'b011;
3'b011:state<=3'b100;
3'b100:state<=3'b101;
3'b101:state<=3'b110;
3'b110:state<=3'b111;
3'b111:state<=3'b010;
endcase
end
什麼原理呢?其實這樣想挺好理解的:
三分頻,每1.5個時鐘週期就要翻轉一次,因此我們通過時鐘上公升沿構造低電平佔1個時鐘週期,高電平佔2個時鐘週期的訊號,再通過時鐘的下降沿產生相同的訊號,這相當與把原訊號右移了半個時鐘週期,相與後高電平被削掉了半個週期,低電平添了半個週期,就產生了1.5個時鐘週期翻轉一次的效果。
五分頻類似。
由此猜測11分頻可以由上公升沿構造低電平佔5個時鐘週期,高電平佔6個時鐘週期的訊號產生,我們來驗證一下
驗證是的啦
FPGA三分頻,五分頻,奇數分頻
我們在做fpga設計時,有時會用到時鐘頻率奇數分頻的頻率,例如筆者fpga的晶振為50m,當我們需要10m的時鐘時,一種方式可以使用dcm或pll獲取,系統會內部分頻到10m,但其實verilog內部也完全能實現,所以我們還是來了解一下。有這樣乙個歡樂的時鐘了,我們要得到以下的分頻效果 奇數分頻的難...
verilog奇數分頻,三分頻例項
目的 輸入乙個時鐘訊號,輸出占空比為50 的三分頻。首先得到乙個占空比為1 3的分頻時鐘,然後將輸入訊號取反,得到乙個移相180度的占空比為1 3的分頻時鐘,將兩個時鐘相或得到目的時鐘。verilog module divider 3 input clk,clock input rst n,asyn...
FPGA三分頻電路的實現
最近剛開始學習fpga,準備使用verlog實現一些分頻電路,偶數倍分頻比較好操作,奇數倍分頻相對來說要複雜一點點,我在網上查閱了一些資料,我來用我自己的話總結下。使用乙個計數器 對基準時鐘的上公升沿和下降沿計數。計數範圍 0 n 1 在n 1對輸出訊號進行翻轉並復位計數值。以三分頻為例子,下面給出...