在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

怎樣設計一個同步FIFO?(2)

jf_78858299 ? 來源:IC加油站 硅谷老李 ? 作者:硅谷老李 ? 2023-05-04 15:55 ? 次閱讀

上一篇介紹了利用Flip Flop來作為存儲單元的同步FIFO設計。這一篇咱們來看如何利用2 Port SRAM來作為存儲單元設計同步FIFO。

開始往下讀之前,老李先問一個問題,假如現在讓你設計一個深度為N的基于2port SRAM的同步FIFO,請問至少需要多大的SRAM? 假設SRAM的位寬就是你的數據寬度,那么問題就是問你需要的SRAM的行數至少是多少?如果你覺得答案是顯而易見的N,那么你值得讀完這一篇。

首先來說為什么要用SRAM設計FIFO,很簡單為了省面積。我們說存1bit的數據,SRAM里一個bit cell經典結構是6個晶體管,而一個flip flop需要的晶體管在20個左右,那么從面積上來說,肯定是SRAM小對吧?但是這里面有個平衡點,對于一塊SRAM,算面積的時候不能僅僅算里面存儲單元bit cell的面積,還要算外圍的decode邏輯的面積。當SRAM的row size x column size比較小的時候,外圍的decode邏輯占的比重比較大,反而這個時候SRAM的總面積不如row x column個flop的面積小。至于這個轉折點要看工藝和memory compiler的data sheet,具體面積要拿SRAM的data sheet去比較。老李自己總結的一個經驗,不保證完全準確,在5nm工藝下,這個轉折點大概在2k bit,低于2k bit,比如16x32的大小,那還是Flop劃算,如果遠大于2k bit,那么就用SRAM,差不多在2-3k bit量級的時候要根據memory datasheet里的area number來比較。

再來說說什么是2 port SRAM,2 port 通常也被稱作dual port,一個端口為寫端口,一個端口為讀端口。這兩個端口可以同時工作,同一個周期內既可以讀,也可以寫,簡化的框圖如下圖所示

WCEN:Write Chip Enable Neg,當這個信號為0的時候,要寫入數據

WDATA: 要寫入的數據

WADDR:要寫入的地址

RCEN:Read Chip Enable Neg,當這個 信號為0的時候,要讀出數據

RDATA: 讀出的數據

RADDR: 讀出的地址

這里要注意,要寫入的數據是指WCEN為0那個周期的WDATA,而讀出的數據并不是RCEN為0那個周期的RDATA,而是下一個周期的RDATA。

時序圖如下圖所示

可以看到,cycle 1進行寫操作,在地址A0寫入數據D0。在cycle 2進行讀操作,要在cycle 3才能讀出D0。那你一定好奇如果給同一個地址在同一個周期又讀又寫怎么辦呢?這個不同的foundary的sram可以有不同的實現,這里表示的是一個較為常見的實現,看cycle 7,讀寫同時發生并且在同一個地址,在cycle 8讀出的還是之前寫入在這個地址的數據D0,而不是cycle 7寫入的新數據D1。只有再讀一次A0,你才能看到D1。

下面我們來考慮如何設計基于2port SRAM的同步FIFO。既然FIFO有push和pop端,也有wdata和rdata,那剛好對應SRAM的write port和read port,看起來我們大概只需要直接把SRAM包起來,用兩個計數器來分別計算write pointer和read pointer就可以了,如下圖所示

真的這么簡單嗎?我們來思考一個問題,用上面的FIFO來存第一個數D0,利用上面的結構,q能夠在push的下一個周期變為D0嗎?

回顧一下我們想要的FIFO的時序

在cycle1的時候我們push D0,我們期望Q在cycle 2的時候就可以輸出FIFO最頭上的數D0,而且注意,這個時候我們并沒有進行pop操作。

