zynq无法读取内存

使用vivado2017.4,在BD设计中用zynq7 IP核的M_AXI_GP0接口连接了一系列的寄存器并且都分配了地址,想通过AXI4_LITE总线去配置

img

img

相关的地址宏定义也能在xparameters.h文件中正常生成

img

构想利用Xil_Out32 ()函数直接对地址写数据来做配置,如下图

img

但是发现无法运行,经过调试之后,发现GP0连接的部分地址无法读取,用调试的memory窗口打开,有几个能正常显示内存数据,其他的都提示target request failed:unable to read memory

img

在运行到这些不能读取地址的时候,Xil_Out32 ()函数就会挂起报错

img

有一个奇怪的现象,假如A地址有效B地址无效,我在memory中先打开A的地址,可以看到A地址的数据,再添加B地址,B提示无法读取内存;但是假如先打开B的地址,提示无法读取后再添加A的地址,连A的地址也会一块无法读取。

使用的板子是ZC706

这个问题可能是由于寄存器地址映射错误或者访问权限问题引起的。如果你使用 IP核生成的 AXI总线 包含的寄存器无法被正确访问, 你可以尝试以下几种方法:

确定寄存器地址映射表是否正确
在Vivado中确认各个寄存器的地址映射表是否正确, 特别是AXI总线的地址映射表和PL与PS之间的地址映射。你可以在BD视图中查看内存地址并确认地址映射表是否正确。如果地址映射表设置错误,可能导致某些地址无法读取。

确保访问权限正确
如果显示“target request failed: unable to read memory”,可能是由于访问权限不正确引起的。你需要仔细检查访问权限,特别是如果这些地址位于PL端,需要配置访问权限以允许PS端正确访问。在PS端,需要使用 Xil_Out32()函数来设置S_AXI_HP0和S_AXI_HP1的地址范围,并在PS中使用M_AXI_GP0接口进行寄存器读取或写入。

检查PL和PS之间的连接
在有些情况下,这个问题可能是由于PL和PS之间的连接不正确或者PL和PS之间的通信出现问题引起的。你需要检查连接是否正确以及通信是否正常。另外,还应该检查DDR或其他外设是否正常工作,并确认访问这些地址时没有发生访问异常或总线错误。

此外,你可以尝试使用 XADC等其他AXI从设备进行访问检查,并确认读写过程中没有出现任何异常。

  1. 内存读写权限问题:请确保程序中访问内存的地址有读写权限。如果是操作系统,则需要确认内存的权限是否被设置正确。
  2. 内存条损坏:使用一些内存测试工具对内存进行测试,观察是否存在内存硬件故障问题。
  3. 驱动程序问题:检查驱动程序是否正确安装并且可用,检查驱动程序是否与操作系统和硬件兼容。
  4. 内存地址越界访问:请检查访问的内存地址是否正确。如果存在地址越界的情况,应该修正程序,避免出现问题。
  5. 设备保护模式:某些设备会对访问它们的程序进行保护,如果需要访问它们,那么需要确保相应的保护模式被打开。

希望以上解决方案能够解决您的问题。