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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM