ZYNQ OCM 操作 低256kB与高256kB的模式切换方法

1、zynq ocm地址分配如下图所示,在默认状态下256kB的OCM分布在如下地址空间;

  0000_0000  -0000_ffff       64kB

  0001_0000  -0001_ffff  64KB

  0002_0000  -0002_ffff  64KB

  ffff_0000  -ffff_ffff    64KB

 

 

 2、如何设置ocm 高地址

通过4位的slcr.OCM_CFG[RAM_HI],以4个独立的64KB区域的粒度,将256KB RAM阵列映射到低地址范围(0x0000_0000~0x0003_FFFF),或者高地址范围(0xFFFC_0000~0xFFFF_FFFF);

 

 

 UG585中关于设置的寄存器如上所示slcr.OCM_CFG[RAM_HI] 设置 1111,

具体在SDK操作了一下,c代码如下

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xil_misc_psreset_api.h"
#include "xil_io.h"

int main()
{uint a,b;
init_platform();
Xil_DCacheDisable();
Xil_ICacheDisable();
/* Unlock the slcr register access lock */
Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE);
a = Xil_In32(0xF8000910);
Xil_Out32(0xF8000910, 0x1f);
a = Xil_In32(0xF8000910);

b = Xil_In32(0xF8F00000);
Xil_Out32(0xF8F00000,(0xfffffffd & b) + 0x2);
b = Xil_In32(0xF8F00000);


Xil_Out32(0xF8f00040,0x00100000);
Xil_Out32(0xF8F00044,0xFFE00000);
while(1);

cleanup_platform();
return 0;
}

其中下面这个代码是打开slcr寄存器,一开始没有找到这个语句,所以在写0xF8000910这个寄存器的时候只能读,不能写,

/* Unlock the slcr register access lock */
Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE);

 

 

 

我验证了一下,不需要在BD里面使能HIGH_OCM同样可以操作,如下图所示AXI write back =2'b00,说明可以操作

 

 同时在SDK中查看mem数据与PL通过AXI4写入的数据一样,证明了成功操作HIGH_OCM

 

 

原文地址:https://www.cnblogs.com/wangyabin121/p/12745581.html