那曲檬骨新材料有限公司

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

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

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

采用格雷碼異步FIFO跟標(biāo)準(zhǔn)FIFO有什么區(qū)別

CHANBAEK ? 來(lái)源:硬件王國(guó) ? 作者:小山哥 ? 2023-09-14 11:21 ? 次閱讀

導(dǎo)讀:

異步FIFO包含"讀"和"寫(xiě)“兩個(gè)部分,寫(xiě)操作和讀操作在不同的時(shí)鐘域中執(zhí)行,這意味著Write_Clk和Read_Clk的頻率和相位可以完全獨(dú)立。異步FIFO的原理很簡(jiǎn)單,寫(xiě)操作是在寫(xiě)使能有效時(shí),寫(xiě)地址指針(Write_Pointer)逐漸遞增,將數(shù)據(jù)寫(xiě)入存儲(chǔ)器的相應(yīng)位置。讀操作是在讀使能信號(hào)有效時(shí),讀地址指(Read_Pointer)逐漸遞增,從存儲(chǔ)器的相應(yīng)位置讀取數(shù)據(jù)。

但異步FIFO有一個(gè)難點(diǎn)就是—滿(mǎn)和空的產(chǎn)生。寫(xiě)操作,我們得判斷FIFO是不是滿(mǎn)了,滿(mǎn)了就不能繼續(xù)往里面寫(xiě),不然就會(huì)覆蓋還沒(méi)取走的數(shù)據(jù)。對(duì)于讀操作,我們得判斷FIFO是不是空了,空了就不能接著取,不然舊的數(shù)據(jù)會(huì)被取多次。

觸發(fā)異步FIFO的滿(mǎn)和空,是拿讀和寫(xiě)的Pointer做比較得到的。問(wèn)題在于:寫(xiě)操作下的Write_Pointer和讀操作下的Read_Pointer屬于兩個(gè)不同的時(shí)鐘域信號(hào)。兩個(gè)不同的時(shí)鐘域信號(hào)是不能直接做運(yùn)算的,需要同步到同一個(gè)時(shí)鐘域之后才行,因?yàn)橛羞@個(gè)CDC同步器的開(kāi)銷(xiāo),導(dǎo)致FIFO出現(xiàn) 真 滿(mǎn)空和 假 滿(mǎn)空。

接下來(lái)我們一起來(lái)看看標(biāo)準(zhǔn)異步FIFO的”真“滿(mǎn)空和“假“滿(mǎn)空如何產(chǎn)生,以及采用格雷碼異步FIFO跟標(biāo)準(zhǔn)FIFO有什么區(qū)別。(這里所謂標(biāo)準(zhǔn)異步FIFO是指不使用特殊編碼方式(如格雷碼)的異步FIFO,即使用常規(guī)的二進(jìn)制地址指針。)

標(biāo)準(zhǔn)異步FIFO

圖片

標(biāo)準(zhǔn)異步FIFO結(jié)構(gòu)如上圖,假設(shè)FIFO的深度為8,addr(地址范圍)為0 ~ 7。那么設(shè)計(jì)讀寫(xiě)地址指針都是4bit,即w_ptr[3:0],r_ptr[3:0],其中最高bit是擴(kuò)展位。ptr取值范圍是0 ~15,要比FIFO地址(addr)多一倍。為什么這么設(shè)計(jì)呢?因?yàn)闈M(mǎn)和空本質(zhì)上是讀和寫(xiě)指向了FIFO的同一個(gè)存儲(chǔ)單元,但是“空”是讀指針追上了寫(xiě)指針,“滿(mǎn)”是寫(xiě)指針超過(guò)了讀指針整整一圈。其中最高位就是用來(lái)確定是 “誰(shuí)追上了誰(shuí)”

如果兩個(gè)ptr低位全等,最高位不等,就是“滿(mǎn)”;

如果兩個(gè)Ptr低位全等,最高位相等,就是“空”。

如圖所示,將w_ptr通過(guò)CDC同步之后,送到讀時(shí)鐘域,得到w_ptr_syn,然后再將它和r_ptr作比較,就可以得到“空”信號(hào),代碼如下:

assign empty = (w_ptr_syn[3:0]== r_ptr[3:0]);

同理,將r_ptr通過(guò)CDC同步之后,送到寫(xiě)時(shí)鐘域,得到r_ptr_syn,然后將它和w_ptr作比較,就可以得到滿(mǎn)信號(hào),代碼如下:

assign full = (w_ptr[3] != r_ptr_syn[3]) && (w_ptr[2:0] == r_ptr_syn[2:0]);

