0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FPGA實現(xiàn)AXI4總線的讀寫

FPGA設(shè)計論壇 ? 來源:tencentcloud.csdn.net ? 2025-01-22 15:04 ? 次閱讀

FPGA實現(xiàn)AXI4總線的讀寫_如何寫axi4邏輯

一、AXI4 接口描述

通道 信號 信號描述
全局信號 aclk 主機(jī) 全局時鐘
aresetn 主機(jī) 全局復(fù)位,低有效
寫通道地址與控制信號通道 M_AXI_WR_awid[3:0] 主機(jī) 寫地址ID,用來標(biāo)志一組寫信號
M_AXI_WR_awaddr[31:0] 主機(jī) 寫地址,給出一次寫突發(fā)傳輸?shù)膶懙刂?/td>
M_AXI_WR_awlen[7:0] 主機(jī) 突發(fā)長度,給出突發(fā)傳輸?shù)拇螖?shù)
M_AXI_WR_awsize[2:0] 主機(jī) 突發(fā)大小,給出每次突發(fā)傳輸?shù)淖止?jié)數(shù)
M_AXI_WR_awburst[1:0] 主機(jī) 突發(fā)類型
M_AXI_WR_awlock 主機(jī) 總線鎖信號,可提供操作的原子性
M_AXI_WR_awcache[3:0] 主機(jī) 內(nèi)存類型,表明一次傳輸是怎樣通過系統(tǒng)的
M_AXI_WR_awprot[2:0] 主機(jī) 保護(hù)類型,表明一次傳輸?shù)奶貦?quán)級及安全等級
M_AXI_WR_awqos[3:0] 主機(jī) 質(zhì)量服務(wù)QoS
M_AXI_WR_awvalid 主機(jī) 有效信號,表明此通道的地址控制信號有效
M_AXI_WR_awready 從機(jī) 表明“從”可以接收地址和對應(yīng)的控制信號
寫通道數(shù)據(jù)通道 M_AXI_WR_wdata[63:0] 主機(jī) 寫數(shù)據(jù)
M_AXI_WR_wstrb[7:0] 主機(jī) 寫數(shù)據(jù)有效的字節(jié)線,用來表明哪8bits數(shù)據(jù)是有效的
M_AXI_WR_wlast 主機(jī) 表明此次傳輸是最后一個突發(fā)傳輸
M_AXI_WR_wvalid 主機(jī) 寫有效,表明此次寫有效
M_AXI_WR_wready 從機(jī) 表明從機(jī)可以接收寫數(shù)據(jù)
寫通道響應(yīng)通道 M_AXI_WR_bid[3:0] 從機(jī) 寫響應(yīng)ID TAG
M_AXI_WR_bresp[1:0] 從機(jī) 寫響應(yīng),表明寫傳輸?shù)臓顟B(tài)
M_AXI_WR_bvalid 從機(jī) 寫響應(yīng)有效
M_AXI_WR_bready 主機(jī) 表明主機(jī)能夠接收寫響應(yīng)
讀通道地址與控制信號通道 M_AXI_RD_arid[3:0] 主機(jī) 讀地址ID,用來標(biāo)志一組寫信號
M_AXI_RD_araddr[31:0] 主機(jī) 讀地址,給出一次寫突發(fā)傳輸?shù)淖x地址
M_AXI_RD_arlen[7:0] 主機(jī) 突發(fā)長度,給出突發(fā)傳輸?shù)拇螖?shù)
M_AXI_RD_arsize[2:0] 主機(jī) 突發(fā)大小,給出每次突發(fā)傳輸?shù)淖止?jié)數(shù)
M_AXI_RD_arburst[1:0] 主機(jī) 突發(fā)類型
M_AXI_RD_arlock[1:0] 主機(jī) 總線鎖信號,可提供操作的原子性
M_AXI_RD_arcache[3:0] 主機(jī) 內(nèi)存類型,表明一次傳輸是怎樣通過系統(tǒng)的
M_AXI_RD_arprot[2:0] 主機(jī) 保護(hù)類型,表明一次傳輸?shù)奶貦?quán)級及安全等級
M_AXI_RD_arqos[3:0] 主機(jī) 質(zhì)量服務(wù)QOS
M_AXI_RD_arvalid 主機(jī) 有效信號,表明此通道的地址控制信號有效
M_AXI_RD_arready 從機(jī) 表明“從”可以接收地址和對應(yīng)的控制信號
讀通道數(shù)據(jù)通道 M_AXI_RD_rid[3:0] 從機(jī) IDtag
M_AXI_RD_rdata[63:0] 從機(jī) 讀數(shù)據(jù)
M_AXI_RD_rresp[1:0] 從機(jī) 讀響應(yīng),表明讀傳輸?shù)臓顟B(tài)
M_AXI_RD_rlast 從機(jī) 表明讀突發(fā)的最后一次傳輸
M_AXI_RD_rvalid 從機(jī) 表明此通道信號有效
M_AXI_RD_rready 主機(jī) 表明主機(jī)能夠接收讀數(shù)據(jù)和響應(yīng)信息

