最近需要用到AXI接口的模塊,xilinx的IP核很多都用到了AXI總線進行數據和指令傳輸。如果有多個設備需要使用AXI協(xié)議對AXI接口的BRAM進行讀寫,總線之間該如何進行仲裁,通信?
這里我們注意到,Vivado有一個叫做AXI Interconnect (RTL)的IP核,這個IP核可以實現上述功能。
本文將簡單講解AXI Interconnect IP核的使用方法,設計到Vivado的Block Design,仿真等知識運用。
為了簡化整體例子的復雜度,整個測試工程項目采用了兩個措施:
最終整體的Block Design結構如下圖:

圖1
簡單介紹一下圖1中的模塊功能
clk_wiz_0: MMCM,模式時鐘管理器,這里作用主要是產生100MHz的clk_out1和200MHz的clk_out2,類似鎖相環(huán);proc_sys_reset_x: 系統(tǒng)復位模塊,根據輸入時鐘和輸入的信號產生對應的高復位有效信號和低復位有效信號;axi_interconnect_0: AXI Interconnect,這里管理著2個Slave接口和1個Master接口;對總線傳輸進行仲裁,通信,時序轉換等操作。axi_bram_ctrl_0: Bram Controller,AXI接口的Bram控制器;blk_mem_gen_0: Block Ram
簡單介紹下Block Design的AXI Interconnect IP核使用(因為Block Design可以實現自動連線,自動設置位寬等信息,所以設置內容沒有AXI Interconnect RTL多,后者專用于Verilog代碼中使用)

圖2
這個界面設置Slave Interface的數量,與Master 模塊的數量對應;Master Interface數量,與 Slave模塊的數量對應,如果想不明白可以看圖6。

圖3

圖4
這里使能S/M_AXI端口的Register Slice和Data FIFO功能,Slice對時序收斂有一定作用,但是數據輸出會延遲一個周期;Data FIFO,顧名思義,可以實現數據緩存和packet mode。

圖5
勾選圖2的Advanced Options后,可以進入圖5界面,這里可以設置S_AXI端口的優(yōu)先級,優(yōu)先級值越高,越優(yōu)先,平行優(yōu)先級的端口會使用輪詢的方式處理端口請求。