可是從上面SRAM的時序圖我們可以看到,要想讓RDATA輸出D0,我們至少要讓RCEN為0一個周期,而且RCEN為0必須得在WCEN為0之后,讓RDATA拿到D0最快也到了WCEN之后的2個周期,因而不滿足在PUSH之后下一個周期Q就輸出D0。

另外還有個問題,當我們push進去一個數之后,如果這個數寫入了SRAM,那么我們必須要有一次讀SRAM的操作,才能把數讀出來,這在上面的框圖里也就是要執行一次pop。這也和FIFO的工作相背離,因為FIFO可能并不是需要立刻pop。

那么我們怎么做才能讓Q在push的下一個周期輸出D0呢?環顧四周,好像除了利用Flip Flop也沒有別的辦法了。也就是說 ,第一個數我們把數不寫進SRAM,而是寫到一個Flop里,然后讓Q從Flop輸出

等等,說好了用SRAM來存數據的,怎么又把數據存到Flop里面去了呢?

別急,這里確實是沒有辦法的辦法,如果我們有可以和Flop時序一樣的SRAM,那么也可以不用這種辦法,但是在接受SRAM的時序是這樣的情況下,我們必須借助Flop來實現第一個數在push之后下一個周期就能夠出現在Q上。

當然,我們不是說所有的數都要用Flop來存,接下來push的數據我們還是要放在SRAM里面的,我們把上面的結構改一改,可以先設計出下面的FIFO結構。

在這個結構中,我們從D可以直接把數據存到輸出級的這個Flop中,相當于bypass了SRAM,然后我們的想法是:當第二次push的時候,我們再把數據存到SRAM里,同時,當我們把第一個數據pop出來之后,我們就把數據從SRAM里拿到這個輸出級的Flop中,這樣是不是就對了呢?

不好意思,其實還是有問題,我們假設FIFO里面已經存了2個數據,D0存在輸出級的Flop里,D1存在SRAM里,如下圖所示

那么當我們要pop一次之后,我們期望的FIFO的時序是:在pop的下一個周期,Q就應該是D1了,因為D0被彈出,FIFO最頭上的數是D1了。如下圖所示

但是如果在pop為1的那個周期去讀SRAM,則要在下一個周期RDATA才能讀出D1,再還需要一個周期才能把D1存到輸出級的Flop上,也就是pop之后兩個周期才能看到D1, 這樣就不滿足FIFO的時序了。

那怎么辦呢?我們只好省去把D1從RDATA存到Flop上的那一步,而是把RDATA當做Q來直接輸出。電路結構變成了下面

我們的設計思路就變成了

  1. 往FIFO里push的第一個數要bypass SRAM,把數據直接存到輸出級Flop去。
  2. 如果SRAM里面存了數,那么pop一次,就要把RDATA直接輸出到Q端。

看起來沒有問題了吧?其實還有一個特殊情況沒有考慮到,也就是當FIFO里只有一個數據,而在push下一個數據的時候同時來了pop。如下圖所示

那么這個時候要push的D1是不能往SRAM里寫的,一旦寫進去要讀出來還得多花一個周期,所以這個時候也是要bypass SRAM。

所以更加嚴謹的條件是

  1. 往FIFO里push的第一個數要bypass SRAM, 或者FIFO里只有1個數據,而且在push新數據的同時pop ,那么把數據直接存到輸出級Flop去。
  2. 當FIFO里只有一個數據的時候,Q端來自于輸出級Flop
  3. 如果SRAM里面存了數,那么pop一次,就要把RDATA直接輸出到Q端。

至此,我們利用一級flip flop來實現了省去一個讀SRAM的周期,可以實現FIFO的時序。

現在可以回答文章開頭的問題了,因為有了輸出級Flop來存第一個數據,那么SRAM其實并不需要存N個數據,只需要存N-1個數據就好了。但是在實際工作中,Width x N 和Width x (N-1)的面積其實沒有差很多,你用Width xN的SRAM完全沒有問題。當然要注意,這個時候memory 的address pointer和我們上一講里的wr_ptr, rd_ptr就不是完全一樣了,因為第一個數據并不是存在SRAM里。

