之前的項目和培訓中,都只用到了AXI-Lite或者AXI-Stream,對於AXI-FULL知之甚少,主要是每次一看到那么多接口信號就望而卻步了。
現在為了調試DDR,痛下決心要把AXI-FULL弄懂。
前面已經介紹了基本的接口信號,本文主要是總結一下使用AXI-FULL調試的過程。
首先想到的是用RAM IP核來測試,方法是通過AXI接口向RAM寫入一組數據並讀出,看起來很簡單,然而試了好久都沒能出結果。如下圖所示,其實AXI RAM就是在本地RAM接口的基礎上套了一個AXI的殼
在使用modelsim仿真的時候總是會拋出一個警告,具體的警告類型忘了,下次有機會再嘗試。試了好多次都這樣,無解
於是轉用FIFO來測試,結果一下子就跑通了。
FIFO的自定義如下圖:
一直沒搞懂這個ID是用來干嘛的,按理說應該是當系統中存在多個master或者slave的時候,用來標識不同的設備號的,但是也沒找到在哪里可以配置這個ID號啊,求解。
然后就是寫狀態機了,最初打算是用三段式狀態機來實現下圖的時序,結果發現三段式好像不太適合這種太緊湊的時序
具體的表現如圖中箭頭所示,當寫時序從AW(寫地址通道)切換到W(寫數據通道)的時候,我是通過判斷valid和ready同時拉高(1)則進入下一個狀態即W狀態(2)的,但是從(1)到(2)的跳變必須經歷一個時鍾,緊接着在第三段狀態機中檢測到(2)並且產生實際的輸出(3)這個過程中,又會經歷一個時鍾,這就會導致圖中的T1和T2之間多出來了一個周期,時序不滿足了。無奈,又換成一段式狀態機繼續。
由於是對FIFO進行操作,burst類型自然選擇是固定長度突發,寫地址直接給0不變。這里說一下個人對wstrb的理解,前面也說了,這個信號是表示寫閥門,也就是規定WDATA的哪些字節有效。實際上無論把wstrb寫成全0還是全1,讀出來的數據都是一樣的,那么FIFO內部自然沒有判斷某些字節有效的邏輯,所以在后續讀出的時候,需要由我們自行掩碼。
除此之外,個人感覺看着這一大堆的接口,首先不要怕,把所有的接口信號按不同的通道分成5組,一次只操作其中的一組,慢慢的就能完成整個時序的編寫了。
最后附上讀寫的仿真結果:
數據用$random產生,再加上狀態機,整個時序如行雲流水般的運作起來了,想想還有點小興奮呢
既然已經看了RAM的xilinx文檔,那么FIFO的也得看,這樣才能顯得雨露均沾。
先來一張正常本地端口FIFO結構圖
所有的信號都還蠻熟悉,結構也還算了解,無非就是同一個FIFO的兩個時鍾域。
接着再看AXI接口的FIFO:
這都什么鬼啊,紅線藍線,那么多獨立的模塊,這是要干嘛?
自習閱讀官方文檔,有這么一段話:
For AXI memory mapped interfaces, AXI specifies Write Channels and Read Channels. Write Channels include a Write Address Channel, Write Data Channel and Write Response Channel. Read Channels include a Read Address Channel and Read Data Channel. The FIFO Generator core provides the ability to generate either Write Channels or Read Channels, or both Write Channels and Read Channels for AXI memory mapped. Three FIFOs are integrated for Write Channels and two FIFOs are integrated for Read Channels. When both Write and Read Channels are selected, the FIFO Generator core integrates five independent FIFOs.
For AXI memory mapped interfaces, the FIFO Generator core provides the ability to implement independent FIFOs for each channel, as shown in Figure 1-6. For each channel, the core can be independently configured to generate a block RAM or distributed memory or built-in based FIFO. The depth of each FIFO can also be independently configured.
也就是說,每一個AXI通道最后都會生成成一個獨立的跨時鍾域FIFO,我們一開始將FIFO的類型配置成了讀寫,也就是五個通道全開,那么自然就是五個獨立的FIFO了。
這得占用多少資源啊,還好只是測試,不用考慮那么多。