FPGA三分頻,五分頻,奇數分頻
我們在做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
- 2‘b01:state<=2‘b10;
- 2‘b10:state<=2‘b11;
- 2‘b11:state<=2‘b01;
- endcase
- end
- always@(negedge clk)
- begin
- case(state2)
- 2‘b01:state<=2‘b10;
- 2‘b10:state<=2‘b11;
- 2‘b11:state<=2‘b01;
- endcase
- end
同樣的,五分頻
[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個時鐘周期的信號產生,我們來驗證一下
驗證是的啦
轉載自:http://blog.csdn.net/lt66ds/article/details/10035187
FPGA三分頻,五分頻,奇數分頻