寫到這里,是不是就完全搞定問題了呢?我們來分析一下,我們這樣設計可行其實是有一個前提,即SRAM的RDATA的timing是下面的。這里把開頭的圖再看一遍

我們說FIFO的Q在不pop的時候是穩定不變的,是利用了這里SRAM的特性,即讀完一次之后,RDATA的值會保持不變,一直到下一次讀操作(圖中的cycle 3-7),這樣我們就可以直接把RDATA輸出到Q。

但是并不是所有廠家的SRAM的時序是這樣的,大家要看廠家的memory的datasheet來確認時序(TSMC家的是這樣的, 但是可能別的廠家并不保證)如果SRAM時序是下面這樣,那么我們的設計就不能滿足FIFO的要求了

而且上面的設計可能還有一個STA上的問題,因為Q來自于RDATA,那么SRAM內部的clock-to-rdata的timing可能比較大,這樣給后面FIFO輸出的Q后面所留有的空間就比較小了。如果Q之后還要做邏輯運算,或者再下一級Flop距離比較遠,那么修timing的時候就比較挑戰。

要解決上面兩個問題,一個必然的思路是不能直接輸出RDATA到Q,還是要把RDATA給flop住,這樣一方面使得輸出Q可以保持穩定,另一方面,這一級flop依然在FIFO內部,從Flop直接輸出對于FIFO后級的timing有幫助。你看,兜兜轉轉,似乎還是要回到我們前面要斃掉的方案。那么我們要怎么設計,才能解決前面那個方案不滿足FIFO時序要求的缺陷呢?大家可以自己先思考一下,老李下篇再帶來更深入的講解。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7102

    瀏覽量

    89282
  • sram
    +關注

    關注

    6

    文章

    768

    瀏覽量

    114754
  • fifo
    +關注

    關注

    3

    文章

    389

    瀏覽量

    43770
