9.6.1 DDR SDRAM工作原理
DDR SDRAM是Double Data Rate SDRAM的缩写,是双倍速率同步动态随机存储器的意思。DDR SDRAM是在SDR SDRAM内存基础上发展而来的,SDR SDRAM在一个时钟周期内只传输一次数据,它是在时钟的上升期进行数据传输;而DDRSDRAM则在时钟的上升和下降沿都可传输数据,因此传输数据的等效频率是工作频率的两倍。
DDR SDRAM使用了DLL(Delay Locked Loop,延时锁定回路提供一个数据滤波信号)技术,当数据有效时,存储控制器可使用这个数据滤波信号来精确定位数据,每16次输出1次,并重新同步来自不同存储器模块的数据。DDR SDRAM采用的是支持2.5V电压的SSTL2标准,而不是SDR SDRAM使用的3.3V电压的LVTTL标准。
DDR SDRAM芯片的主要供货商包括:美光(Micron)、三星(Sungsang)、现代(Hynix)等。开发板上的DDR芯片型号为Micron公司的MT46V16M16TG-75(注:不同厂家DDR SDRAM的芯片管脚的功能定义都是兼容的)。
DDR SDRAM也是利用内部电容的电荷来记忆数据信息的,但电容的电荷会随着时间而泄露,所以要在数据信息变得难以辨认之前完成数据刷新(更新),也即将数据读出(但并不送到芯片管脚上)再写入,其一般是周期性的,整个存储器进行一次刷新的时间间隔为刷新周期。在刷新期间,不允许进行数据的读写操作。SDRAM的存储体是按照行列组织的二维矩阵,而刷新操作按行进行,每次对一行的数据同时读出、放大、整形和再写入。根据标准规定,DDR SDRAM的每一行都必须在64ms以内刷新一次。DDR SDRAM有自动刷新和自刷新两种刷新模式,且在每次突发读取时,都会自动预充电。DDR SDRAM芯片在上电后必须由一个初始化操作来配置DDR SDRAM的模式寄存器,模式寄存器的设置决定了DDR SDRAM的刷新模式。
9.6.2 DDR SDRAM控制器的EDK实现
1.DDR SDRAM控制器的基本要求
内存控制器的功能是监督控制数据从内存载入/载出,并对数据的完整性进行检测。一般来讲,DDR控制器的开发难度是比较大的,其基本要求有:
- 可配置的数据突发长度2、4、8;
- 可配置的CAS等待时间1. 5、2、2. 5、3;
- 支持的DDR SDRAM命令包括:设置模式寄存器(LOAD_MR) 、自动刷新(AUTO_REFRESH)、预充电(PRECHARGE)、活(ACTIVE)、自动预充读(READA)、自动预充写(WR ITEA)、突发停止(BURST_STOP)、空操作(NOP);
- 接口速率大于等于50MHz,双倍数据速率;
2.DDR SDRAM控制器的EDK实现
Xilinx的EDK开发环境中,提供了DDR SDRAM的控制器IP Core,可以让用户在短短几分钟之内完成DDR控制器的开发,极大地节约了研发周期。下面用一个实例在详细说明EDK平台上快速开发SDRAM控制器的步骤和软硬件调试方法。
例9-15 在Spartan 3E Starter开发板上,利用EDK实现DDR SDRAM接口控制器的软、硬件平台。
1)运行ISE9.1,利用BSB向导建立新的工程,如图9-136所示。

图9-136 利用EDK建立新的工程 图9-137 输入EDK工程路径示意图
2)单击“OK”按键,输入工程目录,如图9-137所示。
3)单击“OK”按键,进入BSB配置页面,选择新建工程选项,如图9-138所示。

图9-138 BSB建立工程示意图
4)单击“Next”按键,进入电路板选择界面,在“Select board”栏选择“I would like to creat a system for the following board”;“Board Vendor”下拉框中选择Xilinx;“Board name”下拉框选择“Spartan-3E Starter Board”;“Board revision”下拉框中选择D,如图9-139所示。