大家覺(jué)得上面的代碼得到的滿(mǎn)和空是“ 真”滿(mǎn)空嗎?

答案是否定的。因?yàn)镃DC同步器本身也需要開(kāi)銷(xiāo),一般簡(jiǎn)單的兩級(jí)同步器需要目標(biāo)時(shí)鐘域兩個(gè)時(shí)鐘周期。當(dāng)我們判斷滿(mǎn)信號(hào)的時(shí)候,我們是在 寫(xiě)時(shí)鐘域 ,用w_ptr和同步過(guò)來(lái)的r_ptr_syn做比較。r_ptr_syn要比真正的r_ptr要滯后,導(dǎo)致判滿(mǎn)的邏輯并不完全準(zhǔn)確。當(dāng)FIFO接近滿(mǎn)的時(shí)候,full信號(hào)就會(huì)為1,從而阻止對(duì)FIFO繼續(xù)寫(xiě)入(腦補(bǔ):“滿(mǎn)”意味著寫(xiě)比讀塊,寫(xiě)指針馬上趕上讀指針一圈,此刻還與滯后同步過(guò)來(lái)的讀指針比較,是不是快滿(mǎn)還沒(méi)滿(mǎn)時(shí)就滿(mǎn)足full條件了?)。同理,當(dāng)FIFO接近空,但是實(shí)際可能還沒(méi)空的時(shí)候,empty信號(hào)就會(huì)為1。

這種假滿(mǎn)空并不會(huì)導(dǎo)致FIFO的行為出錯(cuò),只會(huì)導(dǎo)致FIFO的利用率并非百分百,相當(dāng)于FIFO的深度少了那么一兩層。

那么FIFO能得到真滿(mǎn)空嗎?

答案肯定是可以的。如果我們?cè)趯?xiě)時(shí)鐘域判斷“空”信號(hào),在讀時(shí)鐘域判斷“滿(mǎn)”信號(hào)呢?(在寫(xiě)時(shí)鐘域,通過(guò)滯后的r_ptr_syn都得到了“空”信號(hào),那說(shuō)明實(shí)際的r_ptr必然真的趕上了w_ptr,此刻FIFO絕對(duì)空了。在讀時(shí)鐘域,通過(guò)滯后的w_ptr_syn都得到了“滿(mǎn)”信號(hào),那說(shuō)明實(shí)際的w_ptr必然真的超過(guò)了r_ptr一圈,此刻FIFO絕對(duì)滿(mǎn)了)。

assign empty_real = (w_ptr[3:0] == r_ptr_syn[3:0]);

assign full_real = (r_ptr[3] != w_ptr_syn[3]) && (r_ptr[2:0] == w_ptr_syn[2:0]);

這個(gè)“真”滿(mǎn)空信號(hào),用到的時(shí)候并不多。但是理解“真”滿(mǎn)空和“假”滿(mǎn)空,是理解異步FIFO的基礎(chǔ)。

采用格雷碼的異步FIFO

采用格雷碼的異步FIFO判斷“滿(mǎn)”和“空”的原理沒(méi)變,跟標(biāo)準(zhǔn)FIFO是一樣的,即在寫(xiě)時(shí)鐘域判斷滿(mǎn)條件,在讀時(shí)鐘域判斷空條件:

如果兩個(gè)ptr低位全等,最高位不等,就是“滿(mǎn)”;

如果兩個(gè)Ptr低位全等,最高位相等,就是“空”。

只不過(guò),地址指針采用的是格雷碼,如寫(xiě)地址指針:

assign nxt_wptr = (!full && wr_en) ? (wptr +1'b1):wptr;  

assign nxt_wptr_gray = (nxt_wptr >>1)^nxt_wptr;

判斷空條件:則在讀時(shí)鐘域,讀地址指針格雷碼 與 兩級(jí)同步過(guò)來(lái)后的寫(xiě)地址指針格雷碼(nxt_wptr_gray)進(jìn)行比較:

always@(posedge rclk or negedge rst_n)

begin

    if(!rst_n) begin

        wptr_sp1<=6'b0;

        wptr_sp2<=6'b0;

    end

    else begin

        wptr_sp1<=nxt_wptr_gray;

        wptr_sp2<=wptr_sp1;    

    end                        

end

assign empty=(rptr_gray==wptr_sp2);

同理,判斷滿(mǎn)條件:

assign full=(wptr_gray=={~rptr_sp2[3],rptr_sp2[2:0]});

理解到這兒,本質(zhì)上兩種FIFO似乎沒(méi)什么區(qū)別,那為什么要用格雷碼編碼呢? 異步FIFO采用格雷碼的主要原因是為了減少在異步時(shí)鐘域中地址指針變化時(shí)可能出現(xiàn)的不穩(wěn)定性,從而增強(qiáng)異步FIFO的可靠性和穩(wěn)定性即使在亞穩(wěn)態(tài)進(jìn)行讀寫(xiě)指針抽樣也能進(jìn)行正確的空滿(mǎn)狀態(tài)判斷”。

下面兩張圖是采用格雷碼的異步FIFO觸發(fā)滿(mǎn)和空條件的截圖,從圖示可看出,4根標(biāo)紅的格雷碼地址指針 每一周期前后只有1位發(fā)生跳變,如wptr_gray:0010>0110>0111>0101>0100>1100>1101>1111>1110,這就是格雷碼的特性,保證了相鄰的兩個(gè)值只有一個(gè)位元發(fā)生變化,因此在變化時(shí)不會(huì)出現(xiàn)多個(gè)位同時(shí)變化,減少了不穩(wěn)定狀態(tài)的可能性。

圖片

滿(mǎn)條件

圖片

空條件

為什么2 進(jìn)制指針做空滿(mǎn)判斷存在不穩(wěn)定的可能呢?事實(shí)上 2 進(jìn)制讀指針在增減時(shí),經(jīng)常發(fā)生多位突變,比如 6 位地址 111111 會(huì)在下一時(shí)刻變成 000000 ,在實(shí)際電路中,這個(gè)變化過(guò)程要持續(xù)很長(zhǎng)一段時(shí)間,會(huì)由 111111 經(jīng)歷 6 個(gè)狀態(tài)轉(zhuǎn)移到達(dá) 000000 。比如 111111-> 101111 -> 100111 ->100110 -> 100100 -> 000100-> 000000 。由于寫(xiě)時(shí)鐘與讀時(shí)鐘不同步,異步的寫(xiě)時(shí)鐘很可能會(huì)在狀態(tài)不穩(wěn)定的中間某個(gè)狀態(tài)抽樣,這樣就會(huì)得到錯(cuò)誤的讀指針,進(jìn)而做出錯(cuò)誤的狀態(tài)判斷,導(dǎo)致系統(tǒng)異常。

當(dāng)采用格雷碼只有一個(gè)比特發(fā)生改變時(shí),即使在中間狀態(tài)抽樣,其結(jié)果也不外乎兩種:遞增前原指針和遞增后新指針。如果抽樣到遞增后的指針,預(yù)期結(jié)果跟設(shè)計(jì)一致。如果抽樣到遞增前的原指針,最壞的情況就是把“不滿(mǎn)”判斷成了“滿(mǎn)”,但是這并不會(huì)對(duì)邏輯產(chǎn)生影響,只是帶來(lái)了寫(xiě)操作的延遲。

總結(jié)(兩種fifo的主要區(qū)別)

因此,標(biāo)準(zhǔn)范式的FIFO和采用格雷碼的FIFO都存在一定的可能出現(xiàn)假滿(mǎn)空。兩者有一些區(qū)別,主要涉及到地址指針的表示和更新方式。以下是這兩種FIFO的主要區(qū)別:

  1. 地址指針的表示:
    • 標(biāo)準(zhǔn)范式的FIFO:常常使用二進(jìn)制表示的地址指針。這意味著每個(gè)存儲(chǔ)單元都有一個(gè)唯一的二進(jìn)制地址,用于指示數(shù)據(jù)在FIFO中的位置。
    • 采用格雷碼的FIFO:地址指針通常使用格雷碼來(lái)表示。格雷碼是一種二進(jìn)制碼,相鄰的兩個(gè)值只有一個(gè)位元發(fā)生變化。使用格雷碼可以減少地址指針在變化時(shí)的不穩(wěn)定性,從而減少在時(shí)鐘邊沿時(shí)的不穩(wěn)定狀態(tài)。
  2. 地址指針的更新方式:
    • 標(biāo)準(zhǔn)范式的FIFO:地址指針在每個(gè)時(shí)鐘周期朝一個(gè)方向遞增或遞減,用于確定要讀取或?qū)懭氲奈恢谩T趯?xiě)入數(shù)據(jù)時(shí),寫(xiě)指針增加;在讀取數(shù)據(jù)時(shí),讀指針增加。
    • 采用格雷碼的FIFO:格雷碼地址指針的更新方式相對(duì)復(fù)雜一些。格雷碼的特性使得在更新時(shí)只有一個(gè)位發(fā)生變化,這樣可以減少指針變化的不穩(wěn)定性。在讀寫(xiě)操作時(shí),格雷碼地址指針的更新可能需要一些額外的邏輯。
  3. 時(shí)序穩(wěn)定性:
    • 標(biāo)準(zhǔn)范式的FIFO:由于二進(jìn)制地址指針的性質(zhì),通用FIFO在時(shí)序上需要額外的同步邏輯,以確保地址指針的穩(wěn)定傳遞。這尤其在不同時(shí)鐘域的情況下需要考慮。
    • 采用格雷碼的FIFO:格雷碼的特性減少了地址變化的不穩(wěn)定性,因此在一些時(shí)序方面可能更容易處理。但格雷碼的使用可能需要更多的邏輯來(lái)實(shí)現(xiàn)。

