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文件用来产生复位信号。
Quartusii 中ddr2 IP核例化 调试
二、添加ddr2 ip核
1.左键Tools->左键Megawizard Plug-in Manager
Quartusii 中ddr2 IP核例化 调试
2. 选择第一个 新建IP核 ,然后点Next
Quartusii 中ddr2 IP核例化 调试
3 .选择ddr2 ip核
在红框1处选择 DDR2 SDRAM Controller
在红框2处设置你要保存IP核的路径
在红框3处点击Next 进入IP核 参数设置界面
Quartusii 中ddr2 IP核例化 调试
下图就是ddr2 IP核的参数设置窗口。
Quartusii 中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型号的筛选。
Quartusii 中ddr2 IP核例化 调试
(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..按钮去修改参数。
Quartusii 中ddr2 IP核例化 调试
左键Modify parameters..后会出现下面红色框中的窗口
Quartusii 中ddr2 IP核例化 调试
这里面有很多的参数,我简单介绍下每个参数的含义吧
(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退出该设置窗口。
Quartusii 中ddr2 IP核例化 调试
Quartusii 中ddr2 IP核例化 调试
4.2 PHY Settings
该页 保持默认即可,不需要修改。直接点击Next进入下一项设置
Quartusii 中ddr2 IP核例化 调试
4.3 Board Settings
板级参数设置,一般不需要修改。这里保持默认值,点击Next进入下一项设置。
Quartusii 中ddr2 IP核例化 调试
4.4 Controller Settings
控制器设置,即例化的ddr2 ip里的控制器相关参数设置。
Quartusii 中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
Quartusii 中ddr2 IP核例化 调试
6.Summary
选择需要生成的文件,保持默认选择就行。点击Finish 完成ddr2 IP核的例化。
Quartusii 中ddr2 IP核例化 调试
三、例化ddr2 IP核
新建ddr2_rcvsend文件,用于进行ddr2的读写操作,同时在该文件中例化ddr2 ip核,例化出的模块如下图所示。在控制器侧读写数据的时钟就是phy_clk输出的150Mhz时钟信号。
Quartusii 中ddr2 IP核例化 调试
四、设置memory管脚约束
将所有文件都编写好后,进行综合,综合后设置memory 管脚电平。有两种方法:
(1)打开Pin planner,手动设置与memory 相连管脚的电平。

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

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

下面两个图是ddr2 HPC User Guide上给出的ddr2 full-rate 写和读操作的时序图,使用时,主要是看local interface 部分的信号波形。
Quartusii 中ddr2 IP核例化 调试
Quartusii 中ddr2 IP核例化 调试

相关文章:

  • 2022-12-23
  • 2021-09-01
  • 2022-12-23
  • 2021-08-11
  • 2021-09-26
  • 2021-10-29
  • 2021-04-12
猜你喜欢
  • 2021-05-12
  • 2021-04-03
  • 2022-12-23
  • 2022-12-23
  • 2021-09-25
  • 2021-04-20
相关资源
相似解决方案