一、zynq PS侧系统地址和DDR允许操作地址
二、zynq PL侧地址映射以及读写操作
三、PL读写测试PS DDR3验证
一、zynq PS侧系统地址和DDR允许操作地址
在FPGA项目中,内存DDR3/4的控制读写是基本功。若内存硬件与PL侧相连,意味着内存所有的存储空间都可以由FPGA的PL侧用户逻辑开发使用。但很多时候考虑成本,zynq板块只在PS侧放置一块DDR3/4。对于PL的用户逻辑想使用DDR进行存储,就需要考虑到PS侧的DDR哪些内存空间是可以进行操作的。
从手册ug585中可以看出,0x0010_0000到0x7FFF_FFFF的地址范围,允许互联操作。那么实际上呢?读者通过PS的嵌入式内存地址读取,发现可操作的地址空间存在些许偏差。
在PS侧设备刚上电时候,对地址进行刷新读取,发现在0x00114010之后的地址内容才为0。当然,这个是zynq7020,读者可以自行确认下自己所用板块的ps侧DDR的可用范围,之后开放给PL侧使用。
二、zynq PL侧地址映射以及读写操作
对于PL侧需要搭建基于zynq操作系统的Block Design,下图是笔者的bd框图,在框图中需要在处理器中选择S_AXI_HP接口,同时引入axi_interconnect用于axifull接口的扩展。两路axifull操作,一是ddr3_test用于读写验证;二是串口通过fdma写入带升级BIN文件。
当然,最重要的一点是需要对S_AXI_HP的地址进行映射,此处选择的是全地址,考虑原因是bd上选择的数值通常1G/512M/256M/128M等,选择最大地址,在PL侧逻辑开发时候,注意使用的DDR的操作范围即可。笔者在进行PS侧DDR读写测试时候,选择的起始地址为0x0020_0000,结束地址为3FFF_FE00。
三、PL读写测试PS DDR3验证
设计思路,通过寄存器启动读写测试,同时开发读写测试状态寄存器以及错误计数寄存器。读写启动之后,通过FDMA对设定的地址空间进行写入操作,选中地址并将地址作为数据内容写入,待写入所有地址空间,读取地址内容并与地址进行比对,若错误则计数加一。
设计三个寄存器,基地址0x4000_0000,偏移地址0x0000_2000为启动寄存器,偏移地址0x0000_2004为读写测试状态寄存器,偏移地址0x0000_2008为错误计数寄存器。
借助于QT上位机的串口寄存器读写实现DDR3的读写测试启动以及结果验证。
问题来了,如果仅仅通过寄存器来确认,很多人对此持怀疑态度,那么DDR3中的内容是否写入成功?
笔者借助于PS侧的内存读写,先在启动读写之前进行地址内容的读取,如下:
之后,启动读写测试,然后刷新内存地址,得到:
证明在0x0020_0000到0x3FFF_FE00这段地址内读写测试验证OK。