收藏 人收藏

    評論

    相關推薦

    同步FIFO設計詳解及代碼分享

    FIFO (先入先出, First In First Out )存儲器,在 FPGA 和數字 IC 設計中非常常用。 根據接入的時鐘信號,可以分為同步 FIFO 和異步 FIFO
    發表于 06-27 10:24 ?2160次閱讀
    <b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>設計詳解及代碼分享

    求大神幫忙給VHDL 寫的同步FIFO

    急需同步FIFO,我這有,但是仿真圖不對,我也不知道是不是代碼有問題。
    發表于 03-15 09:25

    怎么實現同步FIFO 2點有兩輸出eindpoints和兩端點?

    你好我想實現同步FIFO 2點有兩輸出eindpoints和兩
    發表于 09-20 14:06

    異步FIFO結構

    設計FIFO是ASIC設計者遇到的最普遍的問題之。本文著重介紹怎樣設計FIFO——這是
    發表于 10-15 08:44 ?94次下載

    同步FIFO之Verilog實現

    FIFO的分類根均FIFO工作的時鐘域,可以將FIFO分為同步FIFO和異步FIFO
    的頭像 發表于 11-01 09:57 ?2027次閱讀

    怎樣設計同步FIFO?(1)

    今天咱們開始聊聊FIFO的設計。FIFO數字電路中常見的模塊,主要作用是數據產生端和接受端在短期內速率不匹配時作為數據緩存。FIFO
    的頭像 發表于 05-04 15:48 ?890次閱讀

    怎樣設計同步FIFO?(3)

    我們說這個結構之所以使得FIFO的輸出Q在讀完SRAM之后保持穩定,其實需要SRAM本身可以保持RDATA在讀操作之后的多個周期保持穩定。即SRAM本身的讀時序如下圖所示:圖中cycle 4,5,6都沒有讀操作,SRAM的RDATA依然保持D0不變。
    的頭像 發表于 05-04 15:59 ?677次閱讀
    <b class='flag-5'>怎樣</b>設計<b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>?(3)

    FIFO設計—同步FIFO

    FIFO是異步數據傳輸時常用的存儲器,多bit數據異步傳輸時,無論是從快時鐘域到慢時鐘域,還是從慢時鐘域到快時鐘域,都可以使用FIFO處理。
    發表于 05-26 16:12 ?1538次閱讀
    <b class='flag-5'>FIFO</b>設計—<b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>

    FIFO設計—異步FIFO

    異步FIFO主要由五部分組成:寫控制端、讀控制端、FIFO Memory和兩時鐘同步
    發表于 05-26 16:17 ?1563次閱讀
    <b class='flag-5'>FIFO</b>設計—異步<b class='flag-5'>FIFO</b>

    簡單的RTL同步FIFO設計

    FIFO 是FPGA設計中最有用的模塊之FIFO 在模塊之間提供簡單的握手和同步機制,是設計人員將數據從
    發表于 06-14 08:59 ?466次閱讀

    基于寄存器的同步FIFO

    ? FIFO 是FPGA設計中最有用的模塊之FIFO 在模塊之間提供簡單的握手和同步機制,是設計人員將數據從
    的頭像 發表于 06-14 09:02 ?785次閱讀

    基于Verilog的同步FIFO的設計方法

    同步FIFO的設計主要包括讀寫地址的產生、數據的讀寫、以及狀態的控制。下面我們將分別介紹這三方面的設計。
    發表于 08-31 12:53 ?903次閱讀

    同步FIFO設計分析

    模塊雖小但是要有新意,首先寫同步FIFO,這是爛大街的入門級項目,但是我肯定不會寫的那么
    的頭像 發表于 09-11 17:11 ?640次閱讀
    <b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>設計分析

    同步FIFO和異步FIFO的區別 同步FIFO和異步FIFO各在什么情況下應用

    簡單的種,其特點是輸入和輸出都與時鐘信號同步,當時鐘到來時,數據總是處于穩定狀態,因此容易實現數據的傳輸和存儲。 而異步FIFO則是在波形的上升沿和下降沿上進行處理,在輸入輸出端口處分別增加輸入和輸出指針,用于管理數據的讀寫。
    的頭像 發表于 10-18 15:23 ?1735次閱讀

    同步FIFO和異步FIFO區別介紹

    1. FIFO簡介 FIFO種先進先出數據緩存器,它與普通存儲器的區別是沒有外部讀寫地址線,使用起來非常簡單,缺點是只能順序讀寫,而不能隨機讀寫。 2. 使用場景 數據緩沖:也就是
    的頭像 發表于 06-04 14:27 ?1748次閱讀
    <b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>和異步<b class='flag-5'>FIFO</b>區別介紹
    主站蜘蛛池模板: 天天干夜夜爽| 成人午夜大片免费视频77777 | 国产女同在线观看| 国产小视频在线观看www| 成熟女性毛茸茸xx免费视频| 1024人成网色www| 亚洲一区二区免费在线观看| 操白虎美女| 色站在线| 免费你懂的| 多男一女一级淫片免费播放口| 伊人网在线观看| 免费一看一级毛片全播放| 一级aaa毛片| 五月婷激情| 亚洲一区二区免费视频| 综合亚洲色图| 四虎精品影院| 美女视频永久黄网站免费观看国产| 国久久| 在线免费看黄的网站| 日本在线黄色网址| 高清视频免费| 亚洲卡5卡6卡7国色天香| 伊人久久成人| 欧美一级在线观看视频| 国产清纯白嫩大学生正在播放| 亚洲操| 成人黄色免费观看| 免费a网| 五月亭亭免费高清在线| 免费爱爱视频网站| xxx86日本人| 国产美女视频黄a视频全免费网站| 亚洲欧美视频一区二区| 亚洲ol| 噜噜噜久久| 五月天在线婷婷| 奇米影视四色首页手机在线| 最新丁香六月| 六月综合|