李浩 申偉



摘? ?要:由于FPGA片內存儲資源有限,擴展外部存儲空間是必要的,然而眾多存儲芯片總線結構復雜,控制繁瑣。為此,本文以賽靈思的FPGA為平臺,設計一種以常用而快捷的axi_stream的形式訪問SDRAM的接口。
關鍵詞:FPGA? SDRAM? AXIS? FIFO? BRAM
隨著芯片的不斷更新換代,集成ARM核的FPGA芯片得到了廣泛的應用[1]。axi的總線協議在FPGA里面應用也越來越廣。axi_stream協議為axi的一種總線標準。本文將采用axi_stream的時序以fifo與bram的形式訪問SDRAM的設計與實現方法。
1? axis_sdram接口
本文將axis_sdram接口分為兩種,不帶地址的axis_fifo_sdram(下文簡稱axis_fifo)和帶地址的axis_bram_sdram(下文簡稱axis_bram)接口。兩種接口均采用axis_stream的時序。axis_bram接口為一個地址對應一幀數據,可重復讀取數據。與axis_fifo的區別在于axis_bram寫指定存儲空間,當用戶需要讀寫數據時,需要同時給出讀寫地址總線地址數據。
axis_fifo和bram接口的讀寫數據共同點在于,當ready與valid兩根信號線同時有效(高電平)時,數據總線上的數據才有效。此外,axis_bram中,當用戶寫完一幀數據后,等待監測m_axis_tlast3信號線拉高,可以開始寫第二幀數據,具體時序見圖 1。讀用戶監測到m_axis_tlast3信號拉高時,說明底層sdram已經存儲好寫用戶的一幀數據,此時讀用戶將讀地址使能信號拉高一段時間,同時給出讀地址總線數據,后讀地址使能信號拉低,至此,用戶監測到讀數據側的axis_last拉高,完成一幀數據讀寫。
2? sdram接口
此sdram存儲空間為256Mb,數據位寬為32位,速率等級有-5、-6、-7三個等級,最高時鐘頻率為200MHz。Bank數量為4,行地址位寬為12bit,列地址復用行地址的低位9bit。控制邏輯采樣狀態機的形式,首先狀態機設置為初始化狀態,初始化主要是芯片上電后首先執行的操作。首先執行空操作,再延時100us,進行預充電操作,緊接著兩次自刷新操作,進入模式寄存器配置,初始化完成。模式寄存器配置過程中,首先cmd給模式寄存器配置指令,通過給12bit地址總線信號設置操作模式、突發模式、潛伏期、突發傳輸方式以及全頁突發設置。
初始化完成后,狀態機進入刷新、預充電狀態,給寫指令進入寫數據狀態機,給讀指令進入讀數據狀態機。
3? axis與sdram底層接口
將sdram四個bank分成兩個存儲空間,bank0、bank1作為axis_fifo的存儲空間,bank2、bank3作為axis_bram的存儲空間。由于axis_fifo與axis_bram兩種接口訪問同一塊物理存儲芯片,所以邏輯設置優先級與新增標志信號控制時序。
此部分控制邏輯采用狀態機循環監測標志信號狀態以判斷對底層sdram的操作。狀態機流程見圖2,首先,狀態機檢測axis_fifo緩沖器里面是否有數據,如果有數據,狀態機檢測sdram存儲是否寫滿,如果沒有,狀態機將狀態設置為axis_fifo向sdram寫數據狀態。如果axis_fifo里面沒有數據或者sdram的剩余存儲空間不足以寫一幀數據,那么狀態機將進入中斷axis_fifo寫狀態,進入等待狀態,底層sdram會進入中斷等待定時刷新狀態。
當狀態機檢測到axis_fifo緩沖器數據last信號后,識別為一幀數據傳輸結束,狀態機也將跳到中斷等待狀態,狀態機會依次監測axis_fifo寫使能、axis_fifo讀使能,axis_bram寫使能、axis_bram讀使能。檢測到其中一個使能信號將進入對應狀態機操作,執行對sdram進一步控制。
此部分涉及到last信號傳遞、讀寫數據sdram地址數據的記憶以及時序邏輯采樣延時導致信號時序不同步的問題。sdram地址記憶采用fifo ip和單口bram ip存儲寫數據時最后一幀數據last信號的地址,地址采用bank+row+column的形式。當讀取sdram的數據時,檢測到讀數據的地址與fifo ip或者bram ip數據總線上的數據一致時,則判斷為一幀數據的結束,底層sdram接口產生讀數據端的last信號。由于axis的使能信號采用時序邏輯采樣傳遞到底層sdram接口,會有兩個時鐘周期的延遲,因此,axis接口的數據采用D觸發器延遲兩拍傳遞到sdram,為更快的更新信號狀態,ready信號采用組合邏輯。
4? 接口測試
測試方法分別向兩種接口下發測試數據,再讀取數據進行效驗(見圖3、圖4)。測試數據通過編寫測試邏輯產生。向axis_fifo_sdram接口下發1、2、3…10000,10000個寄存器數據,數據拆分為9幀數據,后通過axis_fifo接口讀回來效驗。向axis_bram接口固定地址寫一幀數據,讀回來效驗。效驗方法為,定義一個出錯數據寄存器(cnt_erro_fifo、cnt_erro_bram),如果數據出錯,cnt_erro_fifo或者cnt_erro_bram會進行累加。
測試結果:錯誤數據計數器為0,last信號正確傳遞。
5? 結語
隨著科技的發展,知識體系越來越龐大。在FPGA應用設計中,利用IP CORE可以大大節約FPGA工程師開發的周期。對于沒有IP CORE資源的,用戶進行自定義IP設計是必要的。本文主要進行了一種物理存儲芯片SDRAM的二次封裝,以更簡潔更實用的方式建立用戶接口,以便用戶快速訪問外部SDRAM存儲器。
參考文獻
[1] 齊佳碩,王洪巖.基于FPGA的SDRAM接口設計及實現[J].電子測量技術,2018(19):141-144.