最近需要用到AXI接口的模塊,xilinx的IP核很多都用到了AXI總線進行數(shù)據(jù)和指令傳輸。如果有多個設(shè)備需要使用AXI協(xié)議對AXI接口的BRAM進行讀寫,總線之間該如何進行仲裁,通信?
這里我們注意到,Vivado有一個叫做AXI Interconnect (RTL)的IP核,這個IP核可以實現(xiàn)上述功能。
本文將簡單講解AXI Interconnect IP核的使用方法,設(shè)計到Vivado的Block Design,仿真等知識運用。
為了簡化整體例子的復(fù)雜度,整個測試工程項目采用了兩個措施:
最終整體的Block Design結(jié)構(gòu)如下圖:
圖1
簡單介紹一下圖1中的模塊功能
clk_wiz_0
: MMCM,模式時鐘管理器,這里作用主要是產(chǎn)生100MHz的clk_out1和200MHz的clk_out2,類似鎖相環(huán);proc_sys_reset_x
: 系統(tǒng)復(fù)位模塊,根據(jù)輸入時鐘和輸入的信號產(chǎn)生對應(yīng)的高復(fù)位有效信號和低復(fù)位有效信號;axi_interconnect_0
: AXI Interconnect,這里管理著2個Slave接口和1個Master接口;對總線傳輸進行仲裁,通信,時序轉(zhuǎn)換等操作。axi_bram_ctrl_0
: Bram Controller,AXI接口的Bram控制器;blk_mem_gen_0
: Block Ram
簡單介紹下Block Design的AXI Interconnect IP核使用(因為Block Design可以實現(xiàn)自動連線,自動設(shè)置位寬等信息,所以設(shè)置內(nèi)容沒有AXI Interconnect RTL多,后者專用于Verilog代碼中使用)
圖2
這個界面設(shè)置Slave Interface的數(shù)量,與Master 模塊的數(shù)量對應(yīng);Master Interface數(shù)量,與 Slave模塊的數(shù)量對應(yīng),如果想不明白可以看圖6。
圖3
圖4
這里使能S/M_AXI端口的Register Slice和Data FIFO功能,Slice對時序收斂有一定作用,但是數(shù)據(jù)輸出會延遲一個周期;Data FIFO,顧名思義,可以實現(xiàn)數(shù)據(jù)緩存和packet mode。
圖5
勾選圖2的Advanced Options后,可以進入圖5界面,這里可以設(shè)置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核的異步低有效復(fù)位信號。
Sxx_ACLK是對應(yīng)總線的總線時鐘,Sxx_ARESETN是對應(yīng)總線的異步低有效復(fù)位信號。同理,Mxx_ACLK是對應(yīng)總線的總線時鐘,Mxx_ACLK_ARESETN是對應(yīng)總線的異步低有效復(fù)位信號。
圖中出現(xiàn)了4個時鐘端口,這4個時鐘端口的頻率可以各不相同。曾經(jīng)我很疑惑ACLK的時鐘頻率到底應(yīng)該如何設(shè)置,找到了一個在Xilinx論壇的帖子,上面的建議是連接到任一Sxx_ACLK或者Mxx_ACLK,雖然ACLK可以隨意連接到一個時鐘頻率信號。
圖1的輸入端口有S00_AXI,S01_AXI的接口,clk_100MHz的時鐘輸入信號,reset_rtl_0的高有效復(fù)位信號;輸出有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時鐘域下,我們單獨對它進行寫操作。
在設(shè)計過程中,我還發(fā)現(xiàn)了一個奇怪的現(xiàn)象,原本的設(shè)計中,握手信號想等著s00_axil_awready信號拉高之后,這邊的s00_axil_awvalid再拉高。結(jié)果發(fā)現(xiàn)awready遲遲沒有拉高,在看完參考資料1后,才知道需要Master這側(cè)的valid先拉高,否則slave的ready信號不一定會拉高;所以s00_axil_awvalid, s01_axil_arvalid設(shè)置為1 。
100MHz頻率下,s00_axil_awaddr 在寫入數(shù)據(jù)完成(s00_axil_wready & s00_axil_wvalid)后,地址會加4;地址寫到1024后會重新歸零。
可以看到,等到s00_axil_wready拉高,Master會把s00_axil_wvalid拉高,并生成一個隨機數(shù)寫入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在讀取數(shù)據(jù)完成后(s01_axil_rvalid & s01_axil_rready),會加4;同樣,地址寫到1024后會重新歸零。
可以看到,等到s01_axil_rvalid拉高,s01_axil_rready會拉高,讀取出對應(yīng)數(shù)據(jù),然后拉低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
當然,為什么兩個不同的總線能夠?qū)σ粋€BRAM進行操作,這里涉及到地址分配的問題;
圖7
兩個總線可以訪問到同一個地址,所以自然可以對同一個BRAM進行操作;那有人可能問,假如我操作s00訪問的地址超過了分配的地址范圍呢,那么s00_axil_bresp會等于2'd3,告知地址錯誤的問題。
圖8
由于設(shè)計問題,讀取的地址相比寫入數(shù)據(jù)落后幾個時鐘周期,這樣可以將剛寫入的數(shù)據(jù)讀出來。
這個實驗表明AXI Interconnect不僅是總線仲裁器,還幫助時鐘域不同的AXI總線完成了時序轉(zhuǎn)換。除此之外,AXI Interconnect還可以實現(xiàn)數(shù)據(jù)位寬轉(zhuǎn)換,AXI協(xié)議轉(zhuǎn)換,例如AXI4/3轉(zhuǎn)AXI4-Lite,AXI4轉(zhuǎn)AXI3等;增加Register Slice改善時序,增加數(shù)據(jù)fifo緩存數(shù)據(jù);
AXI Interconnect最多支持16 MI與16 SI組合。不過,當配置只有一個SI接口時,MI接口最多可以設(shè)置到64位。
其中的仲裁采用的輪詢調(diào)度算法,當然,IP核可以設(shè)置每個SI的優(yōu)先級,值越高,優(yōu)先級越高;
當然,這篇文章只是為了簡單介紹AXI Interconnect的作用,更復(fù)雜更多的功能還有待發(fā)掘。當然,功能強大意味著復(fù)雜,比如根據(jù)參考資料2,AXI4協(xié)議中的ID信號,如果在AXI Interconnect中使用不當,可能造成仲裁器死鎖。
圖9
看上圖,在我的示例中,ACLK與S01_ACLK同源同頻,所以示意圖中,s01_couples從S_AXI直通到M_AXI;而s00_couples則添加了一個AXI Clock Converter做時序轉(zhuǎn)換;在m00_couples中,又使用了AXI Clock Converter將ACLK轉(zhuǎn)換到M00_ACLK;
至此,簡單總結(jié)下在AXI通信中使用AXI Interconnect的好處:
- 真正實現(xiàn)了總線通信,N Master模塊與M Slave模塊的通信,減少了相互間通信的復(fù)雜度
- 內(nèi)部實現(xiàn)時鐘域轉(zhuǎn)換,不需要外部的過度干預(yù)
- 內(nèi)部可實現(xiàn)FIFO等,免去了很多場景下需要FIFO,Register,位寬轉(zhuǎn)換,協(xié)議轉(zhuǎn)換的需求
-
控制器
+關(guān)注
關(guān)注
112文章
16447瀏覽量
179460 -
RTL
+關(guān)注
關(guān)注
1文章
385瀏覽量
59951 -
VCS
+關(guān)注
關(guān)注
0文章
80瀏覽量
9647 -
AXI總線
+關(guān)注
關(guān)注
0文章
66瀏覽量
14315 -
BRAM
+關(guān)注
關(guān)注
0文章
41瀏覽量
11016
發(fā)布評論請先 登錄
相關(guān)推薦
評論