打印
[CPLD]

求助:FPGA做DDR控制器的问题

[复制链接]
7160|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
水畔天蓝|  楼主 | 2010-11-15 20:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
natertech| | 2010-11-16 09:14 | 只看该作者
直接邮件原厂fae吧.他们应该会有支持和解决!

使用特权

评论回复
板凳
supperpippo| | 2010-11-16 09:28 | 只看该作者
很多人做这个啊  :lol

使用特权

评论回复
地板
SuperX-man| | 2010-11-16 12:39 | 只看该作者
本帖最后由 SuperX-man 于 2010-11-16 14:28 编辑

在你使用MIG生成IP核的时候,应该有很详细的向导,让你选择和配置你要控制的DDR及各类参数,这个是关键,如果配置的不对可能就无法读取了.

在MIG的向导的左下方也会有一个User Guide或者Data Sheet按钮让你来完整了解MIG生成的IP核.
一般来说你只要配置正确,把生成的IP核加到你的工程里去,然后配置好和DDR相连接的引脚,然后控制你对MIG操作的接口逻辑就行了(没几个脚,操作起来比较简单,在MIG的User Guide里有说明,基本和你读写I/O端口差不了多少).

使用特权

评论回复
5
sleepybear| | 2010-11-16 17:58 | 只看该作者
3楼是大因扎吉的球迷?哈哈

使用特权

评论回复
6
水畔天蓝|  楼主 | 2010-11-16 20:41 | 只看该作者
5楼:谢谢!我就是看的User Guide,里面的接口比较复杂。十多个信号呢,是不是只要改Testbench里的程序就好了,状态机需要自己做程序跳转吗?

使用特权

评论回复
7
SuperX-man| | 2010-11-17 09:36 | 只看该作者
要控制的接口并没有多少,很多是和你DDR直接相连接的,所以说在用MIG生成IP核的时候很重要,一定要根据你的DDR做好匹配.

Testbench算是一部分吧,在USER GUIDE中有对Testbench的详细描述

使用特权