二、地址通道的控制信號與地址描述

1、地址ID

AWID[3:0]與ARID[3:0]:對于只有一個主機(jī)從機(jī)設(shè)備,該值可設(shè)置為任意

2、地址結(jié)構(gòu)

AWADDR[31:0]與ARADDR[31:0]:AXI協(xié)議是基于burst(突發(fā))的,主機(jī)只給出突發(fā)傳輸?shù)牡谝粋€字節(jié)的地址,從機(jī)必須計算突發(fā)傳輸后續(xù)的地址。突發(fā)傳輸不能跨4KB邊界(防止突發(fā)跨越兩個從機(jī)的邊界,也限制了從機(jī)所需支持的地址自增數(shù)

3、突發(fā)長度

AWLEN[7:0]與ARLEN[7:0]:ARLEN[7:0]決定讀傳輸?shù)耐话l(fā)長度,AWLEN[7:0]決定寫傳輸?shù)耐话l(fā)長度。AXI4擴(kuò)展突發(fā)長度支持INCR突發(fā)類型為1256次傳輸,對于其他的傳輸類型依然保持116次突發(fā)傳輸(Burst_Length=AxLEN[7:0]+1)

4、突發(fā)大小

ARSIZE[2:0],讀突發(fā)傳輸;AWSIZE[2:0],寫突發(fā)傳輸。

AxSIZE[2:0] 傳輸字節(jié)大小
3'b000 1
3'b001 2
3'b010 4
3'b011 8
3'b100 16
3'b101 32
3'b110 64
3'b111 128

5、突發(fā)類型

AWBURST[1:0]與ARBURST[1:0]:

AxBURST[1:0] 突發(fā)類型
2'b00 FIXED
2'b01 INCR
2'b10 WRAP
2'b11 Reserved

FIXED:突發(fā)傳輸過程中地址固定,用于FIFO訪問

INCR:增量突發(fā),傳輸過程中,地址遞增。增加量取決AxSIZE的值

WRAP:回環(huán)突發(fā),和增量突發(fā)類似,但會在特定高地址的邊界處回到低地址處?;丨h(huán)突發(fā)的長度只能是2,4,8,16次傳輸,傳輸首地址和每次傳輸?shù)拇笮R。最低的地址整個傳輸?shù)臄?shù)據(jù)大小對齊?;丨h(huán)邊界等于(AxSIZE*AxLEN)

三、數(shù)據(jù)通道信號描述

1、WDATA與RDATA:寫與讀數(shù)據(jù)線信號

WSTRB:有效字節(jié),WSTRB[n:0]對應(yīng)于對應(yīng)的寫字節(jié),WSTRB[n]對應(yīng)WDATA[8n+7:8n],也就是對于的數(shù)據(jù)寬度的字節(jié)數(shù)是否有效。WVALID為低時,WSTRB可以為任意值,WVALID為高時,WSTRB為高的字節(jié)線必須指示有效的數(shù)據(jù)。對于一般應(yīng)用,將WSTRB全部置1即可,保證全部數(shù)據(jù)有效。讀通道無該信號。

2、WLAST與RLAST

寫與讀最后一個字節(jié),拉高表示傳輸最后一個字節(jié),也意味著傳輸結(jié)束

3、burst[1:0]

描述讀寫相應(yīng)結(jié)構(gòu)

burst[1:0]
00 常規(guī)訪問成功
01 獨(dú)占訪問成功
10 從機(jī)錯誤
11 解碼錯誤

四、突發(fā)寫時序:

AXI4突發(fā)寫可以分為7個狀態(tài),寫空閑,寫通道寫地址等待,寫通道寫地址,寫數(shù)據(jù)等待,寫數(shù)據(jù)循環(huán),接受寫應(yīng)答,寫結(jié)束這7種狀態(tài)。之所以劃分為7個狀態(tài)是為了后續(xù)寫程序的狀態(tài)機(jī)做準(zhǔn)備。

7種狀態(tài)

1、寫空閑:等待觸發(fā)突發(fā)信號

2、寫通道寫地址等待:準(zhǔn)備好寫地址AWADDR,然后拉高AWVALID。

3、寫通道寫地址:從機(jī)接受到AWVALID,發(fā)出AWREADY。

4、寫數(shù)據(jù)等待:準(zhǔn)備好數(shù)據(jù)WDATA,拉高WVALID。

5、寫數(shù)據(jù)循環(huán):從機(jī)接受WVALID,確認(rèn)數(shù)據(jù)WDATA有效并且接受,發(fā)出WREADY,AXI是突發(fā)傳輸:循環(huán)該操作到接受到WLAST最后一個數(shù)據(jù)標(biāo)志位。

6、接受寫應(yīng)答:接受到從機(jī)發(fā)出的BVALID,主機(jī)發(fā)出BREADY。

7、寫結(jié)束:拉低未拉低的信號,進(jìn)入寫空閑

0ba57174-d886-11ef-9310-92fbcf53809c.png

五、突發(fā)讀時序

AXI4突發(fā)讀可以分為6個狀態(tài),讀空閑,讀通道寫地址等待,讀通道寫地址,讀數(shù)據(jù)等待,讀數(shù)據(jù)循環(huán),讀結(jié)束這6種狀態(tài)。之所以劃分為6個狀態(tài)是為了后續(xù)寫程序的狀態(tài)機(jī)做準(zhǔn)備。

6種狀態(tài)

1、讀空閑:等待觸發(fā)突發(fā)信號。

2、讀通道寫地址等待:準(zhǔn)備好寫地址ARADDR,然后拉高ARVALID。

3、讀通道寫地址:從機(jī)接受到ARVALID,發(fā)出ARREADY。

4、讀數(shù)據(jù)等待:從機(jī)準(zhǔn)備好數(shù)據(jù)WDATA,從機(jī)拉高RVALID。

5、讀數(shù)據(jù)循環(huán):主機(jī)接受RVALID,確認(rèn)數(shù)據(jù)RDATA有效并且接受,發(fā)出RREADY給從機(jī),AXI是突發(fā)傳輸:循環(huán)該操作到接受到RLAST最后一個數(shù)據(jù)標(biāo)志位

6、讀結(jié)束:拉低未拉低的信號,進(jìn)入讀空閑

0bc2f5a0-d886-11ef-9310-92fbcf53809c.png

注:

1、讀數(shù)據(jù)必須總是跟在與其數(shù)據(jù)相關(guān)聯(lián)的地址之后。

2、寫響應(yīng)必須總是跟在與其相關(guān)聯(lián)的寫事務(wù)的最后出現(xiàn)。

六、寫時序狀態(tài)機(jī)

0be9b334-d886-11ef-9310-92fbcf53809c.png

七、寫時序代碼

module axi4_write(
    input               clk             ,
    input               resetn          ,
    input               enable_write    ,  //寫使能
    input  [31:0]       w_addr          ,  //地址
    input  [63:0]       w_data          ,  //數(shù)據(jù)
    output reg          write_done      ,  //寫完成
    output reg          write_data      ,  //表示數(shù)據(jù)寫入,突發(fā)模式下可用于切換數(shù)據(jù)的指示信號
    //axi4寫通道地址通道
    output  [3:0]       m_axi_awid      , //寫地址ID,用來標(biāo)志一組寫信號
    output reg[31:0]    m_axi_awaddr    ,//寫地址,給出一次寫突發(fā)傳輸?shù)膶懙刂?
    output [7:0]        m_axi_awlen     , //突發(fā)長度,給出突發(fā)傳輸?shù)拇螖?shù) 
    output [2:0]        m_axi_awsize    , //突發(fā)大小,給出每次突發(fā)傳輸?shù)淖止?jié)數(shù) 
    output [1:0]        m_axi_awburst   , //突發(fā)類型 
    output              m_axi_awlock    , //總線鎖信號,可提供操作的原子性 
    output [3:0]        m_axi_awcache   , //內(nèi)存類型,表明一次傳輸是怎樣通過系統(tǒng)的
    output [2:0]        m_axi_awprot    , //保護(hù)類型,表明一次傳輸?shù)奶貦?quán)級及安全等級 
    output [3:0]        m_axi_awqos     , //質(zhì)量服務(wù)QoS
    output reg          m_axi_awvalid   , //有效信號,表明此通道的地址控制信號有效 
    input               m_axi_awready   , //表明“從”可以接收地址和對應(yīng)的控制信號
    //axi4寫通道數(shù)據(jù)通道
    output reg[63:0]    m_axi_wdata     , //寫數(shù)據(jù) 
    output [7:0]        m_axi_wstrb     , //寫數(shù)據(jù)有效的字節(jié)線 
    output reg          m_axi_wlast     , //表明此次傳輸是最后一個突發(fā)傳輸
    output reg          m_axi_wvalid    , //寫有效,表明此次寫有效
    input               m_axi_wready    , //表明從機(jī)可以接收寫數(shù)據(jù) 
    //axi4寫通道應(yīng)答通道 
    input [3:0]         m_axi_bid       , //寫響應(yīng)ID TAG
    input [1:0]         m_axi_bresp     , //寫響應(yīng),表明寫傳輸?shù)臓顟B(tài)
    input               m_axi_bvalid    , //寫響應(yīng)有效
    output reg          m_axi_bready      //表明主機(jī)能夠接收寫響應(yīng)
    );

//*******************參數(shù)*****************************
    localparam  W_IDLEW     = 3'b001    ; //空閑等待
    localparam  W_DRIVEW    = 3'b011    ; //準(zhǔn)備、取地址
    localparam  W_HANDS     = 3'b010    ; //握手
    localparam  W_WSTBR     = 3'b110    ; //突發(fā)
    localparam  W_WAIT      = 3'b111    ; //等待結(jié)束的信息
    localparam  W_END       = 3'b101    ; //寫數(shù)據(jù)階段

    parameter   LEN_NUM     = 1         ;
    parameter   AWID        = 0         ;
//*********內(nèi)部信號******************************
    reg  [2:0]  state ,   next_state   ;
    reg         wready_over            ;
    reg  [7:0]  len                    ;

    assign  m_axi_awid    = AWID[3:0] ;    // [3:0]  //寫地址ID,用來標(biāo)志一組寫信號  
    assign  m_axi_awlen   = LEN_NUM-1 ;    // [7:0]  //突發(fā)長度,給出突發(fā)傳輸?shù)拇螖?shù)  
    assign  m_axi_awsize  = 3'b011    ;    // [2:0]  //突發(fā)大小,給出每次突發(fā)傳輸?shù)淖止?jié)數(shù)  
    assign  m_axi_awburst = 2'b10     ;    // [1:0]  //突發(fā)類型  
    assign  m_axi_awlock  = 1'b0      ;    //        //總線鎖信號,可提供操作的原子性  
    assign  m_axi_awcache = 4'b0010   ;    // [3:0]  //內(nèi)存類型,表明一次傳輸是怎樣通過系統(tǒng)的 
    assign  m_axi_awprot  = 3'b000    ;    // [2:0]  //保護(hù)類型,表明一次傳輸?shù)奶貦?quán)級及安全等級 
    assign  m_axi_awqos   = 4'b0000   ;    // [3:0]  //質(zhì)量服務(wù)QoS 
    assign  m_axi_wstrb   = 8'hff     ;

