<?xml version="1.0" encoding="gbk"?> <rss version="2.0"><channel> <title>定阅帖子更新</title> <link>http://www.broadkey.com.cn/XML.ASP</link><description>TEAM Board - 意得法电子</description> <copyright>TEAM 2.0.5 Release</copyright><generator>TEAM Board by TEAM5.Cn Studio</generator> <ttl>30</ttl><item><link>http://www.broadkey.com.cn/Thread.asp?tid=100 </link><title>采用FPGA&amp;nbsp;IP实现DDR的读写控制的设计与验证</title><author>lucy</author><pubDate>2009-11-27 12:34:28</pubDate><description><![CDATA[<span class="tpc_content"><font size="2">摘要： 本文采用LatticeXP系列FPGA结合IP解决DDR RAM的读写控制。并且在硬件上面进行了实际测试。<br />
关键词： 嵌入式系统；DDR RAM；FPGA；IP；LattcieXP<br />
<br />
前言<br />
<br />
&nbsp;&nbsp; 随着高速处理器的不断发展，嵌入式系统应用的领域越来越广泛，数字信号处理的规模也越来越大，系统中RAM规模不断增加，比如视频监控、图像数据采集等领域，图像处理的实时性对RAM带宽的要求不断增加，传统的SDRAM在带宽上已经逐渐无法满足应用要求，DDR SDRAM(双倍速率SDRAM)采用在时钟CLK信号的上升和下降沿，双沿做数据传输；比传统的SDRAM只在时钟上升沿传输的方式，传输带宽增加了一倍。DDR RAM已开始广泛应用于嵌入式系统中，正逐步取代传统的SDRAM。<br />
<br />
&nbsp;&nbsp; DDR RAM操作速度的提高，对设计者来说，对控制时序的设计有了更高的要求；并且，DDR内存采用的是支持2.5V电压的SSTL-Ⅱ标准，不再是SDRAM使用的3.3V电压的LVTTL标准。在很多的处理器上面并不带有DDR RAM控制器，这对设计者来说，使用DDR RAM难度增加。往往需要在设计中插入控制器实现微处理器或DSP对存储器的控制。<br />
<br />
&nbsp;&nbsp; 现场可编程门阵列(FPGA)已广泛应用于嵌入式系统中。现在很多FPGA都提供了针对DDR SDRAM的接口特性：其输入输出引脚与SSTL－Ⅱ电气特性兼容，内部提供了DDR触发器、锁相环等硬件资源。使用这些特性，可以比较容易地设计性能可靠的高速DDR RAM控制器。本文针对这一问题，介绍一种采用Lattice FPGA与IP来实现DDR RAM控制和验证的方法。<br />
<br />
LatticeXP<br />
<br />
&nbsp;&nbsp; LatticeXP器件将非易失的FLASH单元和SRAM技术组合在一起，支持瞬间启动和无限可重构的单芯片解决方案。FLASH单元阵列中保存用户配置文件。上电时，配置文件在1毫秒内从FLASH存储器中被传送到配置SRAM中，完成瞬时上电。<br />
<br />
&nbsp;&nbsp; 器件内部分为：PIC (可编程的I/O单元)，非易失的FLASH MEMORY，SYSCONFIG配置端口，PFU(可编程功能单元)，PLL(模拟锁相环)，PFF(非RAM/ROM功能可编程逻辑单元)，EBR(嵌入式RAM块)，JTAG口等几部分(见图1)。<br />
<br />
<br />
<br />
<img border="0" src="http://www.xinworks.com/bbs/attachment/26_15187_808a7e6d710742b.jpg" alt="" /> <br />
图1 LatticeXP内部结构图<br />
<br />
DDR controller IP的生成<br />
<br />
&nbsp;&nbsp; IPExpress是Lattice开发软件中生成IP模块的工具，可根据用户设定的参数生成IP模块，使用非常方便。<br />
<br />
&nbsp;&nbsp; 点击启动IPexpress进入生成界面(见图2)。在左边选取DDR SDRAM工程，在右边设置工程名称和文件保存地址。<br />
<br />
<br />
<br />
<img border="0" src="http://www.xinworks.com/bbs/attachment/26_15187_04b65ec31388fbc.jpg" alt="" /> <br />
图2 IPexpress界面<br />
<br />
&nbsp;&nbsp; 点击下一步，开始进入参数设置(见图3)。这里面进行设置DDR RAM的行、列的参数，以及Bank。这些参数都是根据DDR RAM芯片手册进行设置。本文中采用的DDR RAM颗粒是现代公司的HY5DU561622，16M x16，4bank颗粒。<br />
<br />
<br />
<br />
<img border="0" src="http://www.xinworks.com/bbs/attachment/26_15187_478d311e506e8be.jpg" alt="" /> <br />
图3 DDR RAM的行、列的参数配置<br />
<br />
&nbsp;&nbsp; 下一步，进行时序延时上面的设置(见图4)。<br />
<br />
<br />
<br />
<img border="0" src="http://www.xinworks.com/bbs/attachment/26_15187_c1a05522aee6b5e.jpg" alt="" /> <br />
图4 DDR RAM颗粒时序参数配置<br />
<br />
&nbsp;&nbsp; 在这里设置tRAC(行访问周期，RAS Access Cycle/Delay)、tCAC(列访问周期，CAS Access Cycle/ Delay)等参数。这些参数，在DDR RAM颗粒芯片的手册中都有详细的列表。需要特别指出的是，由于芯片提供商会针对不同的DDR标准，例如DDR400，DDR333等，给出不同的延时参数，会是以ns为单位的几个不同的列表，需要根据设计的不同，参考不同的表格。因为IP生成器中采用的是单一参数设置，单位采用了CLK为单位，这就需要根据设计标准以及时钟频率来转换一下，进行设定。本文采用的是DDR266标准，时钟为133MHz，对应的时钟周期为1/133MHz，大约为7.5ns。这样，芯片在DDR266标准的TRCD为20ns(最小值)，对应到IP的参数中就是3。其他参数也是类似的换算。<br />
<br />
&nbsp;&nbsp; 设置完毕以后，点击generate，可以生成IP代码文件，如图5。<br />
<br />
<br />
<br />
<img border="0" src="http://www.xinworks.com/bbs/attachment/26_15187_a5a0aa21fd6bf2f.jpg" alt="" /> <br />
图5 IP生成<br />
<br />
DDR controller IP的使用与验证<br />
<br />
&nbsp;&nbsp; 生成的DDR Controller IP的接口结构如图6所示。<br />
<br />
<br />
<br />
<img border="0" src="http://www.xinworks.com/bbs/attachment/26_15187_2ad6810618888dc.jpg" alt="" /> <br />
图6 DDR Controller接口<br />
<br />
&nbsp;&nbsp; RAM接口根据信号的定义，对应DDR RAM接口信号。另一端是用户接口，包括复位、时钟、地址、数据、读写、状态信号等。数据通过用户接口送入，通过IP控制时序送到DDR RAM对用的地址当中。<br />
<br />
&nbsp;&nbsp; 对IP的测试，采用数据写入与读出进行校验的方式来实现。测试框图如图7所示。<br />
<br />
<br />
<br />
<img border="0" src="http://www.xinworks.com/bbs/attachment/26_15187_d8785449ea9ed62.jpg" alt="" /> <br />
图7 测试原理框图<br />
<br />
&nbsp;&nbsp; 在FPGA内部做两个RAM区域，用于数据的保存。这里使用FPGA内部的RAM块，做了两块256&times;32b大小的RAM存储区。编写FPGA代码，做一个简单的伪随机序列发生器，通过简单的异或算法，产生32位随机数据序列。产生的数据存入其中一块RAM当中，同时也送到IP的用户接口端，写入DDR RAM。<br />
<br />
&nbsp;&nbsp; 在256深度的存储区域写满以后，开始从DDR RAM回读数据。并把读取的数据送到FPGA内部另外一块RAM当中。两块RAM中对用地址的数据作比较。如果数据一致，说明DDR RAM读写正常；如果不同，说明DDR RAM读写操作有错误。<br />
<br />
&nbsp;&nbsp; 由于本设计采用的是DIMM内存条512Mb容量，因此测试时，数据地址采用基址加变址的方式。每一次测试256&times;32b的数据完成后，循环进入下一次测试时，将起始基地址加256，再进行数据操作。这样最终完整可以扫描512M的数据地址空间，使测试更加完整。这种测试的方法，采用小块地址，多次操作，可以减少FPGA内部RAM的使用量。<br />
<br />
&nbsp;&nbsp; 本文中编写的测试代码采用Verilog语言编写，逻辑如图8。<br />
<br />
<br />
<br />
<img border="0" src="http://www.xinworks.com/bbs/attachment/26_15187_ec1d20f1ebf0acb.jpg" alt="" /> <br />
图8 测试代码逻辑状态机<br />
<br />
硬件测试结果<br />
<br />
&nbsp;&nbsp; 本实验是在Lattice的XP advanced版demo板上进行的。<br />
<br />
&nbsp;&nbsp; 采用的FPGA为LFXP10C-5F384，内存条为Kingston 512M笔记本内存条，RAM颗粒为现代HY5DU561622。测试DDR266连续运行2小时，数据无异常,DDR读写操作完全正常。<br />
<br />
结语<br />
<br />
&nbsp;&nbsp; 在嵌入式系统中应用DDR RAM的越来越多，在设计当中采用FPGA，不仅设计灵活，而且还可以将周边的数字器件综合设计进入FPGA，大大提高系统设计的性价比。</font><br />
</span>]]></description></item></channel></rss>