<XILINX> AXI4-Lite(一) 总线介绍

目录

01 AXI4_Lite介绍

AXI_Lite接口信号

02 AXI4_Lite读写事务接口说明

写事务(Write transaction)

AXI4-Lite_master写事务逻辑信号

AXI4-Lite_slave写事务逻辑信号

读事务(Read transaction)

AXI4-Lite_master读事务逻辑信号

AXI4-Lite_slave读事务逻辑信号

03 文章总结


大家好,这里是程序员杰克。一名平平无奇的嵌入式软件工程师。

上一篇主要是对Xilinx 官方对AXI协议的一些内容描述进行了介绍,本篇开始,AXI4的三种总线的时序以及相关特性进行总结分享。本篇结合Xilinx提供的模板对AXI4_Lite总线进行总结。


下面正式进入本章推送的内容。

01 AXI4_Lite介绍

AXI4_Lite总线协议是轻量化的AXI4总线,最关键的特性如下:

  • 不支持突发传输(burst length为1)
  • 仅支持32bit/64bit的数据位宽传输
  • 所有的访问都是不可修改、不可缓存
  • 不支持独占访问
  • 适用于寄存器简单的访问场合

AXI_Lite接口信号

AXI4-Lite总线有5个独立的通道:读地址通道、写地址通道、读数据通道、写数据通道、写响应通道;各通道的接口信号如下图所示:

图片

特别说明:

对于5个通道而言,每个通道的信号是独立。即是写地址、写数据、读数据等通道时可以同时进行的。一定要理解"独立"这个词,对于后续理解/编写时序特别重要。


02 AXI4_Lite读写事务接口说明

对于AXI4、AXI4-Lite而言,关键是地址和数据。对于地址和数据有效而言,取决于各通道的握手机制(xVALID、xREADY),以此为依据对时序进行分析。


写事务(Write transaction)

对于Xilinx官方提供AXI4_Lite总线模板,一次写传输事务逻辑如下:

  • Master将AWVALID、WVALID、BREADY置有效,等待握手和响应
  • Slave检测到AWVALID、WVALID信号同时有效时获取AWADDR,在下一个时钟上升沿将AWREADY、WREADY置有效,同时数据开始传输
  • Slave返回BRESP响应信息以及BVALID置有效

以下按照AXI4-Lite_master、AXI4-Lite_slave的顺序对AXI_Lite的逻辑实现进行说明,写事务逻辑仿真如下图:

图片

  • AXI4-Lite_master写事务逻辑信号

AXI4-Lite_master控制的信号如下表:

信号所属通道说明
AWVALID写地址通道地址有效信号
AWADDR写地址
AWPROT写保护类型,表示一次传输的特权、安全等级
WVALID写数据通道写有效信号
WDATA写数据(32bit/64bit)
WSTRBWDATA字节有效信号
BREADY写响应通道Ready信号,表明主机可以接收写响应信号

  • AXI4-Lite_slave写事务逻辑信号

AXI4-Lite_slave控制的信号如下表:

信号所属通道说明
AWREADY写地址通道地址有效信号
WREADY写数据通道写有效信号
BVALID写响应通道Ready信号,表明主机可以接收写响应信号
BRESP写响应,表明写传输的状态

读事务(Read transaction)

对于Xilinx官方提供AXI4_Lite总线模板,读事务逻辑仿真如下图:

图片

  • AXI4-Lite_master读事务逻辑信号

AXI4-Lite_master控制的信号如下表:

信号所属通道说明
ARVALID读地址通道地址有效信号
ARADDR读地址
ARPROT保护类型,表示一次传输的特权、安全等级
RREADY读数据通道读READY信号,表明主机可以接收从机返回的数据

  • AXI4-Lite_slave读事务逻辑信号

AXI4-Lite_slave控制的信号如下表:

ARREADY读地址通道可读信号
RVALID读地址通道读有效信号
RDATA读数据通道读数据(32bit/64bit)
RRESP读响应,表明读传输的状态

03 文章总结

鉴于公众号文章篇幅不宜过长,本文仅是对AXI_Lite的特性以及读写事务的接口进行说明,AXI_lite模板(master/slave)代码的分析便只能在下一篇推送进行分享。

参考文档:

《ug761_axi_reference_guide.pdf》

《UG1037-Vivado-AXI Reference Guide.pdf》

