详情请见附件
硬件设计参考xilinx官方开发板ML555设计,硬件板子为公司简化版ML555光口板,主控芯片为XILINX公司的VIRTEX5-xc5vlx50t-ff1136,板子支持两组DDR2模块,单个模块由4片MT47H128M8HQ-3IT组成,单片数据位宽为8BIT,4片DDR2组成32bit总位宽.但是FPGA内部实现方式由一片MT47H128M16XX-37E取代两片MT47H128M8HQ-3IT,这样两片MT47H128M8HQ-3IT共用一组控制线,FPGA内部配置的数据宽度为32BIT,由两片MT47H128M16XX-37E实现,具体的硬件电路细节为
时钟2转4
其他控制总线直接一分二,参考电路图即可.
直接例化IPCORE,本设计采用无TESTBENCH,无PLL的方式.系统的结构如下图所示,其中dcm4ddr2为时钟输出模块,内部例化两个DCM ,第一个DCM产生200M时钟,第二个DCM直接输出200M时钟以及其他相关时钟;ddr2_test_control为自定义模块,产生测试信号;ddr2_corgen为系统例化IP.
ISE结构层次
RTL视图
本模块的作用是生成200M时钟,以及用户时钟,以及DDR2所需要的各种相位时钟和复位信号.RTL视图即端口引脚说明,如下图所示
其内部结构如下图所示
所有时钟输出均上BUFG,第二个DCM输出的LOCK信号作为DDR2控制器的复位信号,不过最新版本的UG086推荐使用PLL方式,相信结构会更加精简.
本模块实现对例化IP核的控制.内部由状态机实现对IP核控制信号,读写数据信号,地址信号的输出以及输入数据采集,采用chipscope观察,测试机理为:先对DDR2执行一个burst写操作,然后执行相同地址的同样长度的burst读操作,对比写入的数据是否和读出的数据一致.例程采用的时钟为200M时钟,与DDR2的工作时钟一致,所以没有添加任何FIFO.将来使用时,若用户时钟不为200M时,需要从读写端分别添加两个FIFO实现切换工作.
Step1:是用core gen工具,新建工程,利用MIG模块生成DDR2控制器IP核.选定芯片,以及硬件描述语言
Step2:搜索MIG,并打开MIG,见下图 ,并点击next
Step,本设计例化一个控制器,所以默认选项即可,直接next
Step3:直接next
Step4:直奔主题
Step5:重要的一步,DDR2工作在200M(双沿400M),因此周期选择5000PS,虽然外部的DDR2硬件是8BIT位宽,但是在这里选择的硬件型号却选择为16bit位宽,而用户数据位宽选择32BIT,这样对于FPGA来说相当于两片16bit的芯片组成的存储结构.两片8bit的存储芯片共用控制线.使能MASK功能
Step6:按照下图配置,选择不同的工作模式可以.例程1采用burst4的传输模式,直接在parameter中修改参数即可,这些参数都可变.next
Step7:禁用PLL,下面的差分单端时钟自动变灰,这样,就需要外围时钟产生模块产生单端(FPGA内部的)时钟了,通过查阅UG086文档,推荐使用PLL,这样,1.2.1的内容可以忽略.
Step8:连点两次next,跳到如下界面,本界面支持两种方式的UCF配置,第一支持XILINX推荐的方式,这样的方式显然适合先做FPGA逻辑验证,然后再画PCB板,UCF配置自由灵便,.第二种就是固定模式的,本人此次调试就采用如下模式,直接利用已有资源,读取UCF文件(read ucf file选型),配置信息自动加载进去,稍作修改(INI_DONE,ERROR RST等信号)即可投入使用.见下图
选中FIXED PIN OUT选项,直接next
Step9选中想要的文件后,即可得到下图
点击readucf,并且找到你所需要的UCF文件见下图
点击打开即可得到下图
有几个信号需要你添加IO,
随便填上,先过了这一关,一会UCF生成后再来收拾这些无关紧要的信号
Step10:一路next,直到最后生成.关闭congen
IP核生成的文档结构如下图所示
我们最关心的当属user_design文件夹,rtl中的所有文件是毫无疑问要添加到工程中的,另外一个重要的文件为par文件夹中的ucf文件,前面说过,要做稍微的修改,至于修改哪些视硬件结构而定,例如本应用中只需要一个CS片选即可,那么cs1应当忽略,另外inidone不需要输出,err也不需要输出,应当去掉,DDR2的复位为内部输入,不需要外部输入,因此也去掉,否则综合实现的过程中一定会报错.
这是成功的第一步,如果ini_done一直为低,那后续工作无法开展.
ddr2_test_control模块中一个burst(BL=4)写入内容如下:
Chipscope读出的数据如下图所示从图中可以看出DDR2控制器输出的rd_data_valid与写入的数据一直,调试成功
将BL改为8,写入的内容如下:
Chipscope调试结果如下图所示:
由于看文档的不仔细,在查阅UG086 P384的时候,错误的理解为此时序图为一个burst的传输,实际上该图突发传输了4次,同理P386的读burst也是4次.xinlinx这个地方为什么不写成3次,或者5次,如果是这样,一定不会误导本人….浪费了两天时间..
在看原设计的时候,由于是用vhdl写的,所以看起来很费劲,我只看了RTL视图,原设计RTL视图mask信号浮空不接,因此我在设计中直接将mask置0.后来才知道mask信号的意义.
本应用的DDR2地址参数配置如下:
parameter BANK_WIDTH = 3, // # of memory bank addr bits.
parameter COL_WIDTH = 10, // # of memory column bits.
parameter ROW_WIDTH = 14, // # of memory row and # of addr bits.
parameter CS_WIDTH = 2, // # of total memory chip selects.
按照UG086对于用户接口地址总线的说明,这样实际的地址宽度为2+3+10+14为29bit,未使用的地址应当置1.因此DDR2的地址0对应的地址总线数据为(3’b111,28’d0)
用户1855385 2015-9-22 15:09
用户1846572 2015-7-21 16:43
用户1843184 2015-6-24 18:12
用户1834770 2015-4-13 15:22
用户1821169 2014-11-17 11:17
用户328796 2014-8-28 22:42
用户618509 2014-8-15 15:39
用户377235 2013-11-29 11:08
用户439259 2013-11-28 22:16
用户1614480 2013-10-13 18:26