FIFO在FPGA設計中除了上篇所介紹的功能之外, 還有以下作為以下功能使用: (1) 內存申請 在軟件設計中,使用malloc()和free()等函數可以用于內存的申請和釋放。特別是在有操作系統的環境下,可以保證系統的內存空間被動態的分配和使用,非常的方便。如果在FPGA內部實現此動態的內存分配和申請,相對來說較為復雜,例如某些需要外部數據存儲且需動態改變的應用需求下,需要對FPGA外部DDR(或SRAM等)的存儲空間,進行動態的分配和釋放。通過使用FIFO作為內存分配器,雖然比不上軟件的靈活和方便,但是使用也較為簡便。 舉例說明假設外部存儲空間為8Mbyte,可將其劃分為8192個1Kbyte空間。并將數值0-8191存儲FIFO中,FIFO內部存儲所標示可用的內存空間。如下圖所示。 首先,進行內存的初始化,即將0-8191寫入FIFO中。 如需申請內存后,從FIFO中讀取值A,然后根據A的標示,寫入A所指示的外部存儲區(DDR)中相應的位置,即申請{A,10’h0_00} ->{A,10’h3_FF}的空間區域。 如釋放內存后,即可向FIFO中寫入相應的值。即可保證下次該空間能夠被設計使用。 在此種設計中,FIFO承擔了內存分配和釋放器的角色。此時只能申請或釋放最小單元倍數的內存空間,如本例所示:為1Kbit。如FIFO讀空,則代表申請內存失敗,需要等待其他塊內存釋放后再寫入FIFO中,才能再次申請。 (2) 串并轉換 對于串并轉換,可能對于FPGA工程師來說,非常常見,但是如果有專門的IP實現此功能,可簡化設計,減少出錯及驗證的工作量。例如:對于外部輸入的需要進行串并轉換的信號,并進行存儲的信號,如設計進行串并轉換在存儲等操作,設計,可以直接通過例化讀寫位寬不一致的FIFO,例如1入8出的FIFO,可直接將外部輸入信號直接轉換成8BIT信號并進行存儲后,供后續處理使用(其他的)。 (3) 業務優先級劃分 通過FIFO設置不同水位線,可以劃分不同的業務優先級,保證高業務優先級數據流在帶寬受限時,優先通過,而低業務優先級只能在滿足高優先級需求后有多余的帶寬時才能通過。并且可以劃分多個優先級,滿足多種業務的需求。設計將在以后篇幅中詳述。 (4)固定帶寬設定 通過對FIFO接口的讀出使能,能夠保證實現固定帶寬的輸出,例如FIFO讀接口為32bit,而讀時鐘為50Mhz,則輸出為1.6Gbit/S。如實現固定帶寬的輸出(如1Gbit/S),有兩種方式,一種可以通過降低時鐘頻率到31.25Mhz。另一種方式,可通過讀信號中間插入等待周期,如果讀出長度為N的數據所需時鐘周期為M,則需等待(3M/5)的周期,從而降低至1Gbit/S的處理能力,這在某些需要進行流量限制的業務方式中使用。 對于FIFO來說,作為FPGA內部資源的一個常用器件,最常見應用于異步時鐘域劃分和緩沖數據,但不僅限于此,簡化設計、減少耦合、輸入輸出接口固定,便于仿真和驗證,都是使用FIFO帶來的設計上的益處。 |