ZYNQ-AXI_GP接口和AXI_HP接口的异同

本文详细介绍了ZYNQ System-on-Chip (SoC) 中的AXI_GP(通用目的)和AXI_HP(高性能)接口。AXI_GP接口通常用于控制配置,有四个接口,不带FIFO缓冲;而AXI_HP接口专用于高带宽数据传输,具有四个带FIFO缓冲的接口,直接连接到DDR和OCM存储器,提供高吞吐量的数据路径。AXI_HP接口支持动态位宽配置、自动对齐传输、写命令释放阈值编程等功能,适用于高性能应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习内容

学习关于ZYNQ IP核中的GP接口和HP接口的异同,介绍关于AXI_GP接口和AXI_HP接口的相关内容。

AXI_HP和AXI_GP异同

首先给出ZYNQ SoC的系统框图,如下图所示。在图中,箭头方向代表主机到从机的方向。
在这里插入图片描述
对于GP接口(general purpose)通用目的接口,有四个接口(两个从端口,两个主端口);HP接口(high-performance purpose)高性能接口,有四个接口(四个都是从端口)。GP接口直接连接到的是中央互联区(central interconnect),然后由中央互联区再连接到OCM interconnect和存储器接口上;而HP接口直接连接到的是OCM interconnect和存储器接口。所以对于GP接口,通常使用他进行控制配置;而对于HP接口,通常使用它进行数据传输交互。
下图是HP和GP对应主从机具体信息:
在这里插入图片描述

AXI_HP接口

4个AXI HP接口为PL的主机提供了DDR和OCM存储器的高带宽的数据路径。 每个HP接口包括两个的FIFO缓存,用于读写传输。PL到内存互连高速AXI HP端口路由连接到两个DDR内存端口和一个OCM存储器端口。AXI HP接口也被称为AFI (AXI FIFO接口),以强调它们的缓冲功能。 PL电平移位器必须通过LVL SHFTR EN启用后,才能进行PL逻辑通信。
在这里插入图片描述

特点

这些接口被设计为在PL主存储器和PS存储器(包括DDR和片上RAM)之间提供一个高吞吐量的数据路径。主要功能包括:

  • 可以实现32或64位数据位宽的主接口(每个端口独立编程)。
  • 在32位接口模式下,可以进行动态配置位为64位,以实现对齐传输,通过AxCACHE [1]可以进行控制。
  • 在32位接口模式下,为未对齐的32位传输自动扩展到64位。
  • 可编程的写命令释放阈值。
  • PL和PS之间的所有AXI接口的异步时钟域交叉。
  • 使用1kb (128 × 64位)数据缓存FIFO来平滑“长延迟”传输,用于读写。
  • 从PL端口提供QoS信令。
  • 命令和数据FIFO填充级计数可用于PL端。
  • 支持标准AXI 3.0接口。
  • 可编程命令下发到互连,分别用于读和写命令。
  • 14到70个指令范围的高性能从接口读接受能力。(取决于突发长度)
  • 8到32个指令范围的高性能从接口写接受能力。(取决于突发长度)

AXI_HP接口的框图

为了提高读写的性能,在读写数据通道添加了FIFO用于读写数据的传输。
在这里插入图片描述
有两组AXI端口,一组直接连接到PL,另一组连接到AXI互连矩阵,允许访问DDR和OCM内存:
在这里插入图片描述

AXI_GP接口

AXI_GP接口直接连接到主互连和从互连的端口,没有任何额外的FIFO缓冲,不像AXI_HP接口使用FIFO缓冲以提高性能和吞吐量。因此,性能受到主互连端口和从互连端口的限制。这些接口仅用于通用用途,并不是为了实现高性能。

特点

AXI GP的特性包括:

  • 支持标准AXI协议
  • 数据总线宽度只有32位
  • 主端口ID位宽为12位
  • 主端口发送能力:8位读,8位写
  • 从端口ID位宽为6位
  • 从端口接受能力:8位读,8位写

Reference

  1. Xilinx UG585
  2. 正点原子ZYNQ开发视频教程
ACP(Accelerated Coherency Port)是一个高速、低延迟的接口,用于连接处理器、DMA其他外设。以下是一个简单的ACP接口的Verilog代码示例: ``` module acp_interface( input clk, input reset, // ACP Master signals output [31:0] acp_mstr_addr, output [31:0] acp_mstr_wdata, input [31:0] acp_mstr_rdata, output acp_mstr_wr, output acp_mstr_rd, output acp_mstr_burst, output acp_mstr_size, output acp_mstr_lock, output acp_mstr_cache, output acp_mstr_prot, output acp_mstr_qos, output acp_mstr_id, // ACP Slave signals input [31:0] acp_slv_addr, input [31:0] acp_slv_wdata, output [31:0] acp_slv_rdata, input acp_slv_wr, input acp_slv_rd, input acp_slv_burst, input acp_slv_size, input acp_slv_lock, input acp_slv_cache, input acp_slv_prot, input acp_slv_qos, input acp_slv_id ); // ACP Master FSM reg [2:0] acp_mstr_state; reg [3:0] acp_mstr_cnt; // ACP Slave FSM reg [2:0] acp_slv_state; reg [3:0] acp_slv_cnt; // ACP Slave memory reg [31:0] acp_slv_mem [0:1023]; // 4KB memory // ACP Master states parameter ACP_MSTR_IDLE = 3'd0; parameter ACP_MSTR_ADDR = 3'd1; parameter ACP_MSTR_WRDATA = 3'd2; parameter ACP_MSTR_RDDATA = 3'd3; // ACP Slave states parameter ACP_SLV_IDLE = 3'd0; parameter ACP_SLV_ADDR = 3'd1; parameter ACP_SLV_WRDATA = 3'd2; parameter ACP_SLV_RDDATA = 3'd3; always @(posedge clk) begin if (reset) begin acp_mstr_state <= ACP_MSTR_IDLE; acp_mstr_cnt <= 0; acp_slv_state <= ACP_SLV_IDLE; acp_slv_cnt <= 0; end else begin // ACP Master FSM case (acp_mstr_state) ACP_MSTR_IDLE: begin if (acp_mstr_wr || acp_mstr_rd) begin acp_mstr_state <= ACP_MSTR_ADDR; acp_mstr_cnt <= 0; end end ACP_MSTR_ADDR: begin if (acp_mstr_cnt == 1) begin acp_mstr_state <= ACP_MSTR_WRDATA; acp_mstr_cnt <= 0; end else begin acp_mstr_cnt <= acp_mstr_cnt + 1; end end ACP_MSTR_WRDATA: begin if (acp_mstr_cnt == 1) begin acp_mstr_state <= ACP_MSTR_IDLE; acp_mstr_cnt <= 0; end else begin acp_mstr_cnt <= acp_mstr_cnt + 1; end end ACP_MSTR_RDDATA: begin if (acp_mstr_cnt == 1) begin acp_mstr_state <= ACP_MSTR_IDLE; acp_mstr_cnt <= 0; end else begin acp_mstr_cnt <= acp_mstr_cnt + 1; end end endcase // ACP Slave FSM case (acp_slv_state) ACP_SLV_IDLE: begin if (acp_slv_wr || acp_slv_rd) begin acp_slv_state <= ACP_SLV_ADDR; acp_slv_cnt <= 0; end end ACP_SLV_ADDR: begin if (acp_slv_cnt == 1) begin acp_slv_state <= ACP_SLV_WRDATA; acp_slv_cnt <= 0; end else begin acp_slv_cnt <= acp_slv_cnt + 1; end end ACP_SLV_WRDATA: begin if (acp_slv_cnt == 1) begin acp_slv_state <= ACP_SLV_IDLE; acp_slv_cnt <= 0; if (acp_slv_wr) begin acp_slv_mem[acp_slv_addr >> 2] <= acp_slv_wdata; end end else begin acp_slv_cnt <= acp_slv_cnt + 1; end end ACP_SLV_RDDATA: begin if (acp_slv_cnt == 1) begin acp_slv_state <= ACP_SLV_IDLE; acp_slv_cnt <= 0; if (acp_slv_rd) begin acp_slv_rdata <= acp_slv_mem[acp_slv_addr >> 2]; end end else begin acp_slv_cnt <= acp_slv_cnt + 1; end end endcase end end // ACP Master signals assign acp_mstr_burst = 2'b01; // Incrementing burst assign acp_mstr_size = 2'b10; // 4-byte transfer assign acp_mstr_lock = 1'b0; // No locking assign acp_mstr_cache = 4'b0000; // Non-cacheable assign acp_mstr_prot = 3'b000; // Normal memory assign acp_mstr_qos = 4'b0000; // Default QoS assign acp_mstr_id = 8'h00; // Default ID endmodule ``` 该代码示例包括ACP主机从机的状态机代码,并包含用于读取写入从机内存的逻辑。在实际系统中,ACP接口的信号数量功能可能会有所不同,具体取决于系统设计的需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FPGA and ICer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值