Quartusii 中ddr2 IP核例化 调试

来源:互联网 发布:淘宝安全中心网页 编辑:程序博客网 时间:2024/06/14 13:28

quartsuii 版本:15.0
fpga器件:Cyclone iv
ddr2器件:MT47H64M16HR-3E

本文介绍Cyclone iv芯片外接2片位宽为16,容量1G的ddr2 ,利用例化ddr2 ip核进行调试的过程。
2片位宽为16的ddr2并联使用,相当于1片位宽为32位,容量为2G的ddr2。
一、新建工程
新建一个名为ddr2_test的工程。下图是顶层文件的端口,mem开始的都是与外部ddr2相连的管脚,还有一个CLK25M的系统输入时钟。同时新建一个reset_manage文件用来产生复位信号。
这里写图片描述
二、添加ddr2 ip核
1.左键Tools->左键Megawizard Plug-in Manager
这里写图片描述
2. 选择第一个 新建IP核 ,然后点Next
这里写图片描述
3 .选择ddr2 ip核
在红框1处选择 DDR2 SDRAM Controller
在红框2处设置你要保存IP核的路径
在红框3处点击Next 进入IP核 参数设置界面
这里写图片描述
下图就是ddr2 IP核的参数设置窗口。
这里写图片描述
4. Parmameter Settings
4.1Memmory Settings
4.1.1General Settings
(1)Device family:器件系列 我用的cyclone iv 所以此处选择 Cyclone IV E
(2) Speed grade:FPGA速度等级 根据所选fpga芯片选择,此外我用的C8等级,所以 选8
(3)PLL reference clock frequency:PLL锁相环 输入参考时钟,我给ddr2 ip核输入的时钟是25Mhz
(4)Memory clock frequency:ddr2器件的时钟频率,即你想让ddr以多大的时钟运行,此处我设置150M
4.1.2Show in”Memory Preset” list
下图的三个设置,可以不用设置,设置这三个参数 可以帮你进行ddr2型号的筛选。
这里写图片描述
(1)Memory Vendor:存储器厂家,我用的是micron镁光的。
(2)Memory format:存储器类型,该工程用的是分离器件,选Discrete Device
Discrete Device:分离器件,即单片的memory
DIMM:Dual-Inline-Memory-Modules,即双列直插式存储模块。
Unbuffered DIMM: 不带缓存的内存,也就是说在内存条PCB上没有缓存(buffer)或寄存器(register)的内存条。这类内存条主要定位于桌面PC市场,是我们常见的低价内存模组。它的主要工作原理是所有的信号都是从内存控制器直通到DRAM芯片颗粒上,信号传输延迟小性能较高。但也正是这个原因Unbuffered DIMM并不如带寄存器的内存模组工作稳定,因而Unbuffered DIMM一般不在服务器上应用,可以应用在要求不高的桌面PC上。
Registered DIMM: 最常见的内存模块类型。RDIMM使用寄存器,从电力上将内存模块从剩余主板中隔离出来。积极的一方面是,只需更少的电力负载支持,系统能够填充更多RDIMM,支撑内存容量。不好的是缓冲组件增加了对内存转换的延迟,稍微降低了性能并增加了能耗需求。
Maximum memory frequency:存储器最大工作频率,根据ddr2器件的datasheet选定,此处没设置
4.1.3 Selected memory preset
选择存储器参数预设,即根据你选定的ddr2来设置其对应的参数。
首先你可以从Memory Presets 下拉列表框中查找是否有你使用的ddr器件型号,要是有直接单击选中,其对应型号就会出现在Selected memory preset 后面的框中,此时就不用再去修改ddr2的参数了。直接Next进入 PHY Settings项;要是没有找到你使用的ddr器件型号则找一个相近的通过 Modify parameters 去修改对应的参数。该工程中由于没有找到我使用的MT47H64M16HR器件型号,所以我首先选择相近的型号Micron MT47H64M8CB-3,接着点红框2处的Modify parameters..按钮去修改参数。
这里写图片描述
左键Modify parameters..后会出现下面红色框中的窗口
这里写图片描述
这里面有很多的参数,我简单介绍下每个参数的含义吧
(1)Output clock pairs from FPGA:从fpga输出给外部存储器的差分时钟对数,工程中为1对差分对时钟,选1,被两片ddr2公用。
(2)Total Memory chip selects:外接存储器的片选信号个数,此处为1 ,被两片ddr2公用。
(3)Total Memory interface DQ width:外接存储器的DQ位宽,即数据线位宽。工程中用了2片ddr2器件,所以总的DQ是16*2=32bits
(4)Memory burst length:存储器 数据突发长度,即memory一次可以读写的数据(DQ)个数。此处选择4
(5)Memory burst ordering:存储器突发读写数据的顺序,选Sequential 顺序读写。
Interleaved:交叉突发读写顺序,具体方式可以查看ddr2的datasheet里有讲,不常用。
(6)Enable the DLL in the memory devices :是否使能外部存储器里的延迟锁相环DLL。默认,选Yes
(7)Memory drive strength setting:驱动外部存储器强度选择,默认,选Normal
(8)ODT setting:片内终结器,即设置存储器里的ODT阻值大小,下面的链接是介绍ODT的作用的,此处选择50欧 默认。通过mmem_odt信号线控制odt enable/disenable.
http://www.baike.com/wiki/ODT
(9)Memory CAS latency setting:存储器CAS 延迟设置,ddr2器件手册里给的是4,所示设置为4。
(10)Memory additive CAS latency setting:存储器 附加的CAS 延迟设置,选择默认 disabled
(11)Memory Vendor:存储器厂家 选Micron
(12)Memory format:存储器类型,该工程用的是分离器件,选Discrete Device
(13)Maximum memory frequency :存储器最大工作频率,查看ddr2datasheet得到 为333.333Mhz
(14)Column address width:存储器列地址宽度 查看ddr2器件datasheet 为10。
(15)Row address width:存储器行地址宽度 查看ddr2 器件datasheet 为13。
(16)Bank address width:bank 地址宽度,查看ddr2 器件datasheet 为3。
(17)Chip selects per DIMM:DIMM 片选信号位宽 默认为1。
(18) DQ bits per DQS bit:指每一组DQS对应的DQ数据位宽。设为8,即一个DQS 数据选通信号对应8位宽的DQ 数据信号。
(19)Precharge address bit:预充电 地址位宽,在对某一bank 或所有bank进行precharge时,需要选择预充电的地址,当A10位1时,表示对所有bank进行预充电,当A10位0时,对某一bank进行预充电,bank由bank0/1信号线确定,而具体地址就由A0-A9位row地址来选择,所有,此处设为10。
(20)Drive DM pins from FPGA:是否使能从FPGA输出数据掩码信号(DM),选择Yes
(21)tINT:从该参数开始到最后一项 都是设置ddr2读写时的时序参数的,具体值可以从ddr2 器件的datasheet 里找到。具体就不再解释了。
下图就是设置好的参数了。点击OK退出该设置窗口。
这里写图片描述
这里写图片描述
4.2 PHY Settings
该页 保持默认即可,不需要修改。直接点击Next进入下一项设置
这里写图片描述
4.3 Board Settings
板级参数设置,一般不需要修改。这里保持默认值,点击Next进入下一项设置。
这里写图片描述
4.4 Controller Settings
控制器设置,即例化的ddr2 ip里的控制器相关参数设置。
这里写图片描述
(1)Controller Architecture:控制器结构选择,选择 High Performance Controller II,这个比后面的更优化一些,altera 建议能使用 High Performance Controller II就最好使用该结构。High Performance Controller是比较早的控制器了,针对一些老版本使用。
(2)Local-to-Memory Address Mapping:本地到存储器侧 地址映射关系选择。设为 CHIP-BANK-ROW-COL。本工程使用的memory芯片个数是1个(虽然是外接了2片ddr2 ,但是都是接在同一个片选信号上的,2片16位宽的ddr2相当于一片32位宽的ddr2使用 ),所以CHIP的地址没有用到,BANK是3位宽,memory的行ROW是13位宽,列宽Column是10位。这样在存储器侧的地址位宽是3+13+10,数据位宽是32位,而在控制器侧数据位宽是64位,所以地址位宽就为25位。映射关系为[24:22]对应bank地址,[21:9]对于ROW行地址,[8:0]对应Column列地址。这样 ,比如控制器侧写一个64位的数据,地址是25’d0,则在存储器侧,由于一个位置只能存储32位宽数据,则需要把这个64位的数据分别存放在26’d0 和26’d1两个位置。
(3)Local Maximum Burst Count:本地控制器最大读写突发长度设置,设为64,这样一次就能最多连续读写64个 64位宽的数据了。
5.EDA
红框1处:是否生成仿真模型。如果对ddr2 ip核进行仿真,需勾选此项用于生成ddr仿真模型。
红框1处:是否生成网表。用于第三方EDA综合工具使用。
默认两处都不用勾选,点击Next
这里写图片描述
6.Summary
选择需要生成的文件,保持默认选择就行。点击Finish 完成ddr2 IP核的例化。
这里写图片描述
三、例化ddr2 IP核
新建ddr2_rcvsend文件,用于进行ddr2的读写操作,同时在该文件中例化ddr2 ip核,例化出的模块如下图所示。在控制器侧读写数据的时钟就是phy_clk输出的150Mhz时钟信号。
这里写图片描述
四、设置memory管脚约束
将所有文件都编写好后,进行综合,综合后设置memory 管脚电平。有两种方法:
(1)打开Pin planner,手动设置与memory 相连管脚的电平。