图9-139 开发板选择界面
5)单击“Next”按键,进入处理器选择界面,如图9-140所示。Spartan 3E系列FPGA只能选择MicroBlaze软核处理器。

图9-140 处理器选择界面

图9-141 处理器配置界面
6)单击“Next”按键,进入处理器配置页面。处理器时钟设为50MHz,使能片上调试模块(On-chip H/W debug module),片上存储器(Local memory)配为8kB,如图9-141所示。
7)单击“Next”按键,进入处理器IO配置页面。其中外部IO配置页面总共有3页,如图9-142到图9-144所示。第1页包括RS232_DCE、RS232_DTE、LED_8Bit等外设;第二页有DIP_Switches_4Bits、Buttons_4Bit以及FLASH_16Mx8等外设;第三页包括DDR_SDRAM_32Mx16、Ethernet_MAC、DMA等外设。IO设备都是引到芯片实际的管脚上的,和电路板的设计是一致的。由于ISE 9.1中自带了Spartan 3E开发板的外设,因此不需要用户修改,全部采用默认值。
8)单击“Next”按键,进入处理器外设配置页面,如图9-145所示。IO列表添加的是通用的硬件驱动模块,且Xilinx提供了相应的驱动,直接使用即可,而外设的底层硬件驱动则需要用户自己开发。由于开发板上的接口电路都是IO设备,因此没有外设。

图9-142 IO接口配置界面(1)

图9-143 IO接口配置界面(2)

图9-144 IO接口配置界面(3)

图9-145 外设配置界面
9)单击“Next”按键,进入处理器软件建立页面,选择RS232_DCE作为标准的输入、输出端口;“Boot Memory”下拉框选择ilmb_cntlr;示例程序Memory test和Peripheral selftest都选中,如图9-146所示。

图9-146 软件建立界面

图9-147 示例程序Memory test映射配置界面
10)单击“Next”按键,进入示例程序Memory test的映射配置界面,将其指令空间、数据空间、堆栈空间都映射到DDR_SDRAM中,如图9-147所示。
11)单击“Next”按键,进入示例程序Peripheral selftest的映射配置界面,将其指令空间、数据空间、堆栈空间都映射到DDR_SDRAM中,如图9-148所示。

图9-148 示例程序Peripheral selftest映射配置界面

图9-149 系统创建页面
12)单击“Next”按键进入系统创建页面,该页面显示了处理器的系统参数、所有外设的地址以及LMB总线的特点,如图9-149所示。单击“Generate”按键,即可完成整个系统的配置的生成。
13)添加DDR SDRAM控制器
硬件平台建成后,下一步就是在总线上添加控制器的IP Core。直接将工程信息面板的IP Catalog页面Memory Controller目录下的OPB DDR SDRAM Controller拖到组建面板中,挂到OPB总线即可。
之后,需要生成外设地址。由于开发板的外设地址是直接生成的,直接在工程信息区域的Project页面的Project Files目录下的mhs文件中查阅。其关于DDR外设的地址为:
PARAMETER C_MEM0_BASEADDR = 0x44000000
PARAMETER C_MEM0_HIGHADDR = 0x47ffffff
其中,PARAMETER C_MEM0_BASEADDR是DDR SDRAM外设的基地址,PARAMETER C_MEM0_HIGHADDR是DDR SDRAM外设的高地址。外设的地址范围对于访问外设等操作是非常重要的。
14)查看/修改UCF文件
双击XPS中工程信息区域的Project页面的Project Files目录下的UCF File,可看到DDR SDRAM接口控制器的管脚和电平约束文件,部分约束如图9-150所示。

