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