大家好,
我在使用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 时间。
谢谢大家。
共10条
1/1 1 跳转至页
关于V5的DDR2核用户接口读数接口的问题

关键词: 关于 用户 接口 读数 问题 数据 地址

回复besomeone【4楼】:
总结一下你的问题:
1,DDR初始化已完成,但读数出的数与写入的不同,错误较多;
2,MIG的device选的不是目标DDR,是否有影响?
使用不同device的时候有没有根据你的目标DDR更改参数?如果没有的话会有影响的,会造成读写数不对。如果已经改成正确的参数了,约束有没有按你的实际引脚重新用MIG生成一遍?如果也已经update过了,而且你用的是V5的开发板,应该硬件是没有问题的,那么你的读写逻辑是你自己写的吗?是的话先那MIG生成的example design试一下,看读写是否正确。
另,V5的开发板不是带有美光的SODIMM的吗?那个型号好像可以在MIG理找到。

不好意思这几天没上论坛。
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的相关接口连上,复位信号连上。
总之,调试要记住用排除法,一步一步来。慢慢找错误。
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的相关接口连上,复位信号连上。
总之,调试要记住用排除法,一步一步来。慢慢找错误。

1. 最好使用与数据同源的时钟,或者使用比被采样信号频率高出很多的时钟(适用于有些情况,同源是最好的,但高时钟可采到毛刺等不确定现象),175MHz彩出来如果是8'h55,8'haa的话,那么350MHz彩出来就是8'h55, 8'h55, 8'haa, 8'haa,当然前提是这两个时钟是同相位的,并跟数据同源,不然相位上有偏移有可能会造成采数错误。
2. 前期调试可以单调DDR部分,这样布线资源不紧张,一般这些不用太考虑,将mig生成的约束弄好就可以了,后期项目整合看情况约束。
3. 你指的是底层的DQ信号么?没有抓过,不太清楚。
4. 读命令就是001吧?你再看看datasheet,你不需要写读写逻辑,直接使用examlpe就可以了,他写的肯定是对的,先不要增加你自己都不确定对不对的东西上去,那样错了都不知道哪里的问题。
2. 前期调试可以单调DDR部分,这样布线资源不紧张,一般这些不用太考虑,将mig生成的约束弄好就可以了,后期项目整合看情况约束。
3. 你指的是底层的DQ信号么?没有抓过,不太清楚。
4. 读命令就是001吧?你再看看datasheet,你不需要写读写逻辑,直接使用examlpe就可以了,他写的肯定是对的,先不要增加你自己都不确定对不对的东西上去,那样错了都不知道哪里的问题。

sim.exe是xilinx写好的一个程式,其实生成的核你什么都不用动,直接用点sim或者用sim.do就可以仿真了,不过我用过的MIG2.3生成的时候没有DDRII模型,需要自己去下一个来,其他的可以都不用动,
仿真的GUI模式我也不是很清楚,我就是使用modelsim编译文件,然后跑一段时间,看信号波形就好了。
仿真库的问题我也不是很清楚,modelsim的库有时候会有些问题,这个我也不是非常的明白,你可以删掉库从新加试试,看看modelsim.ini文件里是否加入了库了,看看你的工程使用的modelsim.ini是否跟modelsim软件的是一样的。
这几天玩去了,没上论坛
共10条
1/1 1 跳转至页
回复
打赏帖 | |
---|---|
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 | |
分享电子控制安全气囊计算机知识点被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】【OZONE】使用方法总结被打赏20分 | |
【分享开发笔记,赚取电动螺丝刀】【S32K314】芯片启动流程分析被打赏40分 | |
【分享开发笔记,赚取电动螺丝刀】【S32K146】S32DS RTD 驱动环境搭建被打赏12分 | |
【分享开发笔记,赚取电动螺丝刀】【IAR】libc标注库time相关库函数使用被打赏23分 | |
LP‑MSPM0L1306开发版试用结果被打赏10分 |