大家好,
我在使用V5芯片控制DDR2模组SODIMM,使用MIG生成控制核,使用用户接口进行数据读写。大家知道,写地址和写数据MIG生成的接口是两个FIFO,对其操作就可以了,我的问题出现在读数据上。
MIG对读取的数据的接口只有一个rd_data_valid信号和一组rd_data_out数据线,当我在地址FIFO里写入地址和读命令之后,过一段时间 T 之后,读出的数据才在数据线上产生,而因为只有读有效和读数据线,所以在数据线上的数据不及时读走就会丢失了。
比如我把读出的数据存入FIFO,但这个FIFO前端并没有很快的把数据读走,那么如果一次从DDR里读出很多数的话,这个FIFO就有可能会满,如果它满了的话,在DDR2的读数据线上的数据就会丢失,但是如果满的时候就不去往DDR地址FIFO里写地址和写命令的话,由于写入地址及命令到DDR数据出来的时延 T 的存在,导致停时送地址命令时,DDR还会出来一部分数据,再而且,T 值是不确定的(我仿真时有32clocks和1000多clocks的情况),导致我没法提前空出一段FIFO空间报FIFO满来控制地址及命令的写入。
不知道大家有没有比较好的解决办法。
我现在唯一想到的就是给FIFO深度大小那么多的地址和命令,然后等数据全读出来了,在给下一组地址命令去读DDR。但是这样比较浪费时间,每次都要等 T 时间。
谢谢大家。
关于V5的DDR2核用户接口读数接口的问题
关键词: 关于 用户 接口 读数 问题 数据 地址
你好,我也在用ddr2在v5上进行调试,读写都满足时序,但是数据读出来以后,ra_valid信号始终无效,不知道怎么回事?读出的数据和给读的地址是存在一个延迟的,我的邮箱是strongbbc@126.com,希望 能交流一下
谢谢你的回复!
init_done已经完成,检测到由0到1的变化过程;
仿真那块没有去做,仿真的时候没有加DDR原型,仅仅把IP控制器还有DCM模块加进去的,只是观察那几个时钟信号的时序关系的时候用的。
大部分都是直接在v5开发板上调试的,因为原来这个是师兄在做,现在已经毕业,留给我的时候,工程已经建好,就让我一直在开发板上调试的,交给我的时候也只是看到init_done由0到1的变化。
让我接着完成和其他模块的接口设计,现在我读写这一块还没有通过,问题就是写进去的数据在读出的时候不稳定,原来我对app_wdf_data,144位的我只对低32位赋值的时候结果大部分都是只有一两个数据是错误的,也会有完全正确的时候,数据感觉不稳定。后来对144位都赋值的时候基本上都是错误的了,也就是每个数据出错的位数都很多。
有一个情况,需要说明一下,不知道是不是这个原因。我用的这个DDR2和生成IP控制器的型号不是完全一致的。
生成IP控制器的是MT的,板子上的是W开头的,型号记不清了,不是通用的那种,是带有ECC校验的,512M的内存条,9片,数据64+校验8。生成IP控制器的时候已经ECC使能无效了。
这方面还没有经验,希望能得到你的帮助,谢谢!
回复besomeone【4楼】:
总结一下你的问题:
1,DDR初始化已完成,但读数出的数与写入的不同,错误较多;
2,MIG的device选的不是目标DDR,是否有影响?
使用不同device的时候有没有根据你的目标DDR更改参数?如果没有的话会有影响的,会造成读写数不对。如果已经改成正确的参数了,约束有没有按你的实际引脚重新用MIG生成一遍?如果也已经update过了,而且你用的是V5的开发板,应该硬件是没有问题的,那么你的读写逻辑是你自己写的吗?是的话先那MIG生成的example design试一下,看读写是否正确。
另,V5的开发板不是带有美光的SODIMM的吗?那个型号好像可以在MIG理找到。
非常感谢你的回复,你的总结非常准确!上周四已经把回复的内容编辑好的,但是网页崩溃了,内容也没有保存,非常之郁闷,只好再重新编辑;刚试过,验证错误也会内容也会丢失,强烈建议编辑内容在word里面进行!
我对原来生成的IP核参数并不是很了解,后来我自己去调了工程发现,主要设置的参数有:
1.时钟频率,memory type(RDIMMs),memory part(MT9HTF6472XX-53E),数据位宽(72),以及ECC是否使能有效(无效),这些确定以后下面的详细参数也就确定了;
2.就是对突发长度以及突发类型进行设置,此处设置的为顺序突发,长度为4;再者就是没有使用DCM,外部提供。
3.引脚保留以及后面的bank选择都是默认的,我问了师兄。
不知道其他还有没有需要注意的?对于约束中的引脚约束已经按照电路图中的引脚位置一一修改过了,其他的时钟约束貌似没有修改都是默认的,使用的是v5板上的通道1。
对于上面的参数设置,有几个地方需要请教一下:
1.存储器型号这个地方对于72位的有几个选择这里使用的上是MT9HTF6472XX-53E,我问了师兄,他也没有明确说出选择的依据,还有这个你提到的SODIMM和RDIMMs的选择上有什么不同?v5自带的那个是普通的还是带ECC校验的,这些我感觉在交接的时候都没有说清楚。
2.在选择通道上只需要注意引脚的位置指定就可以了吧,其他的控制器部分没有需要设置的地方吧?交给我的时候说要在1通道上进行调试,在0通道上没有调试成功,当然都是针对init_done由0到1的检测结果而言。
3你提到对于修改过的ucf需要进行IP验证,我不明白这个作用,看到你的提醒,我专门问了一下师兄,他也不知道这个操作,但是还是检测到初始化完成标志了。
读写逻辑是我自己写的,时序和datasheet里面的时序是完全一致的,都是在初始化完成以后进行读写,我看过user_design\sim里面的地址模块,对于里面的地址产生原理我没有深入研究,为方便,我对写入的地址是按照31’d1,31’d5,31’d9…这样进行设置的,因为突发长度为4,所以写入的地址的间隔也是4,不知道这样的操作是否有误,但是读出的数据,也是按照一个地址四个数据的模式进行的。
对写入的数据,我原来是按照144’h1111aaaa,也就是只对低32位进行赋值,这样的采样结果是大多数情况只有1到2个数据出错,也有完全正确的情况;后来我对这144位按照示例中的给的数据进行测试,基本上每个数据都有很多位出错。
对chipscope的采样时钟,我是按照信号源的时钟进行采样的。
还有这个这个测试,让我接手的时候就直接在板子上调试的,原来测试的时候也没有加入原型,后来我加入发现初始化也没有完成,担心是不是型号不匹配就没有多管,还是在板上调试。
现在因为没有rd_valid信号有效地标志,所以对想测试一下IP核里面的与rd_valid有关的信号,是一个rst信号,还没有进行。
说的比较多,就是希望能把问题说清楚,谢谢!
1. 模组型号的选择,我说的参数按照你的目标DDR修改就是指这个型号的选择,在选择型号的时候,型号列表里没有你的目标模组的型号的话,要选用一个参数比较相近的型号,作为模板,然后选custom...(具体的名字记不清了)然后根据你的模组的一些具体参数修改那些参数的值。
2. UCF的update,MIG生成的UCF使用的引脚分配是你选择的bank中从上到下按顺序分的,而你的板卡上八成不是这样的,但你不能只是将其生成的UCF中关于location的约束改掉而不管其他的,你需要自己写一个只有location约束的ucf,然后使用MIG的update功能将这个ucf导入,让其重新生成一个根据你的location约束的UCF文件。
3. 你使用的是ML555?SODIMM和RDIMM只是两种不同的模组而已,我用的是SODIMM,封装比较小,就是笔记本内存条。
4. 地址的选用没问题,按burst来就可以了。
5. 推荐你接下来的工作:
1. 将我上面提到的1. 2.两点做好。
2. 生成MIG中使用PLL或者DCM(这样接口比较简单)。
3. 使用MIG生成的example design,他这个设计中包含的就是生成几个数和几个地址,将数写入DDR, 然后再读出来,与写入的对比一下,对不上就将error信号拉高。这个设计调用什么的都已经设计好,你就将example design做为顶层,提供一个200MHz的delay_ctrl时钟和一个操作时钟就可以了,当然DDR的相关接口连上,复位信号连上。
总之,调试要记住用排除法,一步一步来。慢慢找错误。
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |