0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

跨時(shí)鐘域類型介紹 同步FIFO和異步FIFO的架構(gòu)設(shè)計(jì)

CHANBAEK ? 來(lái)源:奇異白勺書 ? 作者:Kim71 ? 2023-09-19 09:32 ? 次閱讀

在《時(shí)鐘與復(fù)位》一文中已經(jīng)解釋了亞穩(wěn)態(tài)的含義以及亞穩(wěn)態(tài)存在的危害。在單時(shí)鐘系統(tǒng)中,亞穩(wěn)態(tài)出現(xiàn)的概率非常低,采用同步設(shè)計(jì)基本可以規(guī)避風(fēng)險(xiǎn)。但在實(shí)際應(yīng)用中,一個(gè)系統(tǒng)往往包含多個(gè)時(shí)鐘,且許多時(shí)鐘之間沒有固定的相位關(guān)系,即所謂的異步時(shí)鐘域,這就給設(shè)計(jì)帶來(lái)很大的挑戰(zhàn)。

01跨時(shí)鐘域類型

跨時(shí)鐘域傳輸可分為以下幾種情況:

  • 同頻零相位差時(shí)鐘
  • 同頻恒定相位差時(shí)鐘
  • 非同頻時(shí)鐘
    • 整數(shù)倍頻時(shí)鐘
    • 非整數(shù)倍頻時(shí)鐘

同頻同相時(shí)鐘可視為等效的時(shí)鐘,在不考慮時(shí)鐘抖動(dòng)(Jitter)影響的情況下,兩個(gè)時(shí)鐘域之間的傳輸可視作同步的。而同頻恒定相位差的時(shí)鐘由于時(shí)鐘有效沿之間有一定的相位差,因此對(duì)建立/保持時(shí)間裕量有一定的影響。設(shè)計(jì)時(shí)需要確保組合邏輯的延時(shí)能滿足采樣處的建立/保持時(shí)間要求,一般可通過(guò)在發(fā)射沿或捕獲沿加入適當(dāng)?shù)钠苼?lái)完成時(shí)序的調(diào)整。

而對(duì)于非同頻的時(shí)鐘,二者可以是同步關(guān)系,也可以是異步關(guān)系,這里再次強(qiáng)調(diào)一下同步與異步的界定標(biāo)準(zhǔn):有固定相位關(guān)系的稱為同步時(shí)鐘,沒有固定相位關(guān)系的稱為異步時(shí)鐘。

那么什么叫固定的相位關(guān)系?即兩個(gè)時(shí)鐘的有效沿之間的偏移量始終保持恒定,也即所謂的相位差固定。

非同頻時(shí)鐘之間的關(guān)系可以分為整數(shù)倍頻和非整數(shù)倍頻。整數(shù)倍頻的時(shí)鐘往往是同源時(shí)鐘,相位關(guān)系也往往是固定的。但是存在源時(shí)鐘域和目標(biāo)時(shí)鐘域的快慢關(guān)系。假設(shè)源時(shí)鐘是20MHz,而目標(biāo)時(shí)鐘域只有5MHz,那么就是快時(shí)鐘域到慢時(shí)鐘域的傳輸。

“慢采快”會(huì)導(dǎo)致數(shù)據(jù)丟失的問題,為了避免這個(gè)問題,要求源時(shí)鐘域的數(shù)據(jù)至少保持一個(gè)目標(biāo)時(shí)鐘域的周期的穩(wěn)定狀態(tài)。對(duì)于單比特控制信號(hào)的“快→慢”傳輸,可以采用如圖所示的脈沖同步器來(lái)檢測(cè)快時(shí)鐘域的脈沖信號(hào)。

圖片

一旦data1有脈沖拉高,經(jīng)過(guò)mux的反饋,第一級(jí)DFF的輸出就會(huì)反轉(zhuǎn)并鎖住,直到下一個(gè)data1脈沖的到來(lái)才會(huì)再次反轉(zhuǎn)。中間兩級(jí)DFF就是用來(lái)打兩拍消除亞穩(wěn)態(tài)的,最后一級(jí)DFF輸出的異或用來(lái)檢測(cè)同步過(guò)來(lái)的信號(hào)是否發(fā)生反轉(zhuǎn),由于data1每次脈沖都會(huì)導(dǎo)致clk1時(shí)鐘域的輸出發(fā)生反轉(zhuǎn),于是該脈沖信號(hào)就在clk2時(shí)鐘域被記錄下來(lái)并保持一個(gè)周期的穩(wěn)定狀態(tài)。

