【FPGA学习】时钟分频
概況:
用一個頻率塊的時鐘產生一個頻率小的時鐘
實驗目的:
掌握任意就分頻的寫法
原理:
一般來說 開發板上面只有一個晶振,即只有一種時鐘頻率,但是我們有時候需要用到不同頻率的時鐘,若想要更慢的時鐘,則可以將該固定的是何種進行分頻,若想要更快的時鐘,則可以在這個固定的時鐘上進行倍頻。無論是分頻還是倍頻,我們都有兩種方法,一種你是使用pll核,另外一種是手動用verilog hdl描述。(適用于整數比的分頻),只有調用pll核才能進行倍頻,一般在進行非整數比的分頻或者倍頻的情況下都使用pll核pll為專用電路他生成的時鐘到每一級寄存器時間延遲是固定的,稱這個時鐘網絡的時鐘偏斜比較小
???? 假如我們要做一個四分頻(當前時鐘周期的四倍)的時鐘,首先我們需要確定是否有四個周期的,然后用一個計數器來記時鐘的周期的個數,將連續的一般固定時鐘周幾設置為高(1),另外連續的一半設置為低(0)。、
四分頻
module div_clk_4(input wire clk,input wire rst,//高電平有效,XILINX器件提倡高電平有效output reg clk_4);reg [1:0] div_cnt;always @(posedge clk )begin if(rst == 1'b1)begindiv_cnt <= 'd0;endelse if(div_cnt == 2'd3) begin div_cnt <= 'd0; endelse begindiv_cnt <= div_cnt + 1'b1;end endalways @(posedge clk )begin if(rst == 1'b1)beginclk_4 <= 1'b0;endelse if (div_cnt == 2'd1)beginclk_4 <= 1'b1;endelse if (div_cnt == 2'd3)beginclk_4 <= 1'b0;endend endmoduletesbench
`timescale 1ns/1ns module tb_div_clk_4();reg clk;reg rst;wire clk_4;div_clk_4 u_div_clk_4(.clk (clk),.rst (rst),.clk_4 (clk_4)); always #10 clk = ~clk;initial beginclk = 0;rst = 1;#100rst = 0;//退出復位end endmodule?
?十六分頻
/* */ module div_clk_16(input wire clk,input wire rst,output reg [1:0] po_cnt = 'd0);reg [1:0] div_cnt;reg clk_4;always @(posedge clk )begin if(rst == 1'b1)begindiv_cnt <= 'd0;endelse if(div_cnt == 2'd3) begindiv_cnt <= 'd0; endelse begindiv_cnt <= div_cnt + 1'b1;end endalways @(posedge clk )begin if(rst == 1'b1)beginclk_4 <= 1'b0;endelse if (div_cnt == 2'd1)beginclk_4 <= 1'b1;endelse if (div_cnt == 2'd3)beginclk_4 <= 1'b0;endendalways @(posedge clk_4 )beginif(rst == 1'b1)beginpo_cnt <= 1'b0;endelse if (po_cnt == 2'd3)beginpo_cnt <= 'd0;endelse beginpo_cnt <= po_cnt + 1'b1;endend endmodule?tesbench
`timescale 1ns/1ns module tb_div_clk_16();reg clk;reg rst;wire [1:0] po_cnt;div_clk_16 u_div_clk_16(.clk (clk),.rst (rst), .po_cnt (po_cnt)); always #10 clk = ~clk;initial beginclk = 0;rst = 1;#100rst = 0;end endmodule可見po_cnt信號出現異常,這是由于同步復位所導致的,如果將復位信號“后推”能否解決,答案是不能的因為一旦rst復位信號后延那么div_cnt也隨之后延,最后仍然檢測不到rst == 1的狀態。
?故給po_cnt賦值一個初始值即可解決問題
xilinx建議的復位準則(原文連接xilinx建議的復位準則_leave_her_johnny的博客-CSDN博客_xilinx 復位)
1.盡量少用復位?
FPGA提供專用的全局復位置位信號GSR,在配置結束后,寄存器狀態初始化到設定值或者默認邏輯零狀態
控制路徑可能需要復位,數據路徑通常不需要復位
使用功能仿真可判斷是否需要復位
少用復位整體上改善性能,減小面積和功耗
?2.必須復位時采用同步復位
同步復位可直接映射到FPGA架構中的更多功能器件
DSP48、塊RAM只提供同步復位
3.確保使用高電平有效復位?
?因為XILINX內SLICE和內部邏輯等為高電平復位有效,用低電平需要反相器 ??4.避免異步復位
如果使用異步復位,則異步復位同步釋放關于時鐘域的一些筆記
????????上圖可見有兩個時鐘域,時鐘域一是由晶振輸入的它所走的是全局時鐘網絡(這個網絡在設計芯片的時候已經布局好了,在未來使用過程中到達每一級寄存器的時間是幾乎相等的)
對于clk_4的時鐘網絡,是由我們自己分頻出來的,在設計初期沒辦法設計走線,所以由自己設計出來的分頻時鐘走的是普通數據線,(到達每一級寄存器的時間延遲是不一樣的),延時一旦不一樣就會導致時鐘的偏斜(Clock Skew))偏大。這種延誤會導致時鐘的錯誤。
所以這種自分頻的時鐘最好不要使用。
總結
以上是生活随笔為你收集整理的【FPGA学习】时钟分频的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android OpenGL动态壁纸问题
- 下一篇: JAVA构造器及对象创建的过程