DDR2程序设计方案 联系客服

发布时间 : 星期二 文章DDR2程序设计方案更新完毕开始阅读9cb34272a517866fb84ae45c3b3567ec102ddcf4

DDR2核所需要时钟的生成与DDR2核的修改

在DDR2核的内部也调用了一个锁相环,这个文件名为:ddr2_infrastructure.v 如果顶层模块的时钟直接引入到DDR2核中,会产生一系列的问题,修改如下: 将下图中的两个IBUFG名修改为BUFG。

程序测试及程序改进方案

最开始程序按照读写时序图写入四个地址,8个32位的固定数据。

结果发现在rd_data_valid为1的情况下,只有在clk0_tb为低电平的时候数据是写入的数据,即数据分成了16个小段,在clk0_tb高电平时的数据不稳定,在低电平时,数据稳定下来。 结果如下图所示:

改进1:在clk0_tb的上升沿或下降沿去获取数据,查看数据的稳定性。在查一些资料显示,地址不使用的高位需要置1,改进程序中结果如下图所示:

图中,data_fifo_out_p是在clk0_tb上升沿获取数据,data_fifo_out_n是在clk0_tb下降沿获取数据。如上图所示,在下降沿获取的数据比较稳定。

获取的数据过程中是先写地址,数据是随着rd_data_valid变为高后,数据从rd_data_fifo_out中输出,所以将读写模块中读部分只是写入地址,读数据在顶层进行。同时,为了方便操作,读写模块写数据部分只写一次突发的数据,即64位的数据。为了使读取的数据更加稳定,数据进行两次处理:第一次,在时钟下降沿获取rd_data_fifo_out中的值,名称为data_fifo_out_n,第二次,在时钟上升沿获取data_fifo_n的值,取名为data_fifo_p_ff1,data_fifo_p_ff1为最终获取的稳定数据。结果如下图所示:

测试过程中出现问题及分析

问题1:编译失败,锁相环出现问题。

原因:顶层模块调用了锁相环,DDR2 IP核内部也使用了锁相环,两个锁相

环之间的时钟连接有问题。

解决办法:将DDR2 IP核内部锁相环的时钟输入处的IBUFG修改为BUFG. 结果:可以编译通过。

问题2:phy_init_done未变高。

原因:在分配UCF引脚过程中dm引脚分配出错。 解决办法:查看原理图,修改引脚分配。 结果:phy_init_done拉高。

心得与体会

地址:

DDR2的芯片引脚中,数据线是16位,地址线是13位,bank地址是3位。

在核中有列地址(10位),行地址(13位)与bank地址(3位)。

在DDR2的芯片手册中,提到行地址与列地址是重合的。

在对DDR2芯片操作过程中,发现在地址超过16位时,读回的数据将会从0

地址重新开始读。

从这里可以看出,DDR2的有效地址只有16位,但是如果将app_af_addr的

16位之后的地址拉高,会出现pyh_init_done不拉高情况。

数据:

DDR2芯片引脚中数据线是16位,而核中数据线是32位。

在向DDR2中写入数据时,在时钟的上升沿与下降沿都会写入数据。 因为突发长度为4,所有需要连续写入2个32的数据,才会是4个16位的app_af_addr是无效位是列地址+行地址+bank地址之后的位无效。

数据。

读数据:

在读数据之前,需要写入地址与命令。

之后只需要等待rd_data_valid变为高,然后从rd_data_fifo_out中读取

数据即可。

DDR2所有空间读写正确性验证

第1就是查看chipscope,从chipscope查看数据,数据比较稳定,使用chipscope的触发器,查看一定范围的数据,结果数据正常。

读到的数据可能不稳定,此时需要做一些处理。

在时钟的上升沿与下降沿读数据时,下降沿读到的数据比较稳定。 使用时钟的上升沿再去读下降沿时读到的数据,数据是最稳定的。