//狀態(tài)機(jī)
    always @(*) begin
        state   =   next_state    ;
    end    


    always @(posedge clk or negedge resetn) begin
        if(!resetn) begin
            wready_over<=0;
        end
        else if(state==W_IDLEW || state==W_END )
            wready_over<=0;
        else if(m_axi_wready)
            wready_over<=1;
    end
   
    always @(posedge clk or negedge resetn) begin
        if(!resetn) begin
            next_state  <=  W_IDLEW   ;
            len <=0 ;
        end
        else case(state)
                W_IDLEW :   if(enable_write) next_state <= W_DRIVEW  ;  else next_state<=W_IDLEW    ;
                W_DRIVEW:   if(m_axi_awready) begin
                                next_state <= W_HANDS ; 
                                len<=LEN_NUM-1          ; 
                            end 
                            else next_state<=W_DRIVEW   ;
                W_HANDS :   if(wready_over && len==0)
                                next_state <= W_WAIT ;  
                            else   if(wready_over ) next_state <= W_WSTBR   ;
                            else next_state<=W_HANDS  ;
                W_WSTBR :   if(len==1)       next_state <= W_WAIT ;  
                            else begin 
                                next_state <= W_WSTBR ;
                                len <=len-1           ;
                            end
                W_WAIT  :   next_state<=W_END ;  
                W_END   :   if(m_axi_bvalid)next_state <= W_IDLEW  ;  else next_state<=W_END    ;
                default :   next_state<=W_IDLEW ;
        endcase   
    end
  // 組合邏輯輸出
    always @(* ) begin
        case(state)
            W_IDLEW :   begin
                            m_axi_wlast    =   0        ;
                            m_axi_awaddr   =   0        ;
                            m_axi_awvalid  =   0        ;
                            m_axi_wdata    =   0        ;
                            m_axi_wvalid   =   0        ;
                            m_axi_bready   =   0        ;
                            write_done     =   0        ;
                            write_data     =   0        ;
                    end
            W_DRIVEW:   begin
                            m_axi_wlast    =   0       ;
                            m_axi_awaddr   =   w_addr  ;
                            m_axi_awvalid  =   1       ;
                            m_axi_wdata    =   0       ;
                            m_axi_wvalid   =   0       ;
                            m_axi_bready   =   0       ;
                            write_done     =   0       ;
                            write_data     =   0       ;
                    end
            W_HANDS :   begin
                            m_axi_wlast    =   0       ;
                            m_axi_awaddr   =   0       ;
                            m_axi_awvalid  =   0       ;
                            m_axi_wdata    =   0       ;
                            m_axi_wvalid   =   0       ;
                            m_axi_bready   =   0       ;
                            write_done     =   0       ;
                            write_data     =   0       ;
                    end
            W_WSTBR :   begin
                            m_axi_wlast    =   0       ;
                            m_axi_awaddr   =   0       ;
                            m_axi_awvalid  =   0       ;
                            m_axi_wdata    =   w_data  ;
                            m_axi_wvalid   =   1       ;
                            m_axi_bready   =   0       ;
                            write_done     =   0       ;
                            write_data     =   1       ;
                    end
            W_WAIT  :   begin
                            m_axi_wlast    =   1       ;
                            m_axi_awaddr   =   0       ;
                            m_axi_awvalid  =   0       ;
                            m_axi_wdata    =   w_data  ;
                            m_axi_wvalid   =   1       ;
                            m_axi_bready   =   0       ;
                            write_done     =   1       ;
                            write_data     =   1       ;
                    end
           
            W_END   :   begin
                            m_axi_wlast    =   0       ;
                            m_axi_awaddr   =   0       ;
                            m_axi_awvalid  =   0       ;
                            m_axi_wdata    =   0       ;
                            m_axi_wvalid   =   0       ;
                            m_axi_bready   =   1       ;
                            write_done     =   0       ;
                            write_data     =   0       ;
                    end
            default :   begin
                            m_axi_wlast    =   0   ;
                            m_axi_awaddr   =   0   ;
                            m_axi_awvalid  =   0   ;
                            m_axi_wdata    =   0   ;
                            m_axi_wvalid   =   0   ;
                            m_axi_bready   =   0   ;
                            write_done     =   0   ;
                            write_data     =   0   ;
                    end
        endcase
    end
endmodule

八、讀時序狀態(tài)機(jī)

0c021b68-d886-11ef-9310-92fbcf53809c.png

九、讀時序代碼

