2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

異步FIFO的讀寫沖突如何解決???

 zhangquanling 2012-03-17
先進(jìn)先出緩存電路FIFO在大規(guī)模邏輯設(shè)計當(dāng)中,得到普遍地使用。幾乎每個芯片都會涉
及到它。也就是說每個大規(guī)模邏輯設(shè)計者都必須掌握該種電路的設(shè)計方法。但在實際應(yīng)
用中,F(xiàn)IFO的類型又不盡相同。有的電路需要的是同步FIFO(即:讀寫時鐘為同一個時
鐘),有的需要異步FIFO(即:讀寫時鐘的頻率或相位不一樣),有的電路對FIFO的速
度要求不高,有的則需要高速FIFO(比如工作頻率在100MHz以上)。同時具體電路對FI
FO的空滿標(biāo)志的產(chǎn)生也有一定的要求,有按一個深度進(jìn)行讀寫的,也有連續(xù)讀寫一塊的
(Burst read/write),有讀寫位寬一致的(256深×80bit <==> 256深×80bit,也有讀
寫位寬是倍數(shù)關(guān)系的(256深×80bit<==>1024深×20bit)。異步FIFO的讀寫地址轉(zhuǎn)變?yōu)?
格雷碼再進(jìn)行比較,產(chǎn)生空滿標(biāo)志,從而保證電路的可靠性。
XILINX的Coregen軟件可以生成一些通用的同步和異步FIFO,如果它不能滿足你的特定要
求,只好你自己動手了!不管是什么類型的FIFO,其關(guān)鍵點是產(chǎn)生讀、寫地址和空、滿
標(biāo)志。好的FIFO設(shè)計的基本要求是: 寫滿而不溢出; 讀空又不多讀。
同步FIFO的設(shè)計
同步FIFO的讀寫時鐘為相同的一個,所以讀寫地址是同步的。通過判斷FIFO中已經(jīng)存在
多少個沒有被讀走的數(shù)據(jù)Cnt_fifo,來判斷讀空了,還是寫滿了。Cnt_fifo的產(chǎn)生:當(dāng)
FIFO進(jìn)行讀但不寫時,自增加1,當(dāng)FIFO進(jìn)行寫但不讀時,自減1,如果FIFO又讀又寫或
不讀也不寫,則該計數(shù)器不變。
滿標(biāo)志的產(chǎn)生:復(fù)位時,F(xiàn)ull信號初始化為1,表示FIFO滿;如果FIFO不讀,并且Cnt_f
ifo等于FIFO的深度Deepth_fifo時,或者Cnt_fifo等于(Deepth_fifo-1),并且正在寫(
即寫使能Write_enble有效)時,滿標(biāo)志應(yīng)該置1;其余情況置為0。
空標(biāo)志的產(chǎn)生:復(fù)位時,讓Empty信號為1,表示FIFO空;當(dāng)FIFO中的Cnt_fifo等于0或者
等于1并且正在讀FIFO時,Empty就應(yīng)置1,表示讀空了;其余情況則不空。置為0。
幾乎空Almost_empty和幾乎滿Almost_full標(biāo)志的產(chǎn)生:在實際應(yīng)用中為了便于正確產(chǎn)生
讀寫使能,避免多讀和寫溢出,經(jīng)常使用幾乎空和幾乎滿標(biāo)志,來提前預(yù)告FIFO的狀態(tài)
。要求FIFO還剩下可編程數(shù)量Cnt_empty的數(shù)據(jù)沒讀走時,就報告幾乎空,但是仍允許讀
走幾個?;蛘邔懭隖IFO的數(shù)據(jù)個數(shù)超過可編程數(shù)量Cnt_full的時候,就報告幾乎滿,但
仍允許寫入幾個數(shù)據(jù)。也就是說當(dāng)Cnt_fifo>Cnt_full時,F(xiàn)IFO就要置Almost_full為1,
表示幾乎空了。當(dāng)Cnt_fifo<Cnt_empty時,F(xiàn)IFO就要置Almost_empty為1,表示幾乎滿了

讀寫FIFO的使能的產(chǎn)生:為了確保FIFO即不多讀又不多寫,采用了自我保護(hù)方式,即:
  