那么假如源時(shí)鐘比目標(biāo)時(shí)鐘要慢呢?在“快采慢”的情況下,需要注意快時(shí)鐘域觸發(fā)器不要對(duì)慢時(shí)鐘域的輸出信號(hào)進(jìn)行重復(fù)采樣,在慢時(shí)鐘域維持一個(gè)周期的信號(hào)在慢時(shí)鐘域可能維持好幾個(gè)周期,這顯然會(huì)導(dǎo)致邏輯功能的錯(cuò)誤。因此需要確保同步過(guò)來(lái)的信號(hào)在快時(shí)鐘域也只維持一個(gè)周期,因此采樣如圖所示的邊沿(上升沿)同步電路,就能將慢時(shí)鐘域的脈沖同步到快時(shí)鐘域。

圖片

(此法只用于慢時(shí)鐘域的單周期脈沖信號(hào)的同步,若源信號(hào)存在維持幾個(gè)周期的高電平,在快時(shí)鐘域也只會(huì)存在一個(gè)周期的脈沖信號(hào),此時(shí)用基本的電平同步電路就可以了)

非整數(shù)倍頻的時(shí)鐘的之間相位關(guān)系總是在變化,這讓時(shí)序分析變得很復(fù)雜,除了亞穩(wěn)態(tài)的問題,還要考慮相位差的變化是否會(huì)導(dǎo)致丟數(shù)據(jù),即便能滿足時(shí)序,數(shù)據(jù)傳輸不連貫的問題也始終存在。

此時(shí),已經(jīng)標(biāo)準(zhǔn)化的技術(shù),如FIFO和握手,解決了絕大多數(shù)情況下的跨時(shí)鐘域數(shù)據(jù)傳輸。

02FIFO

關(guān)于握手機(jī)制,筆者在《解剖AXI(一)—— 從握手開始》一文中已有說(shuō)明,本文不再過(guò)多贅述。在實(shí)際設(shè)計(jì)中,使用握手機(jī)制來(lái)傳輸單比特信號(hào)產(chǎn)生的延遲要遠(yuǎn)大于使用FIFO進(jìn)行傳輸,因此本文重點(diǎn)介紹FIFO傳輸?shù)臋C(jī)制,以及同步FIFO和異步FIFO的架構(gòu)。

FIFO,即First In First Out,先進(jìn)先出的數(shù)據(jù)緩存器??深惐葹榕抨?duì),先進(jìn)隊(duì)伍的先服務(wù),先寫入FIFO的數(shù)據(jù)先讀出。所以FIFO沒有外部地址線,只能靠回滾遞增的內(nèi)部讀寫指針來(lái)指示下一個(gè)要讀/寫的地址。根據(jù)讀寫控制信號(hào)的時(shí)鐘關(guān)系,又可分為同步FIFO和異步FIFO。

2.1 同步FIFO

同步FIFO的寫時(shí)鐘和讀時(shí)鐘為同步時(shí)鐘,一般情況下為同一個(gè)時(shí)鐘。同步FIFO內(nèi)的所有邏輯都是同步邏輯。一個(gè)最簡(jiǎn)單的同步FIFO框圖如下所示。

圖片

產(chǎn)生FIFO空滿信號(hào)的方法有兩種:

一是在FIFO內(nèi)部設(shè)置一個(gè)計(jì)數(shù)器來(lái)指示當(dāng)前FIFO內(nèi)部緩存了多少個(gè)數(shù)據(jù),但這會(huì)引入新的寄存器造成額外的資源開銷;

二是通過(guò)拓寬讀寫指針的位數(shù),然后根據(jù)讀寫指針的關(guān)系來(lái)判斷空滿。

當(dāng)讀指針等于寫指針時(shí),標(biāo)明FIFO處于空狀態(tài),如圖所示,假設(shè)FIFO深度為8,那么讀寫地址的位寬取3,讀寫指針在此基礎(chǔ)上拓寬一位:

圖片

當(dāng)FIFO內(nèi)有數(shù)據(jù)寫入時(shí),寫指針增加,此時(shí)讀指針的低N-1位不等于寫指針的低N-1位(N為指針拓寬一位之后的位寬),如圖所示:

圖片

如果此時(shí)再讀出兩個(gè)數(shù)據(jù),F(xiàn)IFO又將回到空狀態(tài),此時(shí)讀指針與寫指針又相等:

圖片

假如此時(shí),一口氣寫入8個(gè)數(shù)據(jù),寫指針+8,變成4'b1010,F(xiàn)IFO處于滿狀態(tài),此時(shí)讀寫指針的最高位不同,但低N-1位相同:

圖片

于是可以總結(jié)得到FIFO空滿信號(hào)的生成條件:

  • fifo_empty_o:
assign fifo_empty_o = (wr_ptr == rd_ptr);
  • fifo_full_o:
assign fifo_full_o = ((wr_ptr[$clog2(DEPTH)] != rd_ptr[$clog2(DEPTH)]) && (wr_addr == rd_addr));

2.2 異步FIFO

同步FIFO可用于在同步時(shí)鐘域傳輸多比特信號(hào),但若要實(shí)現(xiàn)兩個(gè)異步時(shí)鐘域之間的數(shù)據(jù)傳輸,就要使用異步FIFO。

異步FIFO相較于同步FIFO最大的不同在于讀/寫時(shí)鐘域是異步的,也就是說(shuō)讀寫控制信號(hào)是由不同的時(shí)鐘驅(qū)動(dòng)的,這就導(dǎo)致讀指針需要同步到寫時(shí)鐘域,才能判斷FIFO是否滿;寫指針也需要同步到讀時(shí)鐘域,才能判斷FIFO是否空。

異步FIFO的框圖如下:

圖片

但是對(duì)于多比特信號(hào)的跨時(shí)鐘域同步,存在一個(gè)嚴(yán)重的問題。如果像同步FIFO那樣使用二進(jìn)制的讀寫指針,指針每次加一都可能使好幾位發(fā)生翻轉(zhuǎn),以三位指針為例,假設(shè)當(dāng)前指針為3'b111下一次操作后指針加1變?yōu)?'b000.

我們已經(jīng)知道,單比特信號(hào)打兩拍同步之后的結(jié)果可能恢復(fù)成0或1的其中一個(gè)穩(wěn)態(tài),假如該單比特信號(hào)是從0→1,最終哪怕同步結(jié)果是0,也不影響整個(gè)電路的功能,只當(dāng)是沒有發(fā)生這次操作,在后續(xù)的運(yùn)行過(guò)程中再把正確信號(hào)同步過(guò)來(lái)也是ok的。

但是對(duì)于多比特信號(hào)而言,多位發(fā)生翻轉(zhuǎn),其中的每一位都可能同步為不同的結(jié)果,也就是說(shuō)3'b111→3'b000可能變成3'b111→3'b010或者3'b111→3'b110、3'b111→3'b001、3'b111→3'b101之類的任意值,這就明顯違背了指針的正常邏輯,破壞了電路的功能。

我們希求的效果是3'b111→3'b000,哪怕同步結(jié)果不是3'b000,也得是3’b111保持不變。因此要求指針遞增每次只變化一位。

剛好,格雷碼的編碼方式就是相鄰兩個(gè)數(shù)值只有一位不同。因此在異步FIFO設(shè)計(jì)中,跨時(shí)鐘域同步讀寫指針之前,要將二進(jìn)制指針先轉(zhuǎn)換成格雷碼編碼的指針,再進(jìn)行同步。

二進(jìn)制和格雷碼的互相轉(zhuǎn)化邏輯,這里不再贅述,只展示Verilog代碼以供參考:

bin2gray:

module bin2gray
#(
    parameter WIDTH = 8
)
(
    input       [WIDTH-1:0] bin,
    output      [WIDTH-1:0] gray
);


    assign gray = bin ^ {1'b0,bin[WIDTH-1:1]};


endmodule

gray2bin:

module gray2bin
#(
    parameter WIDTH = 8
)
(
    input       [WIDTH-1:0] gray,
    output      [WIDTH-1:0] bin
);


    genvar i;
    generate
        for(i=0;i< WIDTH;i=i+1)begin
            assign bin[i] = ^gray[WIDTH-1:i];
        end
    endgenerate


endmodule

相應(yīng)的,用格雷碼編碼的指針來(lái)判斷異步FIFO的空滿狀態(tài):

  • fifo_empty_o:
assign empty = (rd_ptr_gray == wr_ptr_gray_sync_r2);
  • fifo_full_o:
assign full = ({~wr_ptr_gray[ADDR_WIDTH:ADDR_WIDTH-1],wr_ptr_gray[ADDR_WIDTH-2:0]} == rd_ptr_gray_sync_r2);
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • fifo
    +關(guān)注

    關(guān)注

    3

    文章

    389

    瀏覽量

    43776
  • 時(shí)鐘
    +關(guān)注

    關(guān)注

    11

    文章

    1742

    瀏覽量

    131641
  • 時(shí)鐘域
    +關(guān)注

    關(guān)注

    0

    文章

    52

    瀏覽量

    9545
  • 異步FIFO
    +關(guān)注

    關(guān)注

    0

    文章

    20

    瀏覽量

    8392
  • 同步FIFO
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    5377
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FIFO為什么不能正常工作?

    FIFO的情形。 在FPGA設(shè)計(jì)中,我們會(huì)經(jīng)常用到異步FIFO進(jìn)行時(shí)鐘隔離。作為已經(jīng)非常成熟
    的頭像 發(fā)表于 11-02 09:25 ?1361次閱讀
    <b class='flag-5'>FIFO</b>為什么不能正常工作?

    異步FIFO的設(shè)計(jì)分析及詳細(xì)代碼

    (每個(gè)數(shù)據(jù)的位寬) FIFO同步異步兩種,同步即讀寫時(shí)鐘相同,異步即讀寫
    發(fā)表于 11-15 12:52 ?8675次閱讀
    <b class='flag-5'>異步</b><b class='flag-5'>FIFO</b>的設(shè)計(jì)分析及詳細(xì)代碼

    如何解決異步FIFO時(shí)鐘亞穩(wěn)態(tài)問題?

    時(shí)鐘的問題:前一篇已經(jīng)提到要通過(guò)比較讀寫指針來(lái)判斷產(chǎn)生讀空和寫滿信號(hào),但是讀指針是屬于讀時(shí)鐘的,寫指針是屬于寫
    的頭像 發(fā)表于 09-05 14:29 ?6079次閱讀

    同步FIFO之Verilog實(shí)現(xiàn)

    FIFO的分類根均FIFO工作的時(shí)鐘,可以將FIFO分為同步
    的頭像 發(fā)表于 11-01 09:57 ?2030次閱讀

    異步fifo詳解

    和寫入數(shù)據(jù)(對(duì)于大型數(shù)據(jù)存儲(chǔ),在性能上必然緩慢),其數(shù)據(jù)地址是由內(nèi)部讀寫指針自動(dòng)加一完成的,不能像普通的存儲(chǔ)器一樣,由地址線決定讀取或者寫入某個(gè)特定地址的數(shù)據(jù),按讀寫是否為相同時(shí)鐘分為同步
    的頭像 發(fā)表于 12-12 14:17 ?4257次閱讀

    Verilog電路設(shè)計(jì)之單bit時(shí)鐘同步異步FIFO

    FIFO用于為匹配讀寫速度而設(shè)置的數(shù)據(jù)緩沖buffer,當(dāng)讀寫時(shí)鐘異步時(shí),就是異步FIFO。多bit的數(shù)據(jù)信號(hào),并不是直接從寫
    發(fā)表于 01-01 16:48 ?1310次閱讀

    FIFO使用及其各條件仿真介紹

    FIFO(First In First Out )先入先出存儲(chǔ)器,在FPG設(shè)計(jì)中常用于時(shí)鐘的處理,FIFO可簡(jiǎn)單分為
    的頭像 發(fā)表于 04-25 15:55 ?4140次閱讀
    <b class='flag-5'>FIFO</b>使用及其各條件仿真<b class='flag-5'>介紹</b>

    時(shí)鐘電路設(shè)計(jì):多位寬數(shù)據(jù)通過(guò)FIFO時(shí)鐘

    FIFO是實(shí)現(xiàn)多位寬數(shù)據(jù)的異步時(shí)鐘操作的常用方法,相比于握手方式,FIFO一方面允許發(fā)送端在
    的頭像 發(fā)表于 05-11 14:01 ?3147次閱讀
    <b class='flag-5'>跨</b><b class='flag-5'>時(shí)鐘</b><b class='flag-5'>域</b>電路設(shè)計(jì):多位寬數(shù)據(jù)通過(guò)<b class='flag-5'>FIFO</b><b class='flag-5'>跨</b><b class='flag-5'>時(shí)鐘</b><b class='flag-5'>域</b>

    FIFO設(shè)計(jì)—同步FIFO

    FIFO異步數(shù)據(jù)傳輸時(shí)常用的存儲(chǔ)器,多bit數(shù)據(jù)異步傳輸時(shí),無(wú)論是從快時(shí)鐘到慢時(shí)鐘
    發(fā)表于 05-26 16:12 ?1538次閱讀
    <b class='flag-5'>FIFO</b>設(shè)計(jì)—<b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>

    FIFO設(shè)計(jì)—異步FIFO

    異步FIFO主要由五部分組成:寫控制端、讀控制端、FIFO Memory和兩個(gè)時(shí)鐘同步
    發(fā)表于 05-26 16:17 ?1564次閱讀
    <b class='flag-5'>FIFO</b>設(shè)計(jì)—<b class='flag-5'>異步</b><b class='flag-5'>FIFO</b>

    時(shí)鐘設(shè)計(jì):異步FIFO設(shè)計(jì)

    在ASIC設(shè)計(jì)或者FPGA設(shè)計(jì)中,我們常常使用異步fifo(first in first out)(下文簡(jiǎn)稱為afifo)進(jìn)行數(shù)據(jù)流的時(shí)鐘,可以說(shuō)沒使用過(guò)afifo的Designer
    的頭像 發(fā)表于 07-31 11:10 ?2328次閱讀
    <b class='flag-5'>跨</b><b class='flag-5'>時(shí)鐘</b>設(shè)計(jì):<b class='flag-5'>異步</b><b class='flag-5'>FIFO</b>設(shè)計(jì)

    為什么異步fifo中讀地址同步在寫時(shí)鐘時(shí)序分析不通過(guò)?

    為什么異步fifo中讀地址同步在寫時(shí)鐘時(shí)序分析不通過(guò)? 異步
    的頭像 發(fā)表于 10-18 15:23 ?780次閱讀

    同步FIFO異步FIFO的區(qū)別 同步FIFO異步FIFO各在什么情況下應(yīng)用

    簡(jiǎn)單的一種,其特點(diǎn)是輸入和輸出都與時(shí)鐘信號(hào)同步,當(dāng)時(shí)鐘到來(lái)時(shí),數(shù)據(jù)總是處于穩(wěn)定狀態(tài),因此容易實(shí)現(xiàn)數(shù)據(jù)的傳輸和存儲(chǔ)。 而異步FIFO則是在波形
    的頭像 發(fā)表于 10-18 15:23 ?1742次閱讀

    異步FIFO結(jié)構(gòu)設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《異步FIFO結(jié)構(gòu)設(shè)計(jì).pdf》資料免費(fèi)下載
    發(fā)表于 02-06 09:06 ?0次下載

    同步FIFO異步FIFO區(qū)別介紹

    ,并且間隔時(shí)間長(zhǎng),也就是突發(fā)寫入。那么通過(guò)設(shè)置一定深度的FIFO,可以起到數(shù)據(jù)暫存的功能,且使得后續(xù)處理流程平滑。 時(shí)鐘的隔離:主要用異步FIFO
    的頭像 發(fā)表于 06-04 14:27 ?1750次閱讀
    <b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>和<b class='flag-5'>異步</b><b class='flag-5'>FIFO</b>區(qū)別<b class='flag-5'>介紹</b>