module axi4_read(
    input               resetn          ,//axi復(fù)位 
    input               clk             ,  //axi時鐘 
    input               enable_read     ,
    output              read_data       ,
    output              read_done       ,
    input       [31:0]  r_addr          ,
    output  reg [63:0]  r_data          ,
    //axi讀通道寫地址 
     output     [3:0]   m_axi_arid      , //讀地址ID,用來標(biāo)志一組寫信號
     output reg [31:0]  m_axi_araddr    , //讀地址,給出一次寫突發(fā)傳輸?shù)淖x地址
     output     [7:0]   m_axi_arlen     , //突發(fā)長度,給出突發(fā)傳輸?shù)拇螖?shù)
     output     [2:0]   m_axi_arsize    , //突發(fā)大小,給出每次突發(fā)傳輸?shù)淖止?jié)數(shù)
     output     [1:0]   m_axi_arburst   , //突發(fā)類型
     output     [1:0]   m_axi_arlock    , //總線鎖信號,可提供操作的原子性
     output     [3:0]   m_axi_arcache   , //內(nèi)存類型,表明一次傳輸是怎樣通過系統(tǒng)的 
     output     [2:0]   m_axi_arprot    , //保護(hù)類型,表明一次傳輸?shù)奶貦?quán)級及安全等級
     output     [3:0]   m_axi_arqos     , //質(zhì)量服務(wù)QOS 
     output reg         m_axi_arvalid   , //有效信號,表明此通道的地址控制信號有效 
     input              m_axi_arready   , //表明“從”可以接收地址和對應(yīng)的控制信號
     //axi讀通道讀數(shù)據(jù) 
     input      [3:0]   m_axi_rid       , //讀ID tag 
     input      [63:0]  m_axi_rdata     , //讀數(shù)據(jù) 
     input      [1:0]   m_axi_rresp     , //讀響應(yīng),表明讀傳輸?shù)臓顟B(tài)
     input              m_axi_rlast     , //表明讀突發(fā)的最后一次傳輸
     input              m_axi_rvalid    , //表明此通道信號有效 
     output reg         m_axi_rready      //表明主機(jī)能夠接收讀數(shù)據(jù)和響應(yīng)信息
    
    );
//
    localparam [2:0] R_IDLER      =  3'b001   ;
    localparam [2:0] R_WAIT       =  3'b011   ;
    localparam [2:0] R_BURST      =  3'b010   ;
    localparam [2:0] R_END        =  3'b110   ;

    parameter  ARID   = 0    ;
    parameter  RD_LEN = 1    ;
//
    reg [2:0] state , next_state    ;
    reg          rvalid_over    ;
//    
    assign m_axi_arid      = ARID[3:0]      ;//地址id 
    assign m_axi_arlen     = RD_LEN-32'd1   ;//突發(fā)長度
    assign m_axi_arsize    = 3'b011         ;//表示AXI總線每個數(shù)據(jù)寬度是8字節(jié),64位 
    assign m_axi_arburst   = 2'b01          ;//地址遞增方式傳輸
    assign m_axi_arlock    = 1'b0           ;
    assign m_axi_arcache   = 4'b0010        ; 
    assign m_axi_arprot    = 3'b000         ;
    assign m_axi_arqos     = 4'b0000        ;

    assign read_data       =  m_axi_rvalid  ;
    assign read_done       = m_axi_rlast    ;
