最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

《FPGA入門基礎(chǔ) 》-- 跨時(shí)鐘域處理技巧-明德?lián)P科教(mdy-edu.com)

2023-01-13 07:26 作者:明德?lián)P易老師  | 我要投稿


1. 如何設(shè)計(jì)時(shí)鐘域

假如設(shè)計(jì)中所有的觸發(fā)器都使用一個(gè)全局網(wǎng)絡(luò),比如FPGA的主時(shí)鐘輸入,那么我們說(shuō)這個(gè)設(shè)計(jì)只有一個(gè)時(shí)鐘域。假如設(shè)計(jì)有兩個(gè)輸入時(shí)鐘,如圖1所示,一個(gè)時(shí)鐘給接口1使用,另一給接口2使用,那么我們說(shuō)這個(gè)設(shè)計(jì)中有兩個(gè)時(shí)鐘域。

2. 什么是亞穩(wěn)態(tài)

觸發(fā)器的建立時(shí)間和保持時(shí)間在時(shí)鐘上升沿左右定義了一個(gè)時(shí)間窗口,如果觸發(fā)器的數(shù)據(jù)輸入端口上數(shù)據(jù)在這個(gè)時(shí)間窗口內(nèi)發(fā)生變化(或者數(shù)據(jù)更新),那么就會(huì)產(chǎn)生時(shí)序違規(guī)。存在這個(gè)時(shí)序違規(guī)是因?yàn)榻r(shí)間要求和保持時(shí)間要求被違反了,此時(shí)觸發(fā)器內(nèi)部的一個(gè)節(jié)點(diǎn)(或者要輸出到外部的節(jié)點(diǎn))可能會(huì)在一個(gè)電壓范圍內(nèi)浮動(dòng),無(wú)法穩(wěn)定在邏輯0或者邏輯1狀態(tài)。換句話說(shuō),如果數(shù)據(jù)在上述窗口中被采集,觸發(fā)器中的晶體管不能可靠地設(shè)置為邏輯0或者邏輯1對(duì)應(yīng)的電平上。所以此時(shí)的晶體管并未處于飽和區(qū)對(duì)應(yīng)的高或者低電平,而是在穩(wěn)定到一個(gè)確定電平之前,徘徊在一個(gè)中間電平狀態(tài)(這個(gè)中間電平或許是一個(gè)正確值,也許不是)。如圖2所示,這就是所謂的亞穩(wěn)態(tài)。

處理信號(hào)亞穩(wěn)態(tài)有三種方法:

  1. 相位控制
    相位控制技術(shù)可以在一個(gè)時(shí)鐘頻率是另外一個(gè)時(shí)鐘的數(shù)倍,并且其中一個(gè)時(shí)鐘可以由FPGA 內(nèi)部PLL 或者DLL 控制時(shí)使用。

  2. 多級(jí)寄存器
    一般針對(duì)單bit控制信號(hào)跨越兩個(gè)異步時(shí)鐘域傳輸,可以采用多級(jí)寄存器,俗稱多打拍。同步電路中的第一拍后也許會(huì)產(chǎn)生亞穩(wěn)態(tài),但是信號(hào)有機(jī)會(huì)在其被第二級(jí)寄存以及被其它邏輯看到之前穩(wěn)定下來(lái)。常用的就是對(duì)單bit信號(hào)打兩拍,這也是最簡(jiǎn)單、最常見的處理方式。

  3. 異步FIFO緩存
    一般用于跨時(shí)鐘域傳輸數(shù)據(jù),寫端和讀端分別對(duì)應(yīng)兩個(gè)時(shí)鐘域,由空/滿信號(hào)控制著讀寫過(guò)程,實(shí)現(xiàn)數(shù)據(jù)的跨域傳輸。

每種方法應(yīng)對(duì)的情況不同,下面著重介紹最常用的單bit信號(hào)消除亞穩(wěn)態(tài)的方法:多級(jí)觸發(fā)器法

3. 多級(jí)寄存器處理辦法

在全同步設(shè)計(jì)中,如果信號(hào)來(lái)自同一時(shí)鐘域,各模塊的輸入不需要使用寄存器來(lái)寄存。只要滿足建立時(shí)間和保持時(shí)間的約束,可以保證在時(shí)鐘上升沿到來(lái)時(shí),輸入信號(hào)已經(jīng)穩(wěn)定,可以采樣得到正確的值。但是如果要采用輸入信號(hào)的邊沿來(lái)觸發(fā)某一過(guò)程,則需要寄存來(lái)檢測(cè)上升沿,這是另外一個(gè)范疇的問(wèn)題。

一般而言單bit信號(hào)就是我們所用到的脈沖信號(hào)或者電平信號(hào)。假設(shè)A和B是兩個(gè)時(shí)鐘域,各自的頻率是clk_a和clk_b,clk_a的頻率高于clk_b(同頻相位差穩(wěn)定的,不在討論范圍內(nèi)),那么單bit信號(hào)傳輸分為兩種情況。

