1. 程式人生 > >FPGA三分頻,五分頻,奇數分頻

FPGA三分頻,五分頻,奇數分頻

pan 歡樂 周期 oar 2個 ron plain nts 計時

我們在做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?
  1. assign clkout=state1[1]&state2[1];
  2. always@(posedge clk)
  3. begin
  4. case(state1)
  5. begin
  6. 2‘b01:state<=2‘b10;
  7. 2‘b10:state<=2‘b11;
  8. 2‘b11:state<=2‘b01;
  9. endcase
  10. end
  11. always@(negedge clk)
  12. begin
  13. case(state2)
  14. 2‘b01:state<=2‘b10;
  15. 2‘b10:state<=2‘b11;
  16. 2‘b11:state<=2‘b01;
  17. endcase
  18. end


技術分享

同樣的,五分頻

[cpp] view plain copy print?
  1. assign clkout=state1[1]&state2[1];
  2. always@(posedge clk)
  3. begin
  4. case(state1)
  5. begin
  6. 3‘b010:state<=3‘b011;
  7. 3‘b011:state<=3‘b100;
  8. 3‘b100:state<=3‘b101;
  9. 3‘b101:state<=3‘b110;
  10. 3‘b110:state<=3‘b111;
  11. 3‘b111:state<=3‘b010;
  12. endcase
  13. end
  14. always@(negedge clk)
  15. begin
  16. case(state2)
  17. 3‘b010:state<=3‘b011;
  18. 3‘b011:state<=3‘b100;
  19. 3‘b100:state<=3‘b101;
  20. 3‘b101:state<=3‘b110;
  21. 3‘b110:state<=3‘b111;
  22. 3‘b111:state<=3‘b010;
  23. endcase
  24. end

什麽原理呢?其實這樣想挺好理解的:

三分頻,每1.5個時鐘周期就要翻轉一次,因此我們通過時鐘上升沿構造低電平占1個時鐘周期,高電平占2個時鐘周期的信號,再通過時鐘的下降沿產生相同的信號,這相當與把原信號右移了半個時鐘周期,相與後高電平被削掉了半個周期,低電平添了半個周期,就產生了1.5個時鐘周期翻轉一次的效果。

五分頻類似。

由此猜測11分頻可以由上升沿構造低電平占5個時鐘周期,高電平占6個時鐘周期的信號產生,我們來驗證一下

技術分享

驗證是的啦

轉載自:http://blog.csdn.net/lt66ds/article/details/10035187

FPGA三分頻,五分頻,奇數分頻