//axi讀狀態(tài)機(jī)
    always @(*) begin
        state   =   next_state  ;
    end
    //
    always @(posedge clk  or negedge resetn) begin
        if(!resetn) begin
            rvalid_over <=0  ;
        end 
        else if(state==R_IDLER) begin
            rvalid_over <=0  ;
        end
        else if(m_axi_rvalid)begin
            rvalid_over <= 1 ;
        end
    end

    always @(posedge clk or negedge resetn) begin
        if(!resetn)
            next_state <= R_IDLER;
        else    case(state)
                    R_IDLER  :  if(enable_read) next_state <= R_WAIT ;else next_state<=R_IDLER   ; 
                    R_WAIT   :  if(m_axi_arready) next_state<=R_BURST  ;else next_state<=R_WAIT  ;  
                    R_BURST  :  if(m_axi_rlast)  next_state<=R_END    ;else next_state  <=  R_BURST ;
                    R_END    :  if(rvalid_over) next_state<=R_IDLER;else next_state<=R_END ;  
                    default  :  next_state<=R_IDLER ;
        endcase
    end
    //
    always @(*) begin
        case(state)
            R_IDLER  :  begin
                            m_axi_araddr  = 0       ;  
                            m_axi_arvalid = 0       ;  
                            m_axi_rready  = 0       ;  
                            r_data        = 0       ;  
                        end 
            R_WAIT   :  begin
                            m_axi_araddr  = r_addr      ;  
                            m_axi_arvalid = 1           ;  
                            m_axi_rready  = 0           ;  
                            r_data        = 0           ;    
                        end             
            R_BURST  :  begin
                            m_axi_araddr  = 0           ;  
                            m_axi_arvalid = 0           ;  
                            m_axi_rready  = 1           ;  
                            r_data        = m_axi_rdata ;      
                        end   
            R_END    :  begin
                            m_axi_araddr  = 0           ;  
                            m_axi_arvalid = 0           ;  
                            m_axi_rready  = 1           ;  
                            r_data        = 0           ;     
                        end 
            default  :  begin
                            m_axi_araddr  = 0           ;  
                            m_axi_arvalid = 0           ;  
                            m_axi_rready  = 0           ;  
                            r_data        = 0           ;     
                        end 
        endcase
    end

endmodule

原文鏈接:

https://tencentcloud.csdn.net/678a0c64edd0904849a660e1.html

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1630

    文章

    21786

    瀏覽量

    605052
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8685

    瀏覽量

    151643
  • 時序
    +關(guān)注

    關(guān)注

    5

    文章

    392

    瀏覽量

    37380
  • AXI4總線
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    1412

原文標(biāo)題:FPGA實現(xiàn)AXI4總線的讀寫_如何寫axi4邏輯