图9-150 DDR SDRAM控制器UCF文件局部示意图
如前所示,ISE软件中包含了Xilinx开发板的板级开发包,因此会自动生成UCF文件。如果选择用户自定义电路板,则UCF文件是空的,需要用户添加,这是用户在开发自定义电路板DDR SDRAM控制器唯一的手动任务。需要注意的是:在EDK生成的DDR SDRAM控制器中,地址总线和数据总线下标是逆序的,如IP Core数据总线下标为0的信号线,对应着实际芯片数据总线的最高位。
15)综合硬件平台
修改完UCF文件后,可以综合硬件平台,点击“Hardware”菜单下的“Generate Netlist”命令,XPS开始硬件平台构建。在综合时,XPS右下角浅蓝色圆图标一直在转动,并在输出窗口输出相关的综合指示信息。
综合完成后,再点击“Hardware”菜单下的“Generate Bitstream”命令,生成硬件配置比特流。
16)添加/编译测试代码
在创建工程时,选择添加示例程序Memory test,因此XPS会提供存储器的测试代码。在XPS中工程信息区域的Applications页面中的Project:TestAPP_Memory工程上单击右键,选中“Mark to initialize BRAMs”,将其设定为片内初始化应用。
双击打开该应用Source目录下的TestAPP_Memory.c,可看到XPS自动生成的测试代码。如果用户计算机具有串口接口,则不用修改原文件;否则需要修改原文件,添加头文件#include "xio.h",并在main()函数体的第一行加入以下简单的代码:
int i = 0;
int j = 0;
while(1)
{XIo_Out16(XPAR_DDR_SDRAM_32MX16_MEM0_BASEADDR + i, i);
j = XIo_In16(XPAR_DDR_SDRAM_32MX16_MEM0_BASEADDR + i);
i = i + 1;}
在工程上点击右键,选择Build Project命令,编译软件代码。编译完成后,XPS输出窗口会给出图9-151所示的指示信息。

图9-151 编译输出结果示意图
编译无误后,点击“Device Configuration”菜单下的Updata Bitstream命令,将软件比特流和硬件比特流合而为一。
9.6.3 DDR SDRAM控制器的调试
完成DDR SDRAM控制器的软、硬件开发后,接下来的任务就是调试。本节基于没有串口计算机的场景来介绍控制器的在线调试方法。
1.比特流下载
选择“Device Configuration > Download Bitstream”菜单命令,对FPGA芯片进行编程,执行了配置命令后,XPS会调用iMPACT程序完成边界扫描和下载,配置成功后,在信息输出窗口将输出图9-152所示的内容。

图9-152 配置成功输出信息示意图
2. 连接XMD
1)点击“Debug”菜单中的“L unch XMD”命令。XPS会启动GDB服务,并自动连接到硬件板。默认的连接id号为“0”,TCP端口为“1234”。点击“Debug”菜单中的“Launch Software Debugger”命令,则会弹出如图9-153所示的工程选择对话框。选择“TestApp_Memory”,点击“OK”按键。

图9-153 测试软件工程选择界面
2)XPS会弹出用于调试的“Source Window”对话框,如图9-154所示。点击 图标,连接目标工程,即可弹出与目标板的连接对话框,直接点击“OK”即可进入调试模式。

图9-154 源代码调试界面
3.在线调试
最后即可通过点击 图标来完成单步调试,点击 图标查看本地变量。多次点击调试内容,可发现j的值永远比i的值小1,这和程序本意是一样的,如图9-155所示。说明DDR控制器工作完全正常。

图9-155 DDR控制器调试结果示意图
9.7 本章小结
EDK是Xilinx公司在嵌入式系统领域的完整解决方案,包括开发软件、PowerPC硬件处理器核、Xilinx MicroBlaze软处理器核以及进行Xilinx平台FPGA设计时所需的技术文档和IP Core。本章首先首先介绍了EDK系统的组成,软、硬核处理器的架构;其次介绍了EDK软件的安装、基本设计流程和文件管理结构;接着介绍了XPS软件的基本操作和高级操作,包括XPS启动、创建新工程、加入IP Core、定制用户外设、软件输入、系统仿真、各类在线调试手段和软件平台SDK;最后通过一个DDR SDRAM控制器的实例将本章大部分内容串联起来。通过本章的学习,希望读者具备EDK开发的基本技能。