(2)左键Tools ->左键Tcl scripts 弹出下面的窗口
左键选择 红框1 ,然后点击红框2处的Run,运行ddr的管脚分配脚本,自动完成与memory相连管脚的电平设置。
这里写图片描述
下图是设置好的ddr2 管脚
这里写图片描述
这里写图片描述
这里写图片描述
五、添加ddr2时序约束
例化ddr2 IP核成功后,会生成ddr2 ip核的时序约束,需要把其添加到工程中,
左键Assingments->左键Settings->左键TimeQuest Timing Analyzer,进入下面的界面
这里写图片描述
点击… 添加_phy_ddr_timing.sdc 约束文件,找到后点击add按钮 进行添加。
这里写图片描述
添加后,点击Apply,OK按钮退出。
这里写图片描述
六、全编译及波形抓取
全编译通过后,下载到FPGA板子上,用signaltapII 抓取读写时序并显示读写数据速率(单位bps)。
读写速率大概在3.8Gbps
这里是连续写24个64位宽数据,然后读出,比较第一个64位是否相同。不相同则false_cnt加1 ,表示读写数据不一样,有错误。
这里写图片描述
注意 看下图的两个圈起来的地方,写入数据时,当local_ready为高时,表示可以进行读写操作,此时在下一个时钟周期上升沿发送写请求,发送写请求时,local_ready拉低,所以,写请求必须保持到local_ready为高时,才能在下一个周期去拉低。读操作时也一样。
这里写图片描述

下面两个截图是我在ddr2 HPC User Guide 上找到的写,读请求和local_ready间的关系。概括就两个意思
(1)local_ready拉高,表示控制器接受了用户发送的读写请求,这样可以在下个时钟周期开始又一次的读写请求;
(2)当发送了读写请求后,此时local_ready变为低,则写请求,地址信号,burstbegin等必须维持到local_ready为高,后才能拉低,否则写无效。
这里写图片描述
这里写图片描述

下面两个图是ddr2 HPC User Guide上给出的ddr2 full-rate 写和读操作的时序图,使用时,主要是看local interface 部分的信号波形。
这里写图片描述
这里写图片描述

原创粉丝点击