選擇使用哪種FIFO設(shè)計(jì)取決于具體的應(yīng)用需求和時(shí)序約束。格雷碼的FIFO在一些特定情況下可能提供一些優(yōu)勢(shì),但也需要權(quán)衡設(shè)計(jì)的復(fù)雜性。

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

    關(guān)注

    3

    文章

    389

    瀏覽量

    43855
  • 信號(hào)
    +關(guān)注

    關(guān)注

    11

    文章

    2804

    瀏覽量

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

    關(guān)注

    0

    文章

    52

    瀏覽量

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

    關(guān)注

    0

    文章

    20

    瀏覽量

    8409
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于FPGA的異步FIFO的實(shí)現(xiàn)

    存儲(chǔ)器的區(qū)別是沒(méi)有外部讀寫(xiě)地址線(xiàn),這樣使用起來(lái)非常簡(jiǎn)單,但缺點(diǎn)就是只能順序?qū)懭霐?shù)據(jù),順序的讀出數(shù)據(jù),其數(shù)據(jù)地址由內(nèi)部讀寫(xiě)指針自動(dòng)加1完成,不能像普通存儲(chǔ)器那樣可以由地址線(xiàn)決定讀取或?qū)懭肽硞€(gè)指定的地址。 用途1: 異步FIFO讀寫(xiě)
    的頭像 發(fā)表于 06-21 11:15 ?6567次閱讀
    基于FPGA的<b class='flag-5'>異步</b><b class='flag-5'>FIFO</b>的實(shí)現(xiàn)

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

    相鄰的只有1bit的差異,因此常常用于異步
    的頭像 發(fā)表于 11-01 17:37 ?1470次閱讀
    <b class='flag-5'>異步</b><b class='flag-5'>FIFO</b>設(shè)計(jì)之<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>碼</b>

    詳細(xì)討論異步FIFO的具體實(shí)現(xiàn)???

    我在網(wǎng)上看到一篇利用來(lái)設(shè)計(jì)異步FIFO,但是看他們寫(xiě)的一些源碼,小弟有些不是很理解,在設(shè)計(jì)時(shí)為什么會(huì)出現(xiàn)Waddr和wptr兩個(gè)關(guān)于寫(xiě)
    發(fā)表于 05-19 11:04

    請(qǐng)問(wèn)SPI使用FIFO和不使用什么區(qū)別?使用FIFO效率更高嗎?

    本帖最后由 一只耳朵怪 于 2018-6-13 15:01 編輯 SPI使用FIFO和不使用什么區(qū)別,是不是使用FIFO效率更高
    發(fā)表于 06-13 11:12

    異步FIFO的VHDL設(shè)計(jì)

    給出了一個(gè)利用對(duì)地址編碼的羿步FIFO 的實(shí)現(xiàn)方法,并給出了VHDL 程序,以解決異步讀寫(xiě)時(shí)鐘引起的問(wèn)題。
    發(fā)表于 07-16 15:15 ?26次下載

    Camera Link接口的異步FIFO設(shè)計(jì)與實(shí)現(xiàn)

    介紹了異步FIFO在Camera Link接口中的應(yīng)用,將Camera Link接口中的幀有效信號(hào)FVAL和行有效信號(hào)LVAL引入到異步FIFO的設(shè)計(jì)中。分析了FPGA中設(shè)計(jì)
    發(fā)表于 07-28 16:08 ?32次下載

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

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

    利用VHDL語(yǔ)言和對(duì)地址進(jìn)行編碼的異步FIFO的設(shè)計(jì)

    FIFO (先進(jìn)先出隊(duì)列)是一種在電子系統(tǒng)得到廣泛應(yīng)用的器件,通常用于數(shù)據(jù)的緩存和用于容納異步信號(hào)的頻率或相位的差異。FIFO的實(shí)現(xiàn)通常是利用雙口RAM和讀寫(xiě)地址產(chǎn)生模塊來(lái)實(shí)現(xiàn)的。FIFO
    的頭像 發(fā)表于 08-02 08:10 ?2292次閱讀
    利用VHDL語(yǔ)言和<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>碼</b>對(duì)地址進(jìn)行編碼的<b class='flag-5'>異步</b><b class='flag-5'>FIFO</b>的設(shè)計(jì)

    異步FIFO的原因哪些

    異步FIFO通過(guò)比較讀寫(xiě)地址進(jìn)行滿(mǎn)空判斷,但是讀寫(xiě)地址屬于不同的時(shí)鐘域,所以在比較之前需要先將讀寫(xiě)地址進(jìn)行同步處理,將寫(xiě)地址同步到讀時(shí)鐘域再和讀地址比較進(jìn)行FIFO空狀態(tài)判斷(同步后的寫(xiě)地址一定
    的頭像 發(fā)表于 08-04 14:05 ?4482次閱讀

    異步fifo詳解

    異步fifo詳解 一. 什么是異步FIFO FIFO即First in First out的英文簡(jiǎn)稱(chēng),是一種先進(jìn)先出的數(shù)據(jù)緩存器,與普通存儲(chǔ)
    的頭像 發(fā)表于 12-12 14:17 ?4288次閱讀

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

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

    異步FIFO-

    很多人在面試時(shí)被問(wèn)到為什么異步FIFO中需要用到,可能大部分的答案是
    的頭像 發(fā)表于 08-26 14:20 ?1041次閱讀
    <b class='flag-5'>異步</b><b class='flag-5'>FIFO</b>-<b class='flag-5'>格</b><b class='flag-5'>雷</b><b class='flag-5'>碼</b>

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

    同步FIFO異步FIFO區(qū)別 同步FIFO異步FIFO
    的頭像 發(fā)表于 10-18 15:23 ?1766次閱讀

    關(guān)于另外一種設(shè)計(jì)異步FIFO的簡(jiǎn)介

    設(shè)計(jì)者為了提升FIFO的速度使用了將二進(jìn)制計(jì)數(shù)器和計(jì)數(shù)器結(jié)合在一起的方法,從最開(kāi)始用一組寄存器來(lái)進(jìn)行
    的頭像 發(fā)表于 10-20 10:50 ?515次閱讀
    關(guān)于另外一種設(shè)計(jì)<b class='flag-5'>異步</b><b class='flag-5'>FIFO</b>的簡(jiǎn)介

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

    1. FIFO簡(jiǎn)介 FIFO是一種先進(jìn)先出數(shù)據(jù)緩存器,它與普通存儲(chǔ)器的區(qū)別是沒(méi)有外部讀寫(xiě)地址線(xiàn),使用起來(lái)非常簡(jiǎn)單,缺點(diǎn)是只能順序讀寫(xiě),而不能隨機(jī)讀寫(xiě)。 2. 使用場(chǎng)景 數(shù)據(jù)緩沖:也就是數(shù)據(jù)寫(xiě)入過(guò)快
    的頭像 發(fā)表于 06-04 14:27 ?1805次閱讀
    同步<b class='flag-5'>FIFO</b>和<b class='flag-5'>異步</b><b class='flag-5'>FIFO</b><b class='flag-5'>區(qū)別</b>介紹
    百家乐信誉平台开户| 土豪百家乐官网的玩法技巧和规则 | 玩百家乐官网犯法| 皇家金堡娱乐| 百家乐手机壳| 百家乐视频麻将游戏| 沙龙百家乐官网娱乐城| 济阳县| 百家乐论坛代理合作| 百家乐官网赌马| 分宜县| 大发888婚庆车队| 金杯百家乐的玩法技巧和规则| 百家乐增值公式| 百家乐官网路珠多少钱| 百家乐官网赌场老千| 大发888娱乐成| 申博百家乐公式软件| 百家乐官网群| 百家乐官网槛| 百家乐官网娱乐城棋牌| 博彩一族| 大发888代充| 百家乐澳门赌| 百家乐官网光纤冼牌机| 百家乐官网翻天qvod粤语| 战神娱乐城| 大发888 赌博网站| 网页百家乐的玩法技巧和规则 | 百家乐网站排名| 百家乐游戏策略| 澳门百家乐官网海星王娱乐城| 泰盈娱乐城| 大发888优惠活动| 女优百家乐的玩法技巧和规则| 百家乐注册平台排名| 缅甸百家乐官网视频| 百家乐官网纯技巧打| 网上百家乐官网官方网站| 绥滨县| 宁陕县|