前面已經詳細介紹了從PL端如何用AXI總線去控制DDR的讀寫,並且從AXI_BRESP的返回值來看,我們也是成功寫入了的。但是沒有通過別的方式來驗證寫入的數據的話,總是感覺差了點什么。
今天試了一把從PS端直接讀取DDR里面的數據,剛好跟PL端寫入的一樣,這下可以放心的認為我們寫入成功了。
還是跟前面說的一樣,在SDK里面使用hello world的模版就可以了。
准備工作:(這部分參考了【ZYNQ-7000開發之六】使用PS控制DDR3的讀寫)
1、DDR3的地址
在mem_demo_bsp->ps7->cortexa9_0的路徑下,打開xparameters_ps.h這個頭文件,這個頭文件是cortexA9可以直接控制的外設地址的宏定義。在里面可以找到DDR的地址,可以看到如下代碼:
/* Canonical definitions for DDR MEMORY */ #define XPAR_DDR_MEM_BASEADDR 0x00000000 #define XPAR_DDR_MEM_HIGHADDR 0x3FFFFFFF
可以看出來,這里的地址也包括了一部分OCM,等會我們要使用這個地址,對DDR3進行讀寫操作。
2、讀寫操作函數
在mem_demo_bsp->ps7->cortexa9_0的路徑下,打開xil_io.h這個頭文件,這個頭文件是cortexA9可以直接控制的內存映射或者映射到了地址空間的IO。在里面可以看到如下代碼:
//從某個地址讀數據 u8 Xil_In8(INTPTR Addr); u16 Xil_In16(INTPTR Addr); u32 Xil_In32(INTPTR Addr); //向某個地址寫數據。 void Xil_Out8(INTPTR Addr, u8 Value); void Xil_Out16(INTPTR Addr, u16 Value); void Xil_Out32(INTPTR Addr, u32 Value);
有了這些就可以簡單的對DDR進行續寫操作了。在這里,我們只嘗試從PL寫入,從PS讀取。(你問我為什么不測試從PS寫入,從PL讀取,因為PL部分的代碼之前已經寫好了,再去綜合一遍太麻煩)
代碼如下:
/* * Copyright (c) 2009-2012 Xilinx, Inc. All rights reserved. * * Xilinx, Inc. * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A * COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS * ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS FOR A PARTICULAR PURPOSE. * */ /* * helloworld.c: simple test application * * This application configures UART 16550 to baud rate 9600. * PS7 UART (Zynq) is not initialized by this application, since * bootrom/bsp configures it to baud rate 115200 * * ------------------------------------------------ * | UART TYPE BAUD RATE | * ------------------------------------------------ * uartns550 9600 * uartlite Configurable only in HW design * ps7_uart 115200 (configured by bootrom/bsp) */ #include <stdio.h> #include "platform.h" #include "xparameters.h" #include "xparameters_ps.h" #include "xil_printf.h" #include "xil_io.h" #define DDR_BASEARDDR XPAR_DDR_MEM_BASEADDR + 0x3ffff000 //只讀取DDR中的一部分數據 #define DDR_HIGHADDR XPAR_DDR_MEM_HIGHADDR //void print(char *str); int main() { init_platform(); int i=0; int rev; print("Hello World\n\r");
while(DDR_BASEARDDR+i*4<DDR_HIGHADDR){ rev = Xil_In32(DDR_BASEARDDR+i*4); xil_printf("the address at %x data is : %d \n\r" ,DDR_BASEARDDR+i*4, rev); ++i; } cleanup_platform(); return 0; }
我是從0x3ffff000開始讀取數據的,當然從開頭讀起來也一樣。接下來看串口返回的部分數據:
完全正確!接下來我要去別的地方悶聲發大財了