圖6
整個IP核的外部端口,Sxx_AXI連接Master模塊的M_AXI接口;Mxx_AXI連接Slave模塊的S_AXI接口;ACLK是IP核的運行時鐘,ARESETN是IP核的異步低有效復位信號。
Sxx_ACLK是對應總線的總線時鐘,Sxx_ARESETN是對應總線的異步低有效復位信號。同理,Mxx_ACLK是對應總線的總線時鐘,Mxx_ACLK_ARESETN是對應總線的異步低有效復位信號。
圖中出現了4個時鐘端口,這4個時鐘端口的頻率可以各不相同。曾經我很疑惑ACLK的時鐘頻率到底應該如何設置,找到了一個在Xilinx論壇的帖子,上面的建議是連接到任一Sxx_ACLK或者Mxx_ACLK,雖然ACLK可以隨意連接到一個時鐘頻率信號。
圖1的輸入端口有S00_AXI,S01_AXI的接口,clk_100MHz的時鐘輸入信號,reset_rtl_0的高有效復位信號;輸出有100MHz的clk_out1,200MHz的clk_out2;
然后將Block Design生成為verilog文件,供其他的verilog文件直接實例化。這里我們利用留出的clk_out1,clk_out2,s00_axi,s01_axi接口,對Bram進行簡單的地址讀寫操作,讀寫時鐘分別為200MHz/100MHz。
Testbench里面,除了必要的initial和時鐘賦值外,主要的還是對s00_axi,s01_axi的控制。
s00_axi在100MHz時鐘域下,我們單獨對它進行寫操作。
在設計過程中,我還發(fā)現了一個奇怪的現象,原本的設計中,握手信號想等著s00_axil_awready信號拉高之后,這邊的s00_axil_awvalid再拉高。結果發(fā)現awready遲遲沒有拉高,在看完參考資料1后,才知道需要Master這側的valid先拉高,否則slave的ready信號不一定會拉高;所以s00_axil_awvalid, s01_axil_arvalid設置為1 。
100MHz頻率下,s00_axil_awaddr 在寫入數據完成(s00_axil_wready & s00_axil_wvalid)后,地址會加4;地址寫到1024后會重新歸零。
可以看到,等到s00_axil_wready拉高,Master會把s00_axil_wvalid拉高,并生成一個隨機數寫入BRAM;然后s00_axil_wvalid拉低。
always @ (posedge clk_out1) begin
if (s00_axil_wready & s00_axil_wvalid)
s00_axil_awaddr <= (s00_axil_awaddr < 32'd1023) ? s00_axil_awaddr + 32'd4 : 0;
if (s00_axil_wready & ~s00_axil_wvalid) begin
s00_axil_wvalid <= 1'b1;
s00_axil_wdata <= $random;
end
else
s00_axil_wvalid <= 1'b0;
end
200MHz頻率下,s01_axil_araddr在讀取數據完成后(s01_axil_rvalid & s01_axil_rready),會加4;同樣,地址寫到1024后會重新歸零。
可以看到,等到s01_axil_rvalid拉高,s01_axil_rready會拉高,讀取出對應數據,然后拉低s01_axil_rready;
always @ (posedge clk_out2) begin
s01_axil_arvalid <= 1'b1;
if (s01_axil_rvalid & s01_axil_rready)
s01_axil_araddr <= (s01_axil_araddr < 32'd1023) ? s01_axil_araddr + 32'd4 : 0;
if (s01_axil_rvalid & ~s01_axil_rready) begin
s01_axil_rready <= 1'b1;
end
else
s01_axil_rready <= 1'b0;
end
當然,為什么兩個不同的總線能夠對一個BRAM進行操作,這里涉及到地址分配的問題;

圖7
兩個總線可以訪問到同一個地址,所以自然可以對同一個BRAM進行操作;那有人可能問,假如我操作s00訪問的地址超過了分配的地址范圍呢,那么s00_axil_bresp會等于2'd3,告知地址錯誤的問題。

圖8
由于設計問題,讀取的地址相比寫入數據落后幾個時鐘周期,這樣可以將剛寫入的數據讀出來。
這個實驗表明AXI Interconnect不僅是總線仲裁器,還幫助時鐘域不同的AXI總線完成了時序轉換。除此之外,AXI Interconnect還可以實現數據位寬轉換,AXI協(xié)議轉換,例如AXI4/3轉AXI4-Lite,AXI4轉AXI3等;增加Register Slice改善時序,增加數據fifo緩存數據;
AXI Interconnect最多支持16 MI與16 SI組合。不過,當配置只有一個SI接口時,MI接口最多可以設置到64位。
其中的仲裁采用的輪詢調度算法,當然,IP核可以設置每個SI的優(yōu)先級,值越高,優(yōu)先級越高;
當然,這篇文章只是為了簡單介紹AXI Interconnect的作用,更復雜更多的功能還有待發(fā)掘。當然,功能強大意味著復雜,比如根據參考資料2,AXI4協(xié)議中的ID信號,如果在AXI Interconnect中使用不當,可能造成仲裁器死鎖。

圖9
看上圖,在我的示例中,ACLK與S01_ACLK同源同頻,所以示意圖中,s01_couples從S_AXI直通到M_AXI;而s00_couples則添加了一個AXI Clock Converter做時序轉換;在m00_couples中,又使用了AXI Clock Converter將ACLK轉換到M00_ACLK;
至此,簡單總結下在AXI通信中使用AXI Interconnect的好處:
- 真正實現了總線通信,N Master模塊與M Slave模塊的通信,減少了相互間通信的復雜度
- 內部實現時鐘域轉換,不需要外部的過度干預
- 內部可實現FIFO等,免去了很多場景下需要FIFO,Register,位寬轉換,協(xié)議轉換的需求
-
控制器
+關注
關注
114文章
17715瀏覽量
191358 -
RTL
+關注
關注
1文章
393瀏覽量
62510 -
VCS
+關注
關注
0文章
80瀏覽量
10272 -
AXI總線
+關注
關注
0文章
68瀏覽量
14730 -
BRAM
+關注
關注
0文章
41瀏覽量
11599
發(fā)布評論請先 登錄
使用AXI4接口IP核進行DDR讀寫測試
一文詳解Video In to AXI4-Stream IP核
Designing High-Performance Video Systems with the AXI Interconnect
有人知道為什么MIG IP核中的AXI協(xié)議。為什么沒有AXI_WID這個信號呢?
如何在IP_catalog中創(chuàng)建可見的axi_interconnect_v2.1?
PCIE項目中AXI4 IP核例化詳解
AXI FIFO和AXI virtual FIFO這兩個IP的使用方法
三個不同AXI IP核的實現的方法_性能的對比及差異的分析
基于MicroBlaze的AXI總線實時時鐘IP核設計
AXI接口簡介_AXI IP核的創(chuàng)建流程及讀寫邏輯分析
自定義sobel濾波IP核,IP接口遵守AXI Stream協(xié)議
如何使用MicroBlaze調用AXI IP核詳細解析
AXI4-Stream Video 協(xié)議和AXI_VDMA的IP核介紹
自定義AXI-Lite接口的IP及源碼分析
簡單講解AXI Interconnect IP核的使用方法
評論