《IHI0022E_amba_axi_and_ace_protocol_spec.pdf》

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的基于Xilinx AXI4-Lite接口的SPI控制器的Verilog代码: ```verilog module axi_spi_controller ( input wire clk, input wire rst, input wire [31:0] axi_awaddr, input wire [2:0] axi_awprot, input wire axi_awvalid, output reg axi_awready, input wire [31:0] axi_wdata, input wire [3:0] axi_wstrb, input wire axi_wvalid, output reg axi_wready, output reg [31:0] axi_bresp, output reg axi_bvalid, input wire axi_bready, input wire [31:0] axi_araddr, input wire [2:0] axi_arprot, input wire axi_arvalid, output reg axi_arready, output reg [31:0] axi_rdata, output reg [1:0] axi_rresp, output reg axi_rvalid, input wire axi_rready, output reg spi_cs, output reg spi_clk, output reg spi_mosi, input wire spi_miso ); // AXI4-Lite read/write registers reg [31:0] control_reg; reg [31:0] status_reg; reg [31:0] data_reg; // SPI controller state machine reg [3:0] spi_state; localparam IDLE = 4'b0000; localparam WRITE = 4'b0001; localparam READ = 4'b0010; // SPI controller shift register reg [7:0] spi_shift_reg; reg [3:0] spi_shift_count; // AXI4-Lite read/write logic always @(posedge clk) begin if (rst) begin axi_awready <= 1'b0; axi_wready <= 1'b0; axi_bresp <= 2'b00; axi_bvalid <= 1'b0; axi_arready <= 1'b0; axi_rdata <= 32'h0; axi_rresp <= 2'b00; axi_rvalid <= 1'b0; end else begin // Write address if (axi_awvalid && !axi_awready) begin axi_awready <= 1'b1; axi_wready <= 1'b1; control_reg <= axi_wdata; end else if (axi_wvalid && !axi_wready) begin axi_wready <= 1'b1; case (axi_awaddr[1:0]) 2'b00: data_reg[7:0] <= axi_wdata[7:0]; 2'b01: data_reg[15:8] <= axi_wdata[7:0]; 2'b10: data_reg[23:16] <= axi_wdata[7:0]; 2'b11: data_reg[31:24] <= axi_wdata[7:0]; endcase end else if (axi_wvalid && axi_wready) begin axi_wready <= 1'b0; axi_bresp <= 2'b00; axi_bvalid <= 1'b1; end else begin axi_awready <= 1'b0; axi_wready <= 1'b0; axi_bresp <= 2'b00; axi_bvalid <= 1'b0; end // Read address if (axi_arvalid && !axi_arready) begin axi_arready <= 1'b1; case (axi_araddr[1:0]) 2'b00: axi_rdata <= control_reg; 2'b01: axi_rdata <= status_reg; 2'b10: axi_rdata <= data_reg; 2'b11: axi_rdata <= 32'h0; endcase axi_rresp <= 2'b00; axi_rvalid <= 1'b1; end else if (axi_rvalid && !axi_rready) begin axi_rvalid <= 1'b0; end else if (!axi_arvalid) begin axi_arready <= 1'b0; end end end // SPI controller state machine logic always @(posedge clk) begin if (rst) begin spi_cs <= 1'b1; spi_clk <= 1'b0; spi_mosi <= 1'b0; spi_state <= IDLE; spi_shift_reg <= 8'h0; spi_shift_count <= 4'h0; end else begin case (spi_state) IDLE: begin spi_cs <= 1'b1; spi_clk <= 1'b0; if (control_reg[0]) begin spi_state <= WRITE; spi_shift_reg <= data_reg[7:0]; spi_shift_count <= 4'h8; spi_cs <= 1'b0; end else if (control_reg[1]) begin spi_state <= READ; spi_shift_reg <= 8'h0; spi_shift_count <= 4'h0; spi_cs <= 1'b0; end end WRITE: begin spi_cs <= 1'b0; spi_clk <= ~spi_clk; if (spi_clk) begin spi_mosi <= spi_shift_reg[7]; spi_shift_reg <= {spi_shift_reg[6:0], 1'b0}; spi_shift_count <= spi_shift_count - 1; end if (!spi_clk && spi_shift_count == 0) begin spi_state <= IDLE; spi_cs <= 1'b1; end end READ: begin spi_cs <= 1'b0; spi_clk <= ~spi_clk; if (spi_clk) begin spi_shift_reg <= {spi_shift_reg[6:0], spi_miso}; spi_shift_count <= spi_shift_count + 1; end if (!spi_clk && spi_shift_count == 8) begin spi_state <= IDLE; spi_cs <= 1'b1; status_reg <= {24'h0, spi_shift_reg[7:0]}; end end endcase end end endmodule ``` 这个控制器将AXI4-Lite接口与SPI总线接口连接起来,并且支持读写控制寄存器和数据寄存器,可以进行SPI读写操作。在这个实现中,控制器的状态机负责管理SPI操作,包括写操作和读操作。 需要注意的是,这个实现只是一个简单的例子,可能需要根据具体的设计需求进行修改和扩展。在实际的设计中,还需要考虑时序约束、接口协议等方面的细节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰克拉力船长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值