隨著(zhù)數字電子系統設計規模的擴大,一些實(shí)際應用系統中往往含有多個(gè)時(shí)鐘,數據不可避免地要在不同的時(shí)鐘域之間傳遞。如何在異步時(shí)鐘之間傳輸數據,是數據傳輸中一個(gè)至關(guān)重要的問(wèn)題,而采用FIFO正是解決這一問(wèn)題的有效方法。異步FIFO是一種在電子系統中得到廣泛應用的器件,多數情況下它都是以一個(gè)獨立芯片的方式在系統中應用。本文介紹一種充分利用FPGA內部的RAM資源,在FPGA內部實(shí)現異步FIFO模塊的設計方法。這種異步FIFO比外部 FIFO 芯片更能提高系統的穩定性。 1 FIFO的基本結構和工作原理 FIFO(First In First Out)是一種采用環(huán)形存儲結構的先進(jìn)先出存儲器。其使用一個(gè)雙端口存儲器存放數據,數據發(fā)送方在一端寫(xiě)入數據,接收方在另一端讀出數據,能夠協(xié)調好兩個(gè)時(shí)鐘域的工作,滿(mǎn)足高時(shí)鐘頻率的要求。FIFO在FPGA設計中主要用來(lái)緩沖數據和隔離時(shí)鐘或相位差異。訪(fǎng)問(wèn)FIFO時(shí)不需要地址線(xiàn),只需要數據線(xiàn)和讀寫(xiě)控制信號線(xiàn),且數據地址由內部讀寫(xiě)指針自動(dòng)加1完成,因此利用FIFO實(shí)現數據的緩存具有接口簡(jiǎn)單、讀寫(xiě)方便的優(yōu)點(diǎn)。 根據FIFO的工作時(shí)鐘,可將FIFO分為同步FIFO和異步FIFO。同步FIFO是指讀時(shí)鐘和寫(xiě)時(shí)鐘為同一個(gè)時(shí)鐘,在時(shí)鐘沿來(lái)臨時(shí)同時(shí)進(jìn)行讀寫(xiě)操作;異步FIFO是指讀寫(xiě)時(shí)鐘不是同一個(gè)時(shí)鐘,而是相互獨立的。實(shí)際上,工作在同一時(shí)鐘的FIFO很少用到,多數都是讀寫(xiě)時(shí)鐘獨立的異步FIFO。本文設計的異步FIFO位寬為8,深度(即FIFO可以存儲8位數據的個(gè)數)為1 024。異步FIFO的結構如圖1所示。 ![]() 雙端口RAM存儲器具有獨立的讀寫(xiě)端口。如果用一個(gè)單端口RAM存儲器實(shí)現異步FIFO,還應該包含一個(gè)仲裁器來(lái)保證同一時(shí)刻只能有一種操作(讀或寫(xiě)操作)。本文選擇的雙端口RAM并不一定是真正的雙端口,只要有獨立的讀寫(xiě)端口即可。讀寫(xiě)控制邏輯由加法計數器構成,實(shí)現讀寫(xiě)地址的自動(dòng)加1功能?眨瘽M(mǎn)標志位的產(chǎn)生邏輯給系統提供空(empty)和滿(mǎn)(full)信號。 2 異步FIFO設計中的問(wèn)題與解決辦法 2.1 亞穩態(tài)問(wèn)題 在含有觸發(fā)器的電路中往往會(huì )出現亞穩態(tài)問(wèn)題。亞穩態(tài)會(huì )使異步FIFO的讀寫(xiě)地址發(fā)生錯誤,產(chǎn)生誤讀或者誤寫(xiě)。為此異步FIFO設計中亞穩態(tài)問(wèn)題也是一個(gè)比較重要的問(wèn)題。亞穩態(tài)不可能完全消除,只能使其出現的概率降到最低。主要有2種方法來(lái)降低亞穩態(tài)出現的概率: ①采用觸發(fā)器冗余方式。即采用多個(gè)觸發(fā)器級聯(lián)的方式,使本來(lái)出現概率為P的亞穩態(tài),其出現概率降低到P2,但這種方式會(huì )導致延時(shí)增加。 ②使用格雷碼。格雷碼的相臨碼元之間只有一位發(fā)生變化,這就大大地降低了亞穩態(tài)出現的概率。本文采用格雷碼方式。 2.2 空/滿(mǎn)標志位的判斷 為保證數據的正確寫(xiě)入和讀出,不發(fā)生寫(xiě)滿(mǎn)和讀空操作,怎樣判斷空/滿(mǎn)標志位的產(chǎn)生就成為異步FIFO設計的核心問(wèn)題。異步FIFO是環(huán)形存儲的,當讀寫(xiě)地址指針相等時(shí),意味著(zhù)空標志位或者滿(mǎn)標志位的產(chǎn)生。但是卻不能確定是寫(xiě)滿(mǎn)還是讀空狀態(tài)。為解決這一問(wèn)題,本文將轉換為格雷碼后的讀寫(xiě)地址指針?lè )謩e經(jīng)過(guò)檢測和計數器。每當讀寫(xiě)指針遍歷一圈(當讀寫(xiě)地址指針指向雙端口RAM的最后一個(gè)地址)時(shí),寫(xiě)計數i加1,讀計數j加1。這樣寫(xiě)滿(mǎn)狀態(tài)和讀空狀態(tài)的判斷就需要同時(shí)滿(mǎn)足兩個(gè)條件。下面分別給出寫(xiě)滿(mǎn)和讀空狀態(tài)的判斷。 ①寫(xiě)滿(mǎn)狀態(tài)的判別:當讀地址指針等于寫(xiě)地址指針,并且i>j時(shí),產(chǎn)生滿(mǎn)標志。 ②讀空狀態(tài)的判別:當寫(xiě)地址指針等于讀地址指針,并且i=j時(shí),產(chǎn)生空標志。 由于空/滿(mǎn)標志位產(chǎn)生的結構圖對稱(chēng),故本文只給出滿(mǎn)標志位產(chǎn)生的結構圖,如圖2所示。其中,主數i為寫(xiě)地址指針遍歷的圈數,計數j為讀地址指針遍歷的圈數。 ![]() 從圖2中可看出,地址指針轉換為格雷碼后,經(jīng)過(guò)檢測和計數環(huán)節,將讀寫(xiě)地址和讀寫(xiě)指針遍歷的圈數分別送入比較器進(jìn)行比較,從而準確地產(chǎn)生滿(mǎn)標志位。 3 FPGA內部軟異步FIFO設計 本設計中FPGA采用的是Xilinx Spartan3系列中的XC3S400PQ208。內部有56 Kb的分布式RAM和288 Kb的RAM,以及4個(gè)DCM(數字時(shí)鐘管理器)單元,為系統提供獨立的讀寫(xiě)時(shí)鐘頻率?梢岳眠@些資源在FPGA內部實(shí)現異步FIFO模塊。本文采用 VHDL語(yǔ)言對雙端口RAM的讀寫(xiě)操作進(jìn)行編程,實(shí)現FPGA內部軟FIFO的設計。部分讀寫(xiě)雙端口RAM和空/滿(mǎn)標志位的判斷源程序如下: ![]() ![]() 4 系統仿真 如果系統的讀時(shí)鐘頻率大于寫(xiě)時(shí)鐘頻率,就有可能出現讀空的情況;如果系統的寫(xiě)時(shí)鐘頻率大于讀時(shí)鐘頻率,就可能出現寫(xiě)滿(mǎn)的情況。在實(shí)際系統中,一般都設置寫(xiě)時(shí)鐘頻率大于讀時(shí)鐘頻率,故本文只考慮后一種情況。 本系統采用QuartusIl8.1對系統進(jìn)行仿真,由于系統深度較大,所以設定仿真時(shí)間為100 μs。系統剛上電時(shí),雙端口RAM中暫時(shí)沒(méi)有數據,此時(shí)系統處于讀空狀態(tài),empty變?yōu)楦唠娖,full保持低電平,如圖3所示。隨著(zhù)RAM中數據的不斷寫(xiě)入,系統進(jìn)入寫(xiě)滿(mǎn)狀態(tài),此時(shí)full變?yōu)楦唠娖,而empty變?yōu)榈碗娖,如圖4所示。 ![]() ![]() 結 語(yǔ) 本文根據異步FIFO設計的難點(diǎn)和要點(diǎn),提出了具體的解決方案。在空/滿(mǎn)標志位產(chǎn)生條件的判斷上提出了“檢測+計數器”的新思路,使系統設計方便實(shí)用,并采用格雷碼方式降低了亞穩態(tài)出現的概率。通過(guò)驗證,這種方法在有效判斷空/滿(mǎn)標志位方面有很大的優(yōu)勢。 參考文獻 1. 雷海衛,劉俊.FPGA中軟FIFO的設計與實(shí)現[J].微計算機信息,2008,24(2):207-209. 2. 于海,樊曉椏.基于FPGA異步FIFO的研究與實(shí)現[J].微電子學(xué)與計算機,2007,24(3):210-216. 3. 楊軍,孔兵,宋克儉,等.基于FPGA的高速異步FIFO存儲器設計[J].云南大學(xué)學(xué)報:自然科學(xué)版,2007,29(6):560-565. 4. 潘松,黃繼業(yè).EDA技術(shù)使用教程[M],北京:科學(xué)出版社,2007. 作者:謝文華 高文華 太原科技大學(xué) ) 來(lái)源:《單片機與嵌入式系統應用》 2009(8) |