資源描述:
《使用verilog hdl實現(xiàn)異步fifo設(shè)計與實現(xiàn) fifo 讀寫 時序》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、使用VerilogHDL實現(xiàn)異步FIFO設(shè)計與實現(xiàn)FIFO讀寫時序在現(xiàn)代IC設(shè)計中,特別是在模塊與外圍芯片的通信設(shè)計中,多時鐘域的情況不可避免。當(dāng)數(shù)據(jù)從一個時鐘域傳遞到另一個域,并且目標(biāo)時鐘域與源時鐘域不相關(guān)時,這些域中的動作是不相關(guān)的,從而消除了同步操作的可能性,并使系統(tǒng)重復(fù)地進(jìn)入亞穩(wěn)定狀態(tài)[1]。在有大量的數(shù)據(jù)需要進(jìn)行跨時鐘域傳輸且對數(shù)據(jù)傳輸速度要求比較高的場合,異步FIFO是一種簡單、快捷的解決方案。 異步FIFO用一種時鐘寫入數(shù)據(jù),而用另外一種時鐘讀出數(shù)據(jù)。讀寫指針的變化動作由不同的時鐘產(chǎn)生。因此,對FIFO空或滿的判斷是跨時鐘域的
2、。如何根據(jù)異步的指針信號產(chǎn)生正確的空、滿標(biāo)志,是異步FIFO設(shè)計成敗的關(guān)鍵。本文提出一種新穎的異步FIFO設(shè)計方案,它通過先比較讀寫地址并結(jié)合象限檢測法產(chǎn)生異步的空/滿標(biāo)志,再把異步的空/滿標(biāo)志同步到相應(yīng)的時鐘域。通過仿真驗證,該方法是穩(wěn)定有效的?! ?異步信號傳輸問題的分析 在一個ASIC或FPGA庫中,每種觸發(fā)器都有時序要求。對于使用上升沿觸發(fā)的觸發(fā)器來說,建立時間(SetupTime)是在時鐘上升沿到來之前,觸發(fā)器數(shù)據(jù)保持穩(wěn)定的最小時間;而保持時間(HoldTime)是在時鐘上升沿到來之后,觸發(fā)器數(shù)據(jù)還應(yīng)該保持的最小時間[2]。如圖1
3、所示,在時鐘上升沿前后的這個窗口內(nèi)數(shù)據(jù)應(yīng)該保持不變,否則會使觸發(fā)器工作在一個不確定的狀態(tài),即亞穩(wěn)態(tài)。當(dāng)觸發(fā)器處于亞穩(wěn)態(tài),且處于亞穩(wěn)態(tài)的時間超過了一個時鐘周期時,這種不確定的狀態(tài)將會影響到下一級的觸發(fā)器,最終導(dǎo)致連鎖反應(yīng),從而使整個系統(tǒng)功能失常。當(dāng)一個信號跨越某個時鐘域時,對新時鐘域的電路來說它就是一個異步信號。由于異步信號之間的時序是毫無關(guān)系的,因此必然存在SetupTime/HoldTime沖突。為了避免亞穩(wěn)態(tài)問題,采用如圖2所示的雙鎖存器法[3],即在一個信號進(jìn)入另一個時鐘域前,將該信號用兩個鎖存器連續(xù)鎖存兩次,最后得到的采樣結(jié)果就可以消
4、除亞穩(wěn)態(tài)。?????????????? 消除亞穩(wěn)態(tài)只是保證了信號電平的穩(wěn)定,要在不同時鐘域中準(zhǔn)確傳輸數(shù)據(jù)還需要一個接口電路。異步FIFO就是一種不同時鐘域之間傳遞多位數(shù)據(jù)的常用方法?! ?異步FIFO設(shè)計 異步FIFO是一種先進(jìn)先出電路,用在需要實時數(shù)據(jù)接口的部分,用來存儲、緩沖在兩個異步時鐘之間的數(shù)據(jù)傳輸。主要由雙口存儲器、讀地址產(chǎn)生邏輯、寫地址產(chǎn)生邏輯、空/滿標(biāo)志產(chǎn)生邏輯四部分構(gòu)成。圖3是一種常用的異步FIFO設(shè)計方案,其中,讀地址(rptr)和空標(biāo)志(rempty)由讀時鐘(rclk)產(chǎn)生,而寫地址(wptr)和滿標(biāo)志(wfull)
5、由寫時鐘(wclk)產(chǎn)生。把寫地址與讀地址相互比較以產(chǎn)生空/滿標(biāo)志。由于讀寫地址的變化由不同的時鐘產(chǎn)生,所以對FIFO空或滿的判斷是跨時鐘域的。如何避免異步傳輸帶來的亞穩(wěn)態(tài)以及正確地產(chǎn)生空/滿標(biāo)志是設(shè)計異步FIFO的難點(diǎn)。???????? 2.1讀寫地址產(chǎn)生邏輯 讀寫地址線一般有多位,如果在不同的時鐘域內(nèi)直接同步二進(jìn)制碼的地址指針,則有可能產(chǎn)生亞穩(wěn)態(tài)。例如,讀指針從011變化到100時,所有位都要變化,讀指針的每一位在讀時鐘的作用下,跳變不一致,即產(chǎn)生毛刺。如果寫時鐘恰好在讀指針的變化時刻采樣,得到的采樣信號可能是000~111中的任何一
6、個,從而導(dǎo)致空/滿信號判斷錯誤。由實踐可知,同步多個異步輸入信號出現(xiàn)亞穩(wěn)態(tài)的概率遠(yuǎn)遠(yuǎn)大于同步一個異步信號的概率[3]。解決這一問題的有效方法是采用格雷碼。格雷碼的主要特點(diǎn)是相鄰的兩個編碼之間只有一位變化。圖4是格雷碼產(chǎn)生的邏輯框圖。在讀使能或?qū)懯鼓苄盘栍行?、并且?滿標(biāo)志無效的情況下,讀寫指針開始累加,進(jìn)行FIFO讀或?qū)懖僮?。二進(jìn)制碼與格雷碼的轉(zhuǎn)換是一個“異或”運(yùn)算:gnext=(bnext>>1)^bnext。格雷碼gnext經(jīng)寄存器輸出格雷碼指針ptr。這種方法采用了兩組寄存器,雖然面積較大,但是有助于提高系統(tǒng)的工作頻率?! ?.2空/滿
7、標(biāo)志產(chǎn)生邏輯 正確地產(chǎn)生空/滿標(biāo)志是設(shè)計任何類型FIFO的關(guān)鍵點(diǎn)。空/滿標(biāo)志產(chǎn)生的原則是:寫滿而不溢出,能讀空而不多讀。傳統(tǒng)的異步FIFO把讀寫地址信號同步后再進(jìn)行同步比較以產(chǎn)生空滿標(biāo)志,由于讀寫地址的每一位都需要兩級同步電路,大量使用寄存器必然要占用很大的面積。這種方法不適合設(shè)計大容量的FIFO。當(dāng)讀、寫指針相等也就是指向同一個內(nèi)存位置時,F(xiàn)IFO可能處于滿或空兩種狀態(tài),必須區(qū)分FIFO是處于空狀態(tài)還是滿狀態(tài)。傳統(tǒng)的做法是把讀、寫地址寄存器擴(kuò)展一位,最高位設(shè)為狀態(tài)位,其余低位作為地址位。當(dāng)讀寫指針的地址位和狀態(tài)位全部吻合時,F(xiàn)IFO處于空
8、狀態(tài);當(dāng)讀寫指針的地址位相同而狀態(tài)位相反時,F(xiàn)IFO處于滿狀態(tài)。傳統(tǒng)的異步FIFO工作頻率低、面積大。下面將介紹一種產(chǎn)生空/滿標(biāo)志的新方法。?????????通過異