[X]关闭

【ZYNQ-7000开发之六】使用PS控制DDR3的读写

文档创建者:RZJM
浏览次数:13452
最后更新:2017-06-05
 
本帖最后由 RZJM 于 2015-12-26 18:41 编辑

本编文章的目的主要用简明的方法对DDR3进行读写,当然这种方式每次读写都需要CPU干预,效率是比较低的,但是这是学习的过程吧。传输速率不高的应用可以使用这种方法。

本系列文章尽可能的让每一个实验都相对独立,过程尽可能保证完整性,保证实验的可重现性。 但是用到的模块或者IP的具体作用和用法不保证都重复详细的介绍。

本文所使用的开发板是Miz702(兼容zedboard)
PC 开发环境版本:Vivado 2015.2 Xilinx SDK 2015.2

生成硬件系统新建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 bitsteamFile -> 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);  //写数据,一个地址存4个字节,所以i*4
    }
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




发表评论已发布 8

uisrc

发表于 2015-12-25 20:08:17 | 显示全部楼层

越努力越幸运!加油!
回复

使用道具 举报

宋桓公

发表于 2015-12-26 11:56:26 | 显示全部楼层

不错~~学习了~~

贾文洋

发表于 2015-12-28 22:06:41 | 显示全部楼层

DDR读写
回复

使用道具 举报

yukang1744

发表于 2016-3-3 18:58:07 | 显示全部楼层

请教楼主一个问题:
公司的板子用2块IS43TR16256A(256Mx16)扩展32bit,我malloc 1M空间,返回地址是0(没申请到内存)。明明有好几百兆内存,为什么申请内存会失败?是不是SDK哪里需要设置?

miaoguoqiang

发表于 2016-5-13 21:31:47 | 显示全部楼层

这些都是裸机编程吗

RZJM

发表于 2016-6-1 22:48:28 | 显示全部楼层

miaoguoqiang 发表于 2016-5-13 21:31
这些都是裸机编程吗

是( ⊙ o ⊙ )啊!

RZJM

发表于 2016-6-1 22:48:56 | 显示全部楼层

yukang1744 发表于 2016-3-3 18:58
请教楼主一个问题:
公司的板子用2块IS43TR16256A(256Mx16)扩展32bit,我malloc 1M空间,返回地址是0( ...

不晓得呀

THU2301

发表于 2017-6-5 22:37:10 | 显示全部楼层

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则