一.什么是AXI通信協(xié)議
AXI是ARM 1996年提出的微控制器總線家族AMBA中的一部分。AXI的第一個(gè)版本出現(xiàn)在AMBA3.0,發(fā)布于2003年。當(dāng)前的最新的版本發(fā)布于2010年。AXI 4總線和別的總線一樣,都用來(lái)傳輸bits信息 (包含了數(shù)據(jù)或者地址) 。AXI4總線有三種類型,分別是AXI4、AXI4-Lite、AXI4-Stream
AXI4:主要面向高性能地址映射通信的需求,支持突發(fā)傳輸;
AXI4-Lite:是一個(gè)簡(jiǎn)單地吞吐量地址映射性通信總線,不支持突發(fā)傳輸;
AXI4-Stream:不包含地址,面向高速流數(shù)據(jù)傳輸;
AXI4 是一種高性能memory-mapped總線,分為主、從兩端,兩者間可以連續(xù)的進(jìn)行通信。AXI4及AXI4Lite有地址,AX14能夠?qū)崿F(xiàn)burst傳輸,可以在一個(gè)地址后傳輸多個(gè)數(shù)據(jù),最多可以達(dá)256 字節(jié)。AXI4-Lite不支持burst傳輸。AXI4-Stream 只有一個(gè)通道,不需要地址,可以burst 傳輸無(wú)限的數(shù)據(jù)。假設(shè)有master A,和 slave B,A與B通過(guò)AXI4或者AXI4Lite連接通訊,A可以把B這個(gè)外設(shè)看作A上的某個(gè)地址。當(dāng)A向B傳輸數(shù)據(jù)時(shí),就等同于A向這個(gè)地址傳數(shù)。
AXI4 和 AXI4-Lite接口包含5個(gè)不同的通道:兩個(gè)讀通道和三個(gè)寫通道。
兩個(gè)讀通道:讀地址通道(read addresschannel)、讀數(shù)據(jù)通道(read data channel):
三個(gè)寫通道: 寫地址通道(write addresschannel)、寫數(shù)據(jù)通道(write data channel)、寫響應(yīng)通道(write response channel);
相比于 AXI4,AXI4-Stream 不涉及地址。AXI4-Stream傳輸?shù)臄?shù)據(jù)流包含三種類型: data type、position type、 null type 。data type是最有意義的數(shù)據(jù); position type作為占位符使用,可以用來(lái)表征date type 的相對(duì)位置,null type不包含任何有用的信息。
數(shù)據(jù)流的結(jié)構(gòu)可以有很多種,例如: 可以只傳數(shù)據(jù),也即都是data type,不包含position type和null type; 也可以將data type 和 null type 混著傳輸;還可以將position type 和 data type混著傳輸。當(dāng)然,三者混著傳輸也沒(méi)有問(wèn)題。
二.信號(hào)描述
AXI與AXI-lite信號(hào)描述如下所示,由于AXI-lite不支持突發(fā),所以與突發(fā)相關(guān)的管教都不具備。
//全局信號(hào)
.M_AXI_ACLK(m00_axi_aclk),//時(shí)鐘
.M_AXI_ARESETN(m00_axi_aresetn),//全局復(fù)位
//寫地址通道信號(hào)
.M_AXI_AWID(m00_axi_awid),//AXI4-LITE不支持 寫地址ID。這個(gè)信號(hào)用于寫地址信號(hào)組的標(biāo)記,用來(lái)標(biāo)識(shí)數(shù)據(jù)傳輸順序。詳見(jiàn)協(xié)議定義。
.M_AXI_AWADDR(m00_axi_awaddr),//寫地址。寫地址給出突發(fā)數(shù)據(jù)傳輸?shù)牡谝粋€(gè)傳輸?shù)刂贰?/span>
.M_AXI_AWLEN(m00_axi_awlen),//AXI4-LITE不支持 突發(fā)長(zhǎng)度。給出突發(fā)傳輸中準(zhǔn)確的傳輸個(gè)數(shù)。支持INCR和WRAP傳輸模式。(長(zhǎng)度)突發(fā)長(zhǎng)度=awlen+1
.M_AXI_AWSIZE(m00_axi_awsize),//AXI4-LITE不支持 突發(fā)大小。這個(gè)信號(hào)用于確定突發(fā)傳輸中每個(gè)傳輸?shù)拇笮?。(寬度)總線位寬=2^size Betyes
.M_AXI_AWBURST(m00_axi_awburst),//AXI4-LITE不支持 突發(fā)類型。該信息與突發(fā)大小信息一起,表示在突發(fā)過(guò)程中,地址如何應(yīng)用于每個(gè)傳輸。支持INCR和WRAP傳輸模式。
.M_AXI_AWLOCK(m00_axi_awlock),//AXI4-LITE不支持 鎖類型。該信號(hào)提供了關(guān)于傳輸原子特性的額外信息(普通或互斥訪問(wèn))。AXI3支持,AXI4不支持
.M_AXI_AWCACHE(m00_axi_awcache),//緩存類型,建議值為0011。
.M_AXI_AWPROT(m00_axi_awprot),//保護(hù)類型,訪問(wèn)權(quán)限,建議值為000。
.M_AXI_AWQOS(m00_axi_awqos),//QoS標(biāo)識(shí)符,xilinx AXI4不支持
.M_AXI_AWUSER(m00_axi_awuser),//xilinx AXI4不支持
.M_AXI_AWVALID(m00_axi_awvalid),//寫地址有效信號(hào)。為高指示地址有效。
.M_AXI_AWREADY(m00_axi_awready),//寫地址準(zhǔn)備信號(hào)。為高表示從設(shè)備空閑,準(zhǔn)備接收地址;為低表示從設(shè)備忙。
//寫數(shù)據(jù)通道信號(hào)
.M_AXI_WDATA(m00_axi_wdata),//寫數(shù)據(jù),AXI-LITE僅支持32bit,AXI支持32bit-1024bit
.M_AXI_WSTRB(m00_axi_wstrb),//寫字節(jié)選通,用于表示更新存儲(chǔ)器的字節(jié)通道,對(duì)于數(shù)據(jù)總線的每8位數(shù)據(jù)有一位寫選通信號(hào)
.M_AXI_WLAST(m00_axi_wlast),//AXI-LITE不支持 寫最后一個(gè)數(shù)據(jù)指示信號(hào)。表示突發(fā)傳輸中的最后一個(gè)數(shù)據(jù)。
.M_AXI_WUSER(m00_axi_wuser),//xilinx AXI4不支持。
.M_AXI_WVALID(m00_axi_wvalid),//寫有效。為高指示數(shù)據(jù)有效。
.M_AXI_WREADY(m00_axi_wready),//寫準(zhǔn)備。為高表示從設(shè)備空閑,準(zhǔn)備接收數(shù)據(jù);為低表示從設(shè)備忙。
//寫響應(yīng)通道
.M_AXI_BID(m00_axi_bid),//AXI-LITE不支持 響應(yīng)ID。寫響應(yīng)識(shí)別標(biāo)記,BID值必須匹配AWID值。
.M_AXI_BRESP(m00_axi_bresp),//寫響應(yīng)。該信號(hào)表示寫狀態(tài),0時(shí)候表示沒(méi)有錯(cuò)誤,
.M_AXI_BUSER(m00_axi_buser),//xilinx AXI4不支持。
.M_AXI_BVALID(m00_axi_bvalid),//寫響應(yīng)有效。為高指示響應(yīng)數(shù)據(jù)有效
.M_AXI_BREADY(m00_axi_bready),//寫響應(yīng)準(zhǔn)備。為高表示主設(shè)備空閑,準(zhǔn)備接收寫響應(yīng);為低表示主設(shè)備忙。
//讀地址通道
.M_AXI_ARID(m00_axi_arid),//AXI-LITE不支持 讀地址ID。這個(gè)信號(hào)用于讀地址信號(hào)組的標(biāo)記。
.M_AXI_ARADDR(m00_axi_araddr),//讀地址。讀地址給出突發(fā)數(shù)據(jù)傳輸?shù)牡谝粋€(gè)傳輸?shù)刂贰?/span>
.M_AXI_ARLEN(m00_axi_arlen),//AXI-LITE不支持 突發(fā)長(zhǎng)度。給出突發(fā)傳輸中準(zhǔn)確的傳輸個(gè)數(shù)。支持INCR和WRAP傳輸模式。
.M_AXI_ARSIZE(m00_axi_arsize),//AXI-LITE不支持 突發(fā)大小。這個(gè)信號(hào)用于確定突發(fā)傳輸中每個(gè)傳輸?shù)拇笮 ?/span>
.M_AXI_ARBURST(m00_axi_arburst),//AXI-LITE不支持 突發(fā)類型。該信息與突發(fā)大小信息一起,表示在突發(fā)過(guò)程中,地址如何應(yīng)用于每個(gè)傳輸。支持INCR和WRAP傳輸模式
.M_AXI_ARLOCK(m00_axi_arlock),//鎖類型。該信號(hào)提供了關(guān)于傳輸原子特性的額外信息(普通或互斥訪問(wèn))
.M_AXI_ARCACHE(m00_axi_arcache),//緩存類型,建議值為0011。
.M_AXI_ARPROT(m00_axi_arprot),//保護(hù)類型,建議值為000。
.M_AXI_ARQOS(m00_axi_arqos),//QoS標(biāo)識(shí)符,xilinx AXI4不支持。
.M_AXI_ARUSER(m00_axi_aruser),//xilinx AXI4不支持
.M_AXI_ARVALID(m00_axi_arvalid),// 讀地址有效信號(hào)。為高指示地址有效
.M_AXI_ARREADY(m00_axi_arready),//讀地址準(zhǔn)備信號(hào)。為高表示從設(shè)備空閑,準(zhǔn)備接收地址;為低表示從設(shè)備忙
//讀數(shù)據(jù)通道
.M_AXI_RID(m00_axi_rid),//AXI-LITE不支持 讀ID標(biāo)記,該信號(hào)是讀數(shù)據(jù)信號(hào)組標(biāo)記,由從設(shè)備產(chǎn)生RID,RID必須和讀交易中的ARID匹配
.M_AXI_RDATA(m00_axi_rdata),//讀數(shù)據(jù)。32位到1024位寬 AXI-LITE只支持32位寬
.M_AXI_RRESP(m00_axi_rresp),//讀響應(yīng)。該信號(hào)表示讀狀態(tài),可允許相應(yīng)的表示為
.M_AXI_RLAST(m00_axi_rlast),//AXI-LITE不支持 讀最后一個(gè)數(shù)據(jù)指示信號(hào)。表示突發(fā)傳輸中的最后一個(gè)數(shù)據(jù)
.M_AXI_RUSER(m00_axi_ruser),//xilinx AXI4不支持。
.M_AXI_RVALID(m00_axi_rvalid),//讀有效。為高指示數(shù)據(jù)有效
.M_AXI_RREADY(m00_axi_rready)//讀準(zhǔn)備。為高表示主設(shè)備空閑,準(zhǔn)備接收數(shù)據(jù);為低表示主設(shè)備忙。
AXI-stream信號(hào)描述如下所示,
.M_AXIS_ACLK(m00_axis_aclk),//時(shí)鐘
.M_AXIS_ARESETN(m00_axis_aresetn),//復(fù)位
.M_AXIS_TVALID(m00_axis_tvalid),//Stream讀寫數(shù)據(jù)有效。為高指示數(shù)據(jù)有效。
.M_AXIS_TDATA(m00_axis_tdata),//Stream讀寫數(shù)據(jù),8到4096位寬。
.M_AXIS_TSTRB(m00_axis_tstrb),//字節(jié)選通信號(hào)。用于表示更新存儲(chǔ)器的字節(jié)通道,對(duì)于數(shù)據(jù)總線的每8位數(shù)據(jù)有一位選通信號(hào)。
.M_AXIS_TLAST(m00_axis_tlast),//表明包的邊界,1代表最后數(shù)據(jù)
.M_AXIS_TREADY(m00_axis_tready)//Stream讀寫讀準(zhǔn)備。為高表示對(duì)端設(shè)備空閑,準(zhǔn)備接收數(shù)據(jù);為低表示對(duì)端設(shè)備忙。
三.工作時(shí)序圖
AXI4協(xié)議主從設(shè)備間的讀操作使用獨(dú)立的讀地址和讀數(shù)據(jù)通道,只需要一個(gè)地址就可以執(zhí)行最大為256的突發(fā)長(zhǎng)度的讀操作。
讀時(shí)序如下所示。
(1)首先Master判斷arready的信號(hào)是否為高電平,若該信號(hào)為高電平時(shí),代表slave已經(jīng)準(zhǔn)備好接收新的地址信息,否則Master不能給Slave發(fā)送地址信息。
(2)當(dāng)判斷完成后,Master給Slave發(fā)送地址信息,即發(fā)送araddr;在進(jìn)行地址發(fā)送時(shí),arvalid為高電平,arvalid為高電平,發(fā)送araddr。
(3)當(dāng)?shù)刂钒l(fā)送結(jié)束之后,slave就會(huì)通過(guò)read_data通道返回?cái)?shù)據(jù),master必須在rready和rvalid信號(hào)同時(shí)為高時(shí),將數(shù)據(jù)讀取,否則不能讀取數(shù)據(jù);當(dāng)最后一個(gè)數(shù)據(jù)發(fā)送時(shí),slave會(huì)將rlast信號(hào)同時(shí)拉高,代表最后一個(gè)數(shù)據(jù)發(fā)送完成。
寫時(shí)序如下所示。
AXI寫事務(wù)是在3個(gè)寫通道上完成多次數(shù)據(jù)傳輸(transfers)
(1)MASTER將寫地址及相應(yīng)的控制信息通過(guò)寫地址通道發(fā)送給SLAVE
(2)MASTER將需要寫入該地址的數(shù)據(jù)通過(guò)寫輸入通道發(fā)送給SLAVE
(3)SLAVE將寫結(jié)果通過(guò)寫反饋通道發(fā)送給MASTER,表明寫入是否成功
四.時(shí)序代碼實(shí)現(xiàn)
讀事務(wù)握手信號(hào)的關(guān)系:
?單箭頭指向 可以在前一個(gè)信號(hào)(本信號(hào))斷言之前或之后斷言的信號(hào)(指向的信號(hào))。
?雙箭頭指向 只有在前一個(gè)信號(hào)(本信號(hào))斷言之后才可以斷言的信號(hào)(指向的信號(hào))。
所以slave 在斷言讀取的數(shù)據(jù)有效信號(hào)RVALID之前,必須等到ARVALID與ARREADY斷言后。
//----------------------------
//Read Address Channel
//----------------------------
always @(posedge M_AXI_ACLK)
begin
if (M_AXI_ARESETN == 0 || init_txn_pulse == 1'b1 )
begin
axi_arvalid <= 1'b0;
end
// If previously not valid , start next transaction
else if (~axi_arvalid && start_single_burst_read)
begin
axi_arvalid <= 1'b1;
end
else if (M_AXI_ARREADY && axi_arvalid)
begin
axi_arvalid <= 1'b0;
end
else
axi_arvalid <= axi_arvalid;
end
// Next address after ARREADY indicates previous address acceptance
always @(posedge M_AXI_ACLK)
begin
if (M_AXI_ARESETN == 0 || init_txn_pulse == 1'b1)
begin
axi_araddr <= 'b0;
end
else if (M_AXI_ARREADY && axi_arvalid)
begin
axi_araddr <= axi_araddr + burst_size_bytes;
end
else
axi_araddr <= axi_araddr;
end
//--------------------------------
//Read Data (and Response) Channel
//--------------------------------
// Forward movement occurs when the channel is valid and ready
assign rnext = M_AXI_RVALID && axi_rready;
// Burst length counter. Uses extra counter register bit to indicate
// terminal count to reduce decode logic
always @(posedge M_AXI_ACLK)
begin
if (M_AXI_ARESETN == 0 || init_txn_pulse == 1'b1 || start_single_burst_read)
begin
read_index <= 0;
end
else if (rnext && (read_index != C_M_AXI_BURST_LEN-1))
begin
read_index <= read_index + 1;
end
else
read_index <= read_index;
end
always @(posedge M_AXI_ACLK)
begin
if (M_AXI_ARESETN == 0 || init_txn_pulse == 1'b1 )
begin
axi_rready <= 1'b0;
end
// accept/acknowledge rdata/rresp with axi_rready by the master
// when M_AXI_RVALID is asserted by slave
else if (M_AXI_RVALID)
begin
if (M_AXI_RLAST && axi_rready)
begin
axi_rready <= 1'b0;
end
else
begin
axi_rready <= 1'b1;
end
end
// retain the previous value
end
寫事務(wù)握手信號(hào)的關(guān)系:
?單箭頭指向 可以在前一個(gè)信號(hào)(本信號(hào))斷言之前或之后斷言的信號(hào)(指向的信號(hào))。
?雙箭頭指向 只有在前一個(gè)信號(hào)(本信號(hào))斷言之后才可以斷言的信號(hào)(指向的信號(hào))。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-861067.html
//--------------------
//Write Data Channel
//--------------------
assign wnext = M_AXI_WREADY & axi_wvalid;
// WVALID logic, similar to the axi_awvalid always block above
always @(posedge M_AXI_ACLK)
begin
if (M_AXI_ARESETN == 0 || init_txn_pulse == 1'b1 )
begin
axi_wvalid <= 1'b0;
end
// If previously not valid, start next transaction
else if (~axi_wvalid && start_single_burst_write)
begin
axi_wvalid <= 1'b1;
end
/* If WREADY and too many writes, throttle WVALID
Once asserted, VALIDs cannot be deasserted, so WVALID
must wait until burst is complete with WLAST */
else if (wnext && axi_wlast)
axi_wvalid <= 1'b0;
else
axi_wvalid <= axi_wvalid;
end
//WLAST generation on the MSB of a counter underflow
// WVALID logic, similar to the axi_awvalid always block above
always @(posedge M_AXI_ACLK)
begin
if (M_AXI_ARESETN == 0 || init_txn_pulse == 1'b1 )
begin
axi_wlast <= 1'b0;
end
else if (((write_index == C_M_AXI_BURST_LEN-2 && C_M_AXI_BURST_LEN >= 2) && wnext) || (C_M_AXI_BURST_LEN == 1 ))
begin
axi_wlast <= 1'b1;
end
else if (wnext)
axi_wlast <= 1'b0;
else if (axi_wlast && C_M_AXI_BURST_LEN == 1)
axi_wlast <= 1'b0;
else
axi_wlast <= axi_wlast;
end
always @(posedge M_AXI_ACLK)
begin
if (M_AXI_ARESETN == 0 || init_txn_pulse == 1'b1 || start_single_burst_write == 1'b1)
begin
write_index <= 0;
end
else if (wnext && (write_index != C_M_AXI_BURST_LEN-1))
begin
write_index <= write_index + 1;
end
else
write_index <= write_index;
end
/* Write Data Generator
Data pattern is only a simple incrementing count from 0 for each burst */
always @(posedge M_AXI_ACLK)
begin
if (M_AXI_ARESETN == 0 || init_txn_pulse == 1'b1)
axi_wdata <= 'b1;
//else if (wnext && axi_wlast)
// axi_wdata <= 'b0;
else if (wnext)
axi_wdata <= axi_wdata + 1;
else
axi_wdata <= axi_wdata;
end
//----------------------------
//Write Response (B) Channel
//----------------------------
always @(posedge M_AXI_ACLK)
begin
if (M_AXI_ARESETN == 0 || init_txn_pulse == 1'b1 )
begin
axi_bready <= 1'b0;
end
// accept/acknowledge bresp with axi_bready by the master
// when M_AXI_BVALID is asserted by slave
else if (M_AXI_BVALID && ~axi_bready)
begin
axi_bready <= 1'b1;
end
// deassert after one clock cycle
else if (axi_bready)
begin
axi_bready <= 1'b0;
end
// retain the previous value
else
axi_bready <= axi_bready;
end
//Flag any write response errors
assign write_resp_error = axi_bready & M_AXI_BVALID & M_AXI_BRESP[1];
五.總結(jié)
vivado中許多IP核都采用AXI通信協(xié)議,理解AXI協(xié)議有助于后續(xù)開(kāi)發(fā)工作,詳細(xì)信息推薦官方文件ug1037以及ihi0022c文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-861067.html
到了這里,關(guān)于【FPGA】 xilinx vivado中AXI4通信協(xié)議詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!