评论回复
8
supperpippo| | 2010-11-17 10:11 | 只看该作者
是啊 ,可惜他受伤了:( 7# sleepybear

使用特权

评论回复
9
水畔天蓝|  楼主 | 2010-11-17 21:57 | 只看该作者
9楼,谢谢!关于MIG我所知甚少,现在我的理解是,如果我把需要的控制接口部分做为我的IP核,那么能否认为estbench是所需要的激励信号?其实我的要求仅仅是将数据全部预先存储在DDR中,然后循环将数据读出,现在发现最难的是时钟同步的问题

使用特权

评论回复
10
SuperX-man| | 2010-11-18 11:35 | 只看该作者
如过你的板子是现成做好的话,你可以添加一个chipscope,跑一下MIG自动生成的DEMO(需要你在配制MIG的时候选择需要TestBench),看一下波形和时序,我想你就会清楚不少.
我看的是Ug086  DDR的话, 285-290页是详细的内部结构图.读写时序看299-302.
                        DDR2 的话, 317-322..........................,..............331-334

你也可以根据你对应的结构图,改TestBentch来达成你的目的,不过小版还是要重重提醒下,在MIG向导的时候一定要匹配你的DDR才行.否则估计无效, 311-312你可以参考下

使用特权

评论回复
11
sleepybear| | 2010-11-18 12:16 | 只看该作者
本帖最后由 sleepybear 于 2010-11-18 12:21 编辑

另外,如果需要修改管脚位置约束,还要注意Answer Record 29313(http://www.xilinx.com/support/answers/29313.htm)。因为MIG除了hdl代码,还有相关ucf。其中除了管脚位置RLOC约束,还有一些其他的约束,与特定的管脚位置约束相关,另外再MIG的代码顶层还有两个参数:DQS_IO_COL和DQ_IO_MS,也与位置约束有关。如果生成MIG代码后,还要对管脚位置约束进行修改,相关的其他约束和顶层的这两个参数也需要进行变动,否则implement时会出错。具体怎么做,那个AR29313里边有。
MIG我用过2.0,之后的版本就没用过了。但是对这个有印象。当时用1.73版的生成,然后在ucf里按照自己的板子修改位置约束,再用了那个AR里提供的一个脚本生成的其他约束和那两个参数。新的AR没仔细读,也不知道后续版本是否还要这么麻烦。。。
总之,用MIG有三点需要注意:
1、FIFO接口;
2、需要的时钟给对了;
3、约束以及顶层那两个参数。

使用特权

评论回复
12
sleepybear| | 2010-11-18 12:26 | 只看该作者
看错了。。。那个AR是针对V5的。。。其他器件的没用过,未知。。。丢人了,遁逃。。。

使用特权

评论回复
13
cmf1555| | 2010-11-18 15:11 | 只看该作者
看错了。。。那个AR是针对V5的。。。其他器件的没用过,未知。。。丢人了,遁逃。。。

使用特权

评论回复
14
水畔天蓝|  楼主 | 2010-11-25 21:31 | 只看该作者
我的MIG没有生成testbench,用的是只带DCM的,我现在的功能只是单次写进DDR,循环读入FPGA,66M的时钟写,200M时钟读,DDR是两片拼成32位的,用的是MT46V64M16,FPGA是Spartan3的3S2000,我现在就是不明白状态机怎么跳啊?谢谢!急!

使用特权

评论回复
15
SuperX-man| | 2010-11-25 23:23 | 只看该作者
你先要明白MIG的时序,才能控制状态机阿.
那时序在哪里呢,就在User Guide中.

我这里传一个MIG3.5的User Guide.
287页为只带DCM,生成后的结构图.从299到303,就是控制时序图了.

做时序千万要保持冷静,否则会进入恶性循环的.附件有点大,我分压了

ug086.part1.rar

4 MB

ug086.part2.rar

4 MB

ug086.part3.rar

85.07 KB

使用特权

评论回复
16
水畔天蓝|  楼主 | 2010-11-28 16:10 | 只看该作者
好的,谢谢!我用示波器量了一下,发现几个问题:
1、我用FPGA往DDR里循环写固定的数据,比如写20个数据都是0xFFFFFFFF(DDR是两片拼成32位的),结果量到数据总线上是稳定的值,地址只有最低三位是跳变的。我FPGA中的WR_FIFO参数是WR_CLK=66M,RD_CLK=133M,WR_WIDE=32bit,RD_WIDE=64bit(DDR的MIG生成就是64位的),WR_FIFO的标志位是全空和全满。请问我量到的测试情况对吗?
2、我单次写数据,比如写20个数据都是0xFFFFFFFF,再循环读出,结果量到数据总线上的值跳变,很乱,地址只有最低三位是跳变的,和写时的情况一样。我FPGA中的RD_FIFO参数是WR_CLK=133M,RD_CLK=200M,WR_WIDE=64bit(DDR的MIG生成就是64位的),RD_WIDE=32bit,WR_FIFO的标志位是全空和全满。请问我的测试又是不是正确的?为什么读出来的值不是固定的数?是不是在自刷新时候DDR的数据总线都回零啦?
望再次指点啊!谢谢了!项目催的很……

使用特权

评论回复
17
SuperX-man| | 2010-11-29 09:48 | 只看该作者
你DDR是2片拼成的话,在MIG和DDR的接口部分是如何连接的,还有在MIG的向导里有DDR和DDR2之分
另外你测试的话,最好不要用全1的数据,因为长时间全1的话,可能会被认为是无效数据

使用特权

评论回复
18
水畔天蓝|  楼主 | 2010-11-30 21:20 | 只看该作者
版主,我给你发了邮件,麻烦帮我看看好吗

使用特权

评论回复
19
SuperX-man| | 2010-12-1 15:38 | 只看该作者
最近这段时间一直在外面跑,我会抽空看一下的

使用特权

评论回复
20
水畔天蓝|  楼主 | 2010-12-8 21:21 | 只看该作者
再请教大家一下:
我按照MIG上的时序来写程序,然后仿真了一下,是行为级仿真。发现内部MIG的控制信号都对了,但最后FPGA端口上的信号乱七八糟。MIG产生的DDR控制器输出的信号DDR_DQ和DDR_A在时序上根本对不齐,有哪位大师能告诉我FPGA端口上的DDR控制信号时序应该是什么样的?我不要DDR的datasheet上的,那里的我更不明白。谢谢啊!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

242

帖子

0

粉丝