文章出處:【微信號:gh_9d70b445f494,微信公眾號:FPGA設(shè)計論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    請問microblaze如何通過串口讀寫FPGA內(nèi)部axi4總線上的寄存器?

    microblaze通過串口讀寫FPGA內(nèi)部axi4總線上的寄存器
    發(fā)表于 12-23 06:16

    看看在SpinalHDL中AXI4總線互聯(lián)IP的設(shè)計

    無論是做SOC設(shè)計還是FPGA設(shè)計,AXI4總線是經(jīng)常提及的。關(guān)于AXI4總線關(guān)于什么是AXI4
    發(fā)表于 08-02 14:28

    AXI4接口協(xié)議的基礎(chǔ)知識

    AXI-4 Memory Mapped也被稱之為AXI-4 Full,它是AXI4接口協(xié)議的基礎(chǔ),其他AXI4接口是該接口的變形。總體而言,AXI-
    的頭像 發(fā)表于 09-23 11:20 ?6106次閱讀
    <b class='flag-5'>AXI4</b>接口協(xié)議的基礎(chǔ)知識

    一文詳解ZYNQ中的DMA與AXI4總線

    在ZYNQ中,支持AXI-Lite,AXI4AXI-Stream三種總線,但PS與PL之間的接口卻只支持前兩種,AXI-Stream只能在
    的頭像 發(fā)表于 09-24 09:50 ?5389次閱讀
    一文詳解ZYNQ中的DMA與<b class='flag-5'>AXI4</b><b class='flag-5'>總線</b>

    ZYNQ中DMA與AXI4總線

    和接口的構(gòu)架 在ZYNQ中,支持AXI-Lite,AXI4AXI-Stream三種總線,但PS與PL之間的接口卻只支持前兩種,AXI-St
    的頭像 發(fā)表于 11-02 11:27 ?4365次閱讀
    ZYNQ中DMA與<b class='flag-5'>AXI4</b><b class='flag-5'>總線</b>

    深入AXI4總線一握手機(jī)制

    本系列我想深入探尋 AXI4 總線。不過事情總是這樣,不能我說想深入就深入。當(dāng)前我對 AXI總線的理解尚談不上深入。但我希望通過一系列文章,讓讀者能和我一起深入探尋
    發(fā)表于 03-17 21:40 ?25次下載
    深入<b class='flag-5'>AXI4</b><b class='flag-5'>總線</b>一握手機(jī)制

    深入 AXI4總線 (四):RAM 讀取實戰(zhàn)

    本系列我想深入探尋 AXI4 總線。不過事情總是這樣,不能我說想深入就深入。當(dāng)前我對 AXI總線的理解尚談不上深入。但我希望通過一系列文...
    發(fā)表于 02-07 11:36 ?4次下載
    深入 <b class='flag-5'>AXI4</b><b class='flag-5'>總線</b> (四):RAM 讀取實戰(zhàn)

    AXI4 、 AXI4-Lite 、AXI4-Stream接口

    AXI4 是一種高性能memory-mapped總線,AXI4-Lite是一只簡單的、低通量的memory-mapped 總線,而 AXI4
    的頭像 發(fā)表于 07-04 09:40 ?8693次閱讀

    使用AXI4總線實現(xiàn)視頻輸入輸出

    ; axi4 stream to video out這樣的路徑。網(wǎng)上例子很多,官方參考也有xapp521,實現(xiàn)起來參考無壓力。
    的頭像 發(fā)表于 10-11 14:26 ?5948次閱讀

    FPGA AXI4協(xié)議學(xué)習(xí)筆記(二)

    上文FPGA IP之AXI4協(xié)議1_協(xié)議構(gòu)架對協(xié)議框架進(jìn)行了說明,本文對AXI4接口的信號進(jìn)行說明。
    的頭像 發(fā)表于 05-24 15:05 ?1552次閱讀
    <b class='flag-5'>FPGA</b> <b class='flag-5'>AXI4</b>協(xié)議學(xué)習(xí)筆記(二)

    FPGA AXI4協(xié)議學(xué)習(xí)筆記(三)

    上文FPGA IP之AXI4協(xié)議1_信號說明把AXI協(xié)議5個通道的接口信息做了說明,本文對上文說的信號進(jìn)行詳細(xì)說明。
    的頭像 發(fā)表于 05-24 15:06 ?1160次閱讀
    <b class='flag-5'>FPGA</b> <b class='flag-5'>AXI4</b>協(xié)議學(xué)習(xí)筆記(三)

    Xilinx FPGA AXI4總線(一)介紹【AXI4】【AXI4-Lite】【AXI-Stream】

    FPGA 應(yīng)用角度看看 AMBA 總線中的 AXI4 總線
    發(fā)表于 06-21 15:21 ?2382次閱讀
    Xilinx <b class='flag-5'>FPGA</b> <b class='flag-5'>AXI4</b><b class='flag-5'>總線</b>(一)介紹【<b class='flag-5'>AXI4</b>】【<b class='flag-5'>AXI4</b>-Lite】【<b class='flag-5'>AXI</b>-Stream】

    漫談AMBA總線-AXI4協(xié)議的基本介紹

    本文主要集中在AMBA協(xié)議中的AXI4協(xié)議。之所以選擇AXI4作為講解,是因為這個協(xié)議在SoC、IC設(shè)計中應(yīng)用比較廣泛。
    發(fā)表于 01-17 12:21 ?2488次閱讀
    漫談AMBA<b class='flag-5'>總線</b>-<b class='flag-5'>AXI4</b>協(xié)議的基本介紹

    FPGA通過AXI總線讀寫DDR3實現(xiàn)方式

    AXI總線由一些核心組成,包括AXI主處理器接口(AXI4)、AXI處理器到協(xié)處理器接口(AXI4
    發(fā)表于 04-18 11:41 ?1318次閱讀

    SoC設(shè)計中總線協(xié)議AXI4AXI3的主要區(qū)別詳解

    AXI4AXI3是高級擴(kuò)展接口(Advanced eXtensible Interface)的兩個不同版本,它們都是用于SoC(System on Chip)設(shè)計中的總線協(xié)議,用于處理器和其它外設(shè)之間的高速數(shù)據(jù)傳輸。
    的頭像 發(fā)表于 05-10 11:29 ?7207次閱讀
    SoC設(shè)計中<b class='flag-5'>總線</b>協(xié)議<b class='flag-5'>AXI4</b>與<b class='flag-5'>AXI</b>3的主要區(qū)別詳解