真正的寫FIFO使能為外部的寫使能和FIFO不滿的組合;
(assign Write_allow = Write_enable && ! Full ;)
真正的讀FIFO使能為外部的讀使能和非空的組合;
(assign Read_allow = Read_enable && ! Empty ; )。
FIFO的讀寫地址產(chǎn)生比較簡單,當(dāng)讀使能有效時,在時鐘作用下,讀地址加1;當(dāng)寫使能
有效時,寫地址加1。
當(dāng)FIFO深度較大時,同時FIFO的速度要求較高時,可以采用線性反饋移位計數(shù)器(LFSR
)。它的速度非??欤且獱奚粋€地址。
異步FIFO的設(shè)計
所謂異步是指讀、寫時鐘是完全獨(dú)立并且不一致的,或者不同頻率,或者同頻但不同相
。讀地址和空標(biāo)志是由讀時鐘產(chǎn)生的,而寫地址和滿標(biāo)志則由寫時鐘產(chǎn)生,當(dāng)要產(chǎn)生FI
FO的空、滿標(biāo)志時,必須進(jìn)行讀寫地址的比較時,問題就來臨了。如果直接采樣地址比
較的話,地址線一般有多位,寫地址的每一位在寫時鐘作用下,跳變得不一致,即產(chǎn)生
毛刺,要過一小段時間才能穩(wěn)定。在未穩(wěn)定期內(nèi),剛好讀時鐘進(jìn)行采樣寫地址,這時就
出現(xiàn)誤判斷,邏輯錯誤。同時采樣讀寫地址相差N個來產(chǎn)生空滿信號,時間上會多一些,
因為涉及加和減操作。
為避免地址跳變的不一致造成讀寫地址誤判斷,通常采用格雷碼。此外,還要根據(jù)實際
情況的具體要求采用不同的解決辦法,如:
1、加入一個高速時鐘,使讀寫時鐘頻差在4倍以上;
2、在需要對FIFO包尾進(jìn)行特殊處理,必須把包尾讀出FIFO的情況下,可在異步FIFO后在
加上一個小同步FIFO;
3、還可以通過FIFO備份,讀寫操作在兩個FIFO間按包切換等;
4、還可以強(qiáng)制讀寫指針在讀完一個包和寫完一個包時跳變加上一個恒值。
5、請參閱第1章“跨越異步時鐘邊界傳輸數(shù)據(jù)的解決方案”部分的內(nèi)容。
格雷碼的優(yōu)點是相鄰兩值只有一位跳變,其他不變,這樣地址變化的時間較短,極大提
高比較精度。
格雷碼的時序
格雷碼是不能進(jìn)行加減產(chǎn)生空滿標(biāo)志的,那怎么辦?采樣延時一拍的方法。用讀地址Rd
_addr產(chǎn)生讀地址的格雷碼Rd_next_gray_addr,將Rd_next_gray_addr延一拍得到Rd_gr
ay_addr,再將Rd_gray_addr延一拍得到Rd_last_gray_addr。你會發(fā)現(xiàn)在絕對時間上,
Rd_next_gray_addr、Rd_gray_addr、Rd_last_gray_addr這個地址有先后關(guān)系,從大到
小排列,并且相差1。如圖1所示。
寫地址的格雷碼的產(chǎn)生也類似。即: Wt_next_gray_addr、Wt_gray_addr、Wt_last_gr
ay_addr。利用這6個格雷碼進(jìn)行比較,同時加上讀寫使能,就能等待空和滿標(biāo)志。
先說空標(biāo)志Empty吧!當(dāng)讀寫格雷碼地址相等(Rd_gray_addr = = Wt_gray_addr)或者
FIFO內(nèi)還剩下一個深度的字(Rd_next_gray_addr = = Wt_gray_addr),并且正在不空
的情況下執(zhí)行讀操作(Read_enable = = 1),這時Empty標(biāo)志應(yīng)該置為有效(高電平有
效)。
滿標(biāo)志Full:當(dāng)寫FIFO的格雷碼地址等于上次讀的格雷碼地址時(Wt_gray_addr= = Rd
_last_gray_addr),或者下次要寫的格雷碼地址等于上次讀的格雷碼地址(Wt_next_g
ray_addr= = Rd_last_gray_addr),并且正在執(zhí)行寫操作。此時需要置Full標(biāo)志有效。
  
如果要產(chǎn)生幾乎空、幾乎滿標(biāo)志時,可以多做幾個格雷碼的延時地址,利用這些讀、寫
格雷碼地址距離遠(yuǎn)近關(guān)系就可以靈活的產(chǎn)生特定讀寫地址間距的幾乎空或幾乎滿標(biāo)志。
如果需要在大間距內(nèi)時,產(chǎn)生幾乎空滿信號(比如讀寫地址相差10),那必須采用另外
一種方法:以幾乎空為例。當(dāng)(讀地址-10)的格雷碼等于寫地址的格雷碼時,幾乎空
信號可以置位了。
讀寫地址的產(chǎn)生:如果外部寫使能(Write_enable)來了,同時FIFO的不滿的話,寫地
址自增1;如果讀使能(Read_enable)有效,同時FIFO不空的話,讀地址自增1。在進(jìn)行
地址的遞增時判斷FIFO的空滿標(biāo)志是為了自我保護(hù),避免讀寫地址交錯,產(chǎn)生錯誤邏輯
。
位寬變換FIFO
實際應(yīng)用中,需要進(jìn)行數(shù)據(jù)位寬的變換,比如輸入1024×16bit的數(shù)據(jù),輸出256×64bi
t的數(shù)據(jù)?;蛘哳嵉惯^來。如圖2所示。
FIFO的位寬的轉(zhuǎn)換
在我們的FIFO中使用到了雙端口RAM,它可以同時進(jìn)行讀和寫操作。就以輸入1024×16b
it的數(shù)據(jù),輸出256×64bit數(shù)據(jù)的FIFO為例說明,其他情況一樣。
顯然我們需要一個256×64bit的雙端口RAM。讀地址(Wt_addr[7:0])比較好辦,該地址
就是FIFO的深度。但是寫地址(Rd_addr[9:0])就要分為兩個部分,一個是與FIFO的深
度對應(yīng)的地址(Rd_addr[9:2]),另一個是位寬方向的地址(Rd_addr[1:0])。因為4個
寫地址才對應(yīng)一個讀地址。比較寫地址和讀地址的高8位就可以產(chǎn)生空、滿標(biāo)志(與前面
的FIFO類似)。
經(jīng)常與包打交道時,包有包頭,有包尾。當(dāng)讀到包尾時,不僅讀地址的低2位要變,高8
位也要變,要跳躍到下一個包的包頭。而包尾在4個地址中的位置,決定了讀地址的跳變
方式。
按塊操作的FIFO
實際應(yīng)用中,有執(zhí)行突發(fā)性(burst)的連續(xù)讀、寫N個深度的FIFO。也就是說對FIFO要
按照塊操作。說白了也就是分為高低地址。高地址為塊號,低地址為塊內(nèi)的地址。FIFO
的空滿標(biāo)志有讀寫的高位地址比較產(chǎn)生。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多