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