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