本編文章的目的主要用簡明的方法對DDR3進行讀寫,當然這種方式每次讀寫都需要CPU干預,效率是比較低的,但是這是學習的過程吧。
本系列文章盡可能的讓每一個實驗都相對獨立,過程盡可能保證完整性,保證實驗的可重現性。 但是用到的模塊或者IP的具體作用和用法不保證都重復詳細的介紹。
本文所使用的開發板是兼容zedboard
PC 開發環境版本:Vivado 2015.4 Xilinx SDK 2015.4
生成硬件系統
新建vivado工程
選擇Zedboard
新建Block Design
添加ZYNQ PS
點擊Run Block Automation,讓vivado自動配置好zedboard相關的默認的信息,點擊OK
雙擊ZYNQ,在此可以去掉一些不用的外設
設置好的Block Design如圖所示
在block design上右擊,選擇Create HDL Wapper
完成后,在block design上右擊,選擇Generate Output Prouducts,在彈出的對話框選擇Generate
點擊Generate Bitstream
完成后,選擇File->Export->Export Hadfware,選中Include bitsteam
File -> Launch SDK,把硬件架構導出到軟件工程
編寫軟件程序
新建Hello工程
DDR3的地址
建好后,在mem_demo_bsp->ps7->cortexa9_0的路徑下,打開xparameters_ps.h這個頭文件,這個頭文件是cortexA9可以直接控制的外設地址的宏定義。在里面可以找到DDR的地址,可以看到如下代碼:
/* Canonical definitions for DDR MEMORY */
#define XPAR_DDR_MEM_BASEADDR 0x00000000U
#define XPAR_DDR_MEM_HIGHADDR 0x3FFFFFFFU
等會我們要使用這個地址,對DDR3進行讀寫操作
讀寫操作函數
在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);
OK,有了這些就可以簡單的對DDR進行續寫操作了
代碼實現
#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 + 0x10000000 int main() { init_platform(); int i; int rev; xil_printf("Hello World\n\r"); for(i=0; i<32; i++) { Xil_Out32(DDR_BASEARDDR+i*4,i); } for(i=0; i<32; i++) { rev = Xil_In32(DDR_BASEARDDR+i*4); xil_printf("the address at %x data is : %x \n\r" ,DDR_BASEARDDR+i*4, rev); } cleanup_platform(); return 0; }
燒寫測試
串口終端的結果如下:
Hello World
the address at 10000000 data is : 0
the address at 10000004 data is : 1
the address at 10000008 data is : 2
the address at 1000000C data is : 3
the address at 10000010 data is : 4
the address at 10000014 data is : 5
the address at 10000018 data is : 6
the address at 1000001C data is : 7
the address at 10000020 data is : 8
the address at 10000024 data is : 9
the address at 10000028 data is : A
the address at 1000002C data is : B
the address at 10000030 data is : C
the address at 10000034 data is : D
the address at 10000038 data is : E
the address at 1000003C data is : F
the address at 10000040 data is : 10
the address at 10000044 data is : 11
the address at 10000048 data is : 12
the address at 1000004C data is : 13
the address at 10000050 data is : 14
the address at 10000054 data is : 15
the address at 10000058 data is : 16
the address at 1000005C data is : 17
the address at 10000060 data is : 18
the address at 10000064 data is : 19
the address at 10000068 data is : 1A
the address at 1000006C data is : 1B
the address at 10000070 data is : 1C
the address at 10000074 data is : 1D
the address at 10000078 data is : 1E
the address at 1000007C data is : 1F