ZYNQ-AXI4 DDR读写测试

简要记录一下:实验任务是通过自定义一个 AXI4 接口的 IP 核,通过 AXI_HP 接口对 PS 端 DDR3 进行读写测
试(该AXI配置的AXI FULL模式)。即PL端通过按下按键KEY后向PS端的DDR3写入数据,然后PS端可以通过串口读出数据并且可以通过ILA去抓出PL端的写模块写入的数据比较是否一致

硬件框图: 

DDR3 Test 是自定义的 IP 核,具有 AXI4 Master 端口,该端口通过 AXI Smartconnect模块,最终连接到 PS 端的 S_AXI_HP0 端口。输入的按键控制 DDR3 Test 模块对 PS 的 DDR3 进行读写测
试,并在读写测试结束后,通过两个 PL LED 灯分别指示读写完成和读写错误 。

自定义IP核axi4_rw_test IP核:

该IP核里有两个模块,最底层模块是读写控制模块,状态机控制逻辑:

硬件block design:

生成bit流导出至vitis平台:

#include "stdio.h"
#include "xil_cache.h"
#include "xil_printf.h"
#include "xil_io.h"

int main()
{
	int i;
	char c;

	Xil_DCacheDisable();
	printf("AXI4 PL DDR TEST");

	while(1)
	{
		scanf("%c",&c);
		if(c == 'c'){
			printf("start\r\n");
			for(i=0;i<4096;i=i+4)
			{
				printf("%d is %d\n",i,(int)(Xil_In32(0x10000000+i)));
			}
		}
	}
	return 0;
}

烧录代码:可以看见串口和ILA抓出的数据通道并没有数据,等待着PL key按键按下后触发

 

按下PL端按键后:当捕获到数据通道的valid和ready信号都拉高后,开始发送数据

此时PS串口也能读出数据:

补:也是实现在Linux下用AXI数据流做PS与PL的交互了,不枉之前自己花好多时间来配置Linux环境:

配环境时遇到一个问题:Could not find ARM device on the board for connection 'Local'即无法在Linux实现烧录。

 我查看设备管理器确认是下载了下载器驱动,不知道为啥一直烧不了。结果是对于 Linux ,由于安装驱动程序需要 root 或 sudo 访问权限,因此从 Vivado 2015.4 版本开始,默认不安装 jtag 驱动,仍然需要再次手动安装。

详细可参考:

关于电脑无法识别Xilinx下载器的解决方法-OpenEdv-开源电子网

VITIS烧录时识别不到串口需要在根目录的dev文件目录下给端口赋权限,不然识别不到COM口,命令如下:sudo chmod 777 ttyUSB0

### DDR3与AXI4接口之间的读写操作 #### AXI4总线协议概述 AXI 总线协议包括 AXI4AXI4-Lite 和 AXI4-Stream 三类。这些类别均分为主(master)和从(slave)设备,并遵循特定的数据传输方式来进行交互[^2]。 #### AXI4总线通道详解 AXI4总线通道被细分为五种:地址、数据、写地址、写数据以及写响应。每个通道具备自身的 `valid` 与 `ready` 信号用于握手机制,确保数据的可靠传递。 #### 实现DDR3与AXI4接口间的读写操作 对于DDR3内存模块而言,其作为AXI4接口中的从设备工作。当需要执行取或写入命令时,由处理器或其他控制单元扮演的角色即为AXI4接口里的主设备发起请求。 ##### 写操作流程描述 1. 主设备发送写地址至目标位置。 2. 当接收方确认准备好接受新数据后返回ACK应答给发出者。 3. 发送实际要存储的信息包到指定地点。 4. 完成之后再给予一次反馈告知此次事务成功完成。 ##### 操作流程描述 1. 启动器提供所需访问资源的具体定位信息。 2. 若对方能够立即处理,则马上回应准备状态;反之则等待直至条件满足为止。 3. 将所求资料传送给查询源。 4. 结束整个交换过程并清理相关联的状态标记位。 以下是利用Verilog编写的简化版代码片段展示如何通过AXI4接口向DDR3进行基本的读写: ```verilog // Write operation example always @(posedge clk or negedge rst_n) begin : write_process if (!rst_n) axi_awvalid <= 0; else if (state == WRITE_ADDR && !axi_awready) axi_awvalid <= 1; // Assert valid signal when sending address end assign axi_wdata = data_to_write; always @(posedge clk or negedge rst_n) begin : read_process if (!rst_n) axi_arvalid <= 0; else if (state == READ_ADDR && !axi_arready) axi_arvalid <= 1; // Assert valid signal during read request phase end wire [DATA_WIDTH-1:0] received_data = axi_rdata; ``` 上述代码展示了启动写入地址阶段(`WRITE_ADDR`)期间设置有效的标志(axi_awvalid),还有在取地址阶段(`READ_ADDR`)同样设定有效指示(axi_arvalid)[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值