新聞中心

        EEPW首頁 > EDA/PCB > 設計應用 > 基于Verilog HDL的異步FIFO設計與實現

        基于Verilog HDL的異步FIFO設計與實現

        作者:山東大學 | 信息科學與工程學院 魏 芳 劉志軍 馬克杰 時間:2008-05-26 來源:電子技術應用 收藏

          在現代設計中,特別是在模塊與外圍芯片的通信設計中,多時鐘域的情況不可避免。當數據從一個時鐘域傳遞到另一個域,并且目標時鐘域與源時鐘域不相關時,這些域中的動作是不相關的,從而消除了同步操作的可能性,并使系統重復地進入亞穩定狀態[1]。在有大量的數據需要進行跨時鐘域傳輸且對數據傳輸速度要求比較高的場合,是一種簡單、快捷的解決方案。

        本文引用地址:http://www.104case.com/article/83024.htm

          用一種時鐘寫入數據,而用另外一種時鐘讀出數據。讀寫指針的變化動作由不同的時鐘產生。因此,對空或滿的判斷是跨時鐘域的。如何根據的指針信號產生正確的空、滿標志,是異步FIFO設計成敗的關鍵。本文提出一種新穎的異步FIFO設計方案,它通過先比較讀寫地址并結合象限檢測法產生異步的空/滿標志,再把異步的空/滿標志同步到相應的時鐘域。通過仿真驗證,該方法是穩定有效的。

          1 異步信號傳輸問題的分析

          在一個AS或FPGA庫中,每種觸發器都有時序要求。對于使用上升沿觸發的觸發器來說,建立時間(Setup Time)是在時鐘上升沿到來之前,觸發器數據保持穩定的最小時間;而保持時間(Hold Time)是在時鐘上升沿到來之后,觸發器數據還應該保持的最小時間[2]。如圖1所示,在時鐘上升沿前后的這個窗口內數據應該保持不變,否則會使觸發器工作在一個不確定的狀態,即。當觸發器處于,且處于的時間超過了一個時鐘周期時,這種不確定的狀態將會影響到下一級的觸發器,最終導致連鎖反應,從而使整個系統功能失常。當一個信號跨越某個時鐘域時,對新時鐘域的電路來說它就是一個異步信號。由于異步信號之間的時序是毫無關系的,因此必然存在Setup Time/Hold Time沖突。為了避免亞穩態問題,采用如圖2所示的雙鎖存器法[3],即在一個信號進入另一個時鐘域前,將該信號用兩個鎖存器連續鎖存兩次,最后得到的采樣結果就可以消除亞穩態。

               

               

          消除亞穩態只是保證了信號電平的穩定,要在不同時鐘域中準確傳輸數據還需要一個接口電路。異步FIFO就是一種不同時鐘域之間傳遞多位數據的常用方法。

          2 異步FIFO設計

          異步FIFO是一種先進先出電路,用在需要實時數據接口的部分,用來存儲、緩沖在兩個異步時鐘之間的數據傳輸。主要由雙口存儲器、讀地址產生邏輯、寫地址產生邏輯、空/滿標志產生邏輯四部分構成。圖3是一種常用的異步FIFO設計方案,其中,讀地址(rptr)和空標志(rempty)由讀時鐘 (rclk)產生,而寫地址(wptr)和滿標志(wfull)由寫時鐘(wclk)產生。把寫地址與讀地址相互比較以產生空/滿標志。由于讀寫地址的變化由不同的時鐘產生,所以對FIFO空或滿的判斷是跨時鐘域的。如何避免異步傳輸帶來的亞穩態以及正確地產生空/滿標志是設計異步FIFO的難點。

                

          2.1 讀寫地址產生邏輯

          讀寫地址線一般有多位,如果在不同的時鐘域內直接同步二進制碼的地址指針,則有可能產生亞穩態。例如,讀指針從011變化到100時,所有位都要變化,讀指針的每一位在讀時鐘的作用下,跳變不一致,即產生毛刺。如果寫時鐘恰好在讀指針的變化時刻采樣,得到的采樣信號可能是000~111中的任何一個,從而導致空/滿信號判斷錯誤。由實踐可知,同步多個異步輸入信號出現亞穩態的概率遠遠大于同步一個異步信號的概率[3]。解決這一問題的有效方法是采用格雷碼。格雷碼的主要特點是相鄰的兩個編碼之間只有一位變化。圖4是格雷碼產生的邏輯框圖。在讀使能或寫使能信號有效、并且空/滿標志無效的情況下,讀寫指針開始累加,進行FIFO讀或寫操作。二進制碼與格雷碼的轉換是一個“異或”運算:gnext=(bnext>>1)^bnext。格雷碼gnext 經寄存器輸出格雷碼指針ptr。這種方法采用了兩組寄存器,雖然面積較大,但是有助于提高系統的工作頻率。

          2.2 空/滿標志產生邏輯

          正確地產生空/滿標志是設計任何類型FIFO的關鍵點???滿標志產生的原則是:寫滿而不溢出,能讀空而不多讀。傳統的異步FIFO把讀寫地址信號同步后再進行同步比較以產生空滿標志,由于讀寫地址的每一位都需要兩級同步電路,大量使用寄存器必然要占用很大的面積。這種方法不適合設計大容量的FIFO。當讀、寫指針相等也就是指向同一個內存位置時,FIFO可能處于滿或空兩種狀態,必須區分FIFO是處于空狀態還是滿狀態。傳統的做法是把讀、寫地址寄存器擴展一位,最高位設為狀態位,其余低位作為地址位。當讀寫指針的地址位和狀態位全部吻合時,FIFO處于空狀態;當讀寫指針的地址位相同而狀態位相反時, FIFO處于滿狀態。傳統的異步FIFO工作頻率低、面積大。下面將介紹一種產生空/滿標志的新方法。

                 


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 同仁县| 望江县| 浪卡子县| 新宁县| 东台市| 齐齐哈尔市| 吴堡县| 杭州市| 隆昌县| 乌苏市| 大安市| 湖州市| 伊川县| 江陵县| 唐河县| 苍山县| 沅陵县| 桂东县| 利川市| 恩施市| 灵璧县| 慈溪市| 孟村| 洪雅县| 庐江县| 桃园市| 隆回县| 灌云县| 达拉特旗| 疏勒县| 武冈市| 汽车| 永定县| 古蔺县| 河西区| 辉南县| 永嘉县| 鄂州市| 县级市| 漳州市| 罗源县|