現代數字系統中,異步FIFO是一種被廣泛應用于跨時鐘域進行數據傳輸的有效方式。異步FIFO主要應用于兩種不同時鐘域的數據傳輸,這意味著數據的寫入在一個時鐘域,而數據的讀出卻在另一個時鐘域,兩個時鐘完全異步[1]。現代通信系統中,特別是在移動通信系統中,人們對于節能型的產品提出了更高的要求。隨著技術的發展,FPGA的技術、性能、穩定性等指標已經得到很大提高,同時FPGA廠商為不同的應用開發提供了各種IP核,大大減少了產品的開發周期,在各大FPGA廠商中,Xilinx的IP核應用比較廣泛。但其IP核卻沒有關于異步FIFO節能方面的設計。在文獻[2]中對于FIFO的設計有節能方面的改進,由于其主要應用于ASIC設計,對于FPGA中的應用并不完全適用。 本文提出了一種更加節能而且能應用于高速應用的FPGA設計,同時本文提出一種改進的格雷碼二進制碼轉換結構,在此基礎上利用Xilinx的FPGA芯片現有的數字時鐘管理模塊實現節能方面改進。本文所提出的結構不依賴于現有的IP核,而且可以容易地建立自己的IP核。實際應用中,通過FPGA與DSP進行數據傳輸可工作于高達100/153.6 MHz讀/寫時鐘域。 1 FIFO的主要結構 1.1 主要的FIFO結構 在所有FIFO結構中,首先要提到的是單時鐘域的同步FIFO,雖然同步FIFO在現在的實際應用中很少被使用,但是其結構將有助于理解兩個時鐘域的異步FIFO的實現。主要有線性結構的FIFO和線性可調結構的FIFO[2]。其結構圖如圖1。 線性可調FIFO只是在線性FIFO的基礎上增加了控制信號以便于容量擴展。從圖1中可以看出,無論線性的FIFO還是線性可調結構的FIFO,都是由一些移位寄存器所組成,其主要優點是結構簡單容易實現。從數據的輸入到輸出這一過程看,數據都要經過每個寄存器,當FIFO容量變大時,這類結構的缺點也很突出,如數據從輸入到輸出的延時時間長,而且能耗比較大。 為了克服以上FIFO結構的缺點,人們提出了很多改善的結構,其中有并行的FIFO、樹型FIFO、折疊型的FIFO[2]、環型結構的FIFO[1]。在這些結構中,由于環型的FIFO結構設計相對容易而被廣泛采用。本文實現的是基于環型的FIFO結構,并在此基礎上進行了節能型的設計改進,使之應用于現代FPGA中。環型結構的FIFO是一種雙時鐘域的FIFO結構,數據在不同的時鐘域中傳輸時需要考慮數據傳輸的有效性,同時必需克服數據在不同的時鐘中傳輸時而產生的亞穩態。 1.2 亞穩態 數據在傳輸的過程中,接收寄存器收到變化的數據時,數據的改變發生在時鐘觸發沿而導致接受數據出現不穩定的狀態[3]稱為亞穩態,如圖2上部分所示。因此在異步時鐘之間進行數據傳輸常常會用到同步單元。單字節同步單元比較簡單,而其常用的同步單元的結構如圖2下半部分所示。在多位的跨時鐘域數據傳輸中,情況比單比特的數據傳輸復雜得多,由于存在多位數據同時變化的情況,為了提高數據傳輸的穩定性,采用將二進制碼轉化為格雷碼[2]后傳輸。 2 主體結構與具體實現 本文所采用的結構是基于環型FIFO結構[1],其整體結構如圖3所示。在圖3中,總線用粗實線表示,其中總線上的數字(如m)表示總線位寬;控制線用虛線表示,輸入、輸出的信號(如FIFO空/滿信號)用細的實線表示,箭頭表示輸入/出方向。從圖3中可以清楚地看出,整個異步FIFO的結構由讀/寫控制模塊、讀/寫同步模塊、讀/寫時鐘控制模塊以及雙口的RAM七個模塊組成。由于采用模塊化的設計結構,以上的結構并不局限于具體的應用,可以很容易設計成實際應用需求的IP核,而且容易升級,相對于傳統的設計,增加的時鐘控制模塊能有效提高能效。 2.1 FIFO空/滿信號的產生 在異步FIFO的設計中,空/滿信號的產生是其主要的難點。當寫入數據時,寫信號指針追上讀信號指針的情況,意味著FIFO滿的狀態。同理在讀出數據時,讀地址指針追上寫地址指針的情況,意味著FIFO為空狀態。以上的分析可以得出,不能簡單通過讀地址指針等于寫地址指針來判定FIFO的空/滿狀態。有效的解決方法在文獻[1]、文獻[2]中都被采用。若FIFO的深度為N,則其讀/寫地址指針的寬度應為log2(N)位,讀/寫地址指針都增加一位,變為log2(N)+1位后,測試讀地址指針與寫地址指針,當兩者相等時,FIFO即為空狀態。而當FIFO讀地址指針與寫地址指針的最高有效位不同而其他有效位完全相同時,即為FIFO滿狀態,這種循環的地址指針即是環型FIFO的由來。在本文的設計中,空/滿信號不僅用于指示FIFO的狀態,還用于讀/寫時鐘的控制,從而達到節能的目地。 2.2 讀控制模塊 讀數據控制模塊主要功能是:根據數據的輸出及讀請求信號產生用于讀數據的控制信號、讀地址指針、FIFO空(empty)信號以及用于控制寫時鐘Wr_full信號(其具體功用在2.3中介紹)。當外部有數據讀出請求(Rd_req有效)且FIFO不為空時,使能FIFO的讀有效,FIFO輸出數據,輸出數據完成后讀地址指針加1。其中空信號的產生采用2.1中的方法,其內部實現的具體框圖如圖4所示。 在圖4中,讀控制邏輯單元主要用于產生讀使能信號,依據讀請求信號和FIFO的空(empty)信號產生讀使能。當有讀請求并且FIFO不為空時,讀使能有效,同時使地址指針加1。讀地址計數器即是一個二進制的計數器,產生輸入雙口RAM的讀地址指針。由于讀地址指針要傳輸到寫控制模塊,而兩模塊處于不同的時鐘域,為了使數據有效傳輸到寫時鐘域,采用先將讀地址指針表示的二進制數轉化為格雷碼(具體實現參見文獻[2])后再傳輸。 2.2.1 同步模塊的實現 由于實際應用于系統中時鐘頻率較高,為了達到穩定,選擇了流水線的同步器單元。在圖2的基礎上增加寄存器的位寬。為了使系統的穩定性增強,采用三級流水線的結構,當然,也可以根據自己實際的需要而增減流水線級數。 2.2.2 格雷碼二進制碼轉化 為了應用環型指針區別FIFO的空/滿信號,需要將傳輸過來用格雷碼表示的寫地址指針轉化為二進制碼,格雷碼到二進制碼轉化的公式如式(1)。設格雷碼表示的數據與二進制碼有n位,格雷碼表示為:gn-1gn-2…g0,相應二進制碼表示為:bn-1bn-2…b0。轉化公式為: 式(1)中所示的加代表無進位的加法,實現中使用“異或門”即可。但是,完全按照式(1)來實現存在缺點,從式(1)中可以看出,其為一個遞推式,最先計算出最高有效位bn-1,最后計算出b0,一次轉化完成需要經過n-1個“異或門”的延時,當位數據位增加時,這將成為系統的運行瓶頸。在高速系統中表現的特別突出。提出一種改進的轉化單元。將式(1)轉化為式(2),如下所示: 可以看出,一次轉化只需要一個“異或門”的延時即可完成,但這種結構不適合FPGA中實現。在基本的門電路中,當門電路的扇入數據達到或者超過5時,延時將變得很大,而且大的扇入門電路的實現變得不現實且相當耗資源。將“異或門”的扇入數據限制在4以內(包括4個)。從“異或門”的規律中可以得出,任何變量與邏輯“0”異或,是其本身,而與“1”異或,是其相反變量。將待轉化的數據分為四位一組,第一組為(b3…b0),較高的位(如b7…b4)依此細分下去……最高的4位采用如式(2)中進行轉化,較低的4位如(bn-4…bn-7)采用如圖5的方式轉化……這種方式的轉化器相對于式(1)實現來說,在不增加門電路資源消耗的基礎上,能明顯提高轉化速度。| 2.2.3 相等判決單元 相等判決單元是一個二進制數比較器,當且僅當讀/寫地址指針完全相等時,給出空信號有效,否則空信號無效。 2.2.4 Rd_full信號產生單元 Rd_full信號產生單元的結構與FIFO滿(full)產生單元的結構相同,Rd_full信號是full信號在讀時鐘域中的一個復制信號,用于寫時鐘控制。在時鐘控制單元將詳細介紹其功能。 2.3 寫控制模塊 寫控制模塊的實現與讀模塊相似,由與讀模塊相應的單元組成。只是FIFO滿(full)時的產生邏輯為當讀地址指針與寫地址指針最高有效位不同,而其他位均完全相同時,滿信號有效。另一不同點體現在Wr_empty信號的產生上,Wr_empty只是FIFO為空(empty)信號時在寫時鐘域中的一個復制信號,用于讀時鐘的控制。 2.4 讀時鐘控制模塊 從以上的介紹中可以看出,各個模塊的工作統一由時鐘來管理,在高速的數字系統中,高速也將帶來高的能耗。筆者從實際工作中觀察發現,FIFO的工作是需要調配的,只有在DSP需要數據時,才需要FIFO處于工作狀態,而在DSP兩次需求之間,大量的時間中FIFO是處于空閑狀態(這樣的情形也符合大多數的實際應用)。可以充分利用這段空閑,讓FIFO既能在正常工作時高速而穩定地工作,同時在空閑時能盡可能降低能耗。時鐘控制模塊即能達到此目的。在空閑時,將FIFO的讀/寫時鐘停止,使空閑的模塊處于“休眠”狀態。但在正常工作時,時鐘能照常管理各個模塊。采用Virtex-4芯片內部自帶的時鐘管理模塊(Digital Clock Manager-DCM)[4]來實現。Virtex-4芯片中的DCM提供強大的時鐘管理功能,包括:時鐘去抖動、頻率合成、移相及動態時鐘配置。 應用中,主要利用其時鐘去抖動和動態時鐘配置兩項功能。在讀時鐘控制模塊中,當檢測到FIFO為空且Wr_empty同時有效時(如同時為高電平),通過DCM即可暫停讀時鐘。此時FIFO模塊中的所有讀組件將會停止運行。此時若寫入數據,由于Wr_empty處在寫時鐘域中,寫時鐘的控制下,Wr_empty將不會有效(變為低電平),此時通過DCM喚醒讀時鐘,可以正常讀出數據,同理可以控制寫時鐘的暫停與恢復。按照以上的原理設計,用Xilinx ISE 10.1仿真后,得到的仿真波形如圖6。clk_in為輸入時鐘,clk_out為經過控制的時鐘,而clk0_out是不經過控制的輸出時鐘。從圖中可以看出,當使能信號為有效(低電平)時,clk_out沒有時鐘輸出,而當使能信號無效時,clk_out時鐘正常恢復。可以通過將Wr_empty與empty經過“與非”后接到讀時鐘clk_en端即可。 2.5 寫時鐘控制模塊 寫時鐘控制模塊與讀時鐘控制模塊原理完全相同,只是輸入控制控制信號為Rd_full與full信號。 2.6 雙口RAM 雙口RAM的實現采用Xilinx的Virtex-4系列FPGA內部現有的資源,通過利用Virtex-4系列芯片中豐富的Block RAM資源,利用原語例化即可生成適合于實際應用需求的雙口RAM,參見文獻[4]。 3 整體仿真結果 本方案的實現在Xilinx的ISE10.1上綜合,仿真后得到如圖7所示整體仿真波形。仿真中,為了便于查看結果,將實際受到控制的讀/寫模塊的時鐘引出,分別標記為o_wr_clk,o_rd_clk。由于截圖的限制,只能在圖中顯示FIFO滿的情況。空的情況類似。 |