3.1 信號(hào)從B到A(慢到快)

在時(shí)鐘域B下的脈沖信號(hào)pulse_b在時(shí)鐘域A看來(lái),是一個(gè)很寬的“電平”信號(hào)會(huì),保持多個(gè)clk_a的時(shí)鐘周期,所以一定能被clk_a采到。經(jīng)驗(yàn)設(shè)計(jì)采集過(guò)程必須寄存兩拍。第一拍將輸入信號(hào)同步化,同步化后的輸出可能帶來(lái)建立/保持時(shí)間的沖突,產(chǎn)生亞穩(wěn)態(tài)。需要再寄存一拍,減少亞穩(wěn)態(tài)帶來(lái)的影響。一般來(lái)說(shuō)兩級(jí)是最基本要求,如果是高頻率設(shè)計(jì),則需要增加寄存級(jí)數(shù)來(lái)大幅降低系統(tǒng)的不穩(wěn)定性。也就是說(shuō)采用多級(jí)觸發(fā)器來(lái)采樣來(lái)自異步時(shí)鐘域的信號(hào),級(jí)數(shù)越多,同步過(guò)來(lái)的信號(hào)越穩(wěn)定。

特別需要強(qiáng)調(diào)的是,此時(shí)pulse_b必須是clk_b下的寄存器信號(hào),如果pulse_b是clk_b下的組合邏輯信號(hào),一定要先在clk_b先用D觸發(fā)器(DFF)抓一拍,再使用兩級(jí)DFF向clk_a傳遞。這是因?yàn)閏lk_b下的組合邏輯信號(hào)會(huì)有毛刺,在clk_b下使用時(shí)會(huì)由setup/hold時(shí)間保證毛刺不會(huì)被clk_b采到,但由于異步相位不確定,組合邏輯的毛刺卻極有可能被clk_a采到。一般代碼設(shè)計(jì)如下:

always @ (posedge clk_a or negedge rst_n) begin if (rst_n == 1'b0) begin pules_a_r1 <= 1'b0; ? ? ? ? ? ? ? pules_a_r2 <= 1'b0; ? ? ? ? ? ? ? pules_a_r3 <= 1'b0; end else begin //打3拍 pules_a_r1 <= pulse_b; ? ? ? ? ? ? ? pules_a_r2 <= pules_a_r1; ? ? ? ? ? ? ? pules_a_r3 <= pules_a_r2; end end assign pulse_a_pos ?= pules_a_r2 & (~pules_a_r3); //上升沿檢測(cè) assign pulse_a_neg ?= pules_a_r3 & (~pules_a_r2); //下降沿檢測(cè) assign pulse_a ? ? ?= pules_a_r2;

實(shí)際上,具體打幾拍背后是有時(shí)序收斂的理論作支撐的,對(duì)于一般的設(shè)計(jì)而言,打兩三拍就已經(jīng)足夠了。

3.2 信號(hào)從A到B(快到慢)

如果單bit信號(hào)從時(shí)鐘域A到時(shí)鐘域B,那么存在兩種不同的情況,傳輸脈沖信號(hào)pulse_a或傳輸電平信號(hào)level_a。實(shí)際上,在一般情況下只有電平信號(hào)level_a的寬度能被clk_b采集到才可以保證系統(tǒng)正常工作。那么對(duì)于脈沖信號(hào)pulse_a采取怎樣的處理方法呢?可以用一個(gè)展寬信號(hào)來(lái)替代pulse_a實(shí)現(xiàn)垮時(shí)鐘域的握手。

主要原理就是先把脈沖信號(hào)在clk_a下展寬,變成電平信號(hào)signal_a,再向clk_b傳遞,當(dāng)確認(rèn)clk_b已經(jīng)“看見”信號(hào)同步過(guò)去之后,再清掉signal_a。代碼通用框架如下:

module Sync_Pulse ( ? ? ? ? ? ? ? ? ?clk_a, ? ? ? ? ? ? ? ? ? ? ? ? ?clk_b, ? ? ? ? ? ? ? ? ? ?rst_n, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?pulse_a_in, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?pulse_b_out, ? ? ? ? ? ? ? ? ? ?b_out ? ? ? ? ? ? ? ? ?); /****************************************************/ input clk_a; input clk_b; input rst_n; input pulse_a; output pulse_b_out; output b_out; /****************************************************/ reg signal_a; reg signal_b; reg signal_b_r1; reg signal_b_r2; reg signal_b_a1; reg signal_b_a2; /****************************************************/ //在時(shí)鐘域clk_a下,生成展寬信號(hào)signal_a always @ (posedge clk_a or negedge rst_n) begin if (rst_n == 1'b0) ? ? ? ? ? ? ? ?signal_a <= 1'b0; else if (pulse_a_in) //檢測(cè)到到輸入信號(hào)pulse_a_in被拉高,則拉高signal_a signal_a <= 1'b1; else if (signal_b_a2) //檢測(cè)到signal_b1_a2被拉高,則拉低signal_a signal_a <= 1'b0; else; end //在時(shí)鐘域clk_b下,采集signal_a,生成signal_b always @ (posedge clk_b or negedge rst_n) begin if (rst_n == 1'b0) ? ? ? ? ? ? ? ?signal_b <= 1'b0; else signal_b <= signal_a; end //多級(jí)觸發(fā)器處理 always @ (posedge clk_b or negedge rst_n) begin if (rst_n == 1'b0) begin signal_b_r1 <= 1'b0; ? ? ? ? ? ? ? ? ? ?signal_b_r2 <= 1'b0; end else begin signal_b_r1 <= signal_b; //對(duì)signal_b打兩拍 signal_b_r2 <= signal_b_r1; end end //在時(shí)鐘域clk_a下,采集signal_b_r1,用于反饋來(lái)拉低展寬信號(hào)signal_a always @ (posedge clk_a or negedge rst_n) begin if (rst_n == 1'b0) begin signal_b_a1 <= 1'b0; ? ? ? ? ? ? ? ? ? ?signal_b_a2 <= 1'b0; end else begin signal_b_a1 <= signal_b_r1; //對(duì)signal_b_r1打兩拍,因?yàn)橥瑯由婕暗娇鐣r(shí)鐘域 signal_b_a2 <= signal_b_a1; end end assign pulse_b_out = ? signal_b_r1 & (~signal_b_r2); assign b_out ? ? ? = ? signal_b_r1; endmodule

這樣一來(lái),實(shí)際上clk_a下的脈沖信號(hào)“作用”到了clk_b時(shí)鐘域下,它對(duì)于clk_a與clk_b的時(shí)鐘頻率關(guān)系沒(méi)有任何限制,快到慢,慢到快就都沒(méi)問(wèn)題了。

總而言之,在設(shè)計(jì)中可以簡(jiǎn)單的牢記以下五條原則:(請(qǐng)謹(jǐn)記)
1. 再全局時(shí)鐘的跳變沿最可靠。
2. 來(lái)自異步時(shí)鐘域的輸入需要寄存一次以同步化,再寄存一次以減少亞穩(wěn)態(tài)帶來(lái)的影響。
3. 不需要用到跳變沿的來(lái)自同一時(shí)鐘域的輸入,沒(méi)有必要對(duì)信號(hào)進(jìn)行寄存。
4. 需要用到跳變沿的來(lái)自同一時(shí)鐘域的輸入,寄存一次即可。
5. 需要用到跳變沿的來(lái)自不同時(shí)鐘域的輸入,需要用到3個(gè)觸發(fā)器,前兩個(gè)用以同步,第3個(gè)觸發(fā)器的輸出和第2個(gè)的輸出經(jīng)過(guò)邏輯門來(lái)判斷跳變沿。

3.3 設(shè)計(jì)分區(qū)同步器模塊

在頂層為設(shè)計(jì)分區(qū)是一個(gè)好的設(shè)計(jì)實(shí)踐行為,這樣任何功能模塊外面都包含一個(gè)獨(dú)立的同步器模塊。這樣有利于在劃分模塊的基礎(chǔ)上實(shí)現(xiàn)所謂的理想時(shí)鐘域情況(即整個(gè)設(shè)計(jì)模塊只有一個(gè)時(shí)鐘),如下圖所示:

對(duì)設(shè)計(jì)進(jìn)行分區(qū)有很多理由。首先,對(duì)每個(gè)獨(dú)立的功能模塊進(jìn)行時(shí)序分析變得簡(jiǎn)易,因?yàn)槟K都是完全的同步設(shè)計(jì)。其次,整個(gè)同步模塊中的時(shí)序例外也很容易得到定義。再次,底層模塊的同步器加時(shí)序例外在代入到設(shè)計(jì)頂層時(shí),大大降低了由于人為失誤造成的疏漏。所以,同步寄存器應(yīng)該在功能模塊外單獨(dú)分區(qū)。



《FPGA入門基礎(chǔ) 》-- 跨時(shí)鐘域處理技巧-明德?lián)P科教(mdy-edu.com)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
华坪县| 广德县| 盐池县| 上栗县| 社旗县| 洮南市| 涟源市| 吉安市| 龙泉市| 吉林市| 柘荣县| 象山县| 临猗县| 怀远县| 昌黎县| 曲沃县| 射洪县| 子洲县| 新宁县| 屏南县| 佛山市| 凌海市| 赤城县| 邮箱| 米泉市| 永兴县| 乌拉特前旗| 三原县| 无为县| 巴青县| 白城市| 虎林市| 弥渡县| 阳城县| 察隅县| 乌兰浩特市| 上思县| 阜城县| 五大连池市| 宝山区| 绥滨县|