日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【FPGA学习】时钟分频

發(fā)布時間:2024/3/26 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【FPGA学习】时钟分频 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

概況:

用一個頻率塊的時鐘產(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 endmodule

tesbench

`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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。