geff 发表于 2012-9-11 15:28:10

如何高效的读写SDRAM?

rt, 对SDRAM我们一般需要读写同时进行。
理论上比如,143MHz, 16bits的SDRAM的带宽可以达到286MB

但对我来说这又很难去实现这个理论值。
因为每次对SDRAM简单的读写都需要active, percharge之类的操作,基本上单次读写的效率都很低。

要是用突发读写,瞬时的数据量会很大,需要用FIFO来达到缓冲作用,有时又不适宜把FIFO做的过大,这样会很占资源

我看到读写不同的Bank可以覆盖掉active,percharge的时间,但在控制上又造成了难度,一般数据都是顺序读写的。

大家来讨论讨论有什么高效的方法把SDRAM用起来。

NJ8888 发表于 2012-9-11 16:06:25

FPGA做全页突发资源消耗没多少,CPLD就惨了,做8字突发吧

geff 发表于 2012-9-11 16:48:46

NJ8888 发表于 2012-9-11 16:06 static/image/common/back.gif
FPGA做全页突发资源消耗没多少,CPLD就惨了,做8字突发吧

确实惨不忍睹,呵呵

FPGA生成的SDRAM_CLK会有相位偏移么。

CPLD内部有时延,产生的时钟好像有相位偏移,时钟上升沿落不到数据的有效窗口上。

不知道你用FPGA做的时候有这种现象么,还是用PLL调节了输出时钟相位。

NJ8888 发表于 2012-9-11 16:58:36

125M看了下,然后反相了下时钟,没有特意再控制相位

geff 发表于 2012-9-11 17:26:53

NJ8888 发表于 2012-9-11 16:58 static/image/common/back.gif
125M看了下,然后反相了下时钟,没有特意再控制相位

你说的这个情况对我很有用

我之前看到的很多文章关于FPGA_CLK,SDRAM_CLK的相位关系的文章,根据FPGA寄存器的建立保持时间,和SDRAM的建立保持时间,分别计算读,写SDRAM时的有效窗口,我记得大概情况是这样


                                       |<------------------------->|读有效窗口                        
                                                      |<------------------------->|   写有效窗口
                                                      |<------------>| 有效窗口
                        ___________                     ___________
_____________|                   |__________|                  |__________               

                                                    SDRAM时钟上升沿

当时钟频率越高时,这个有效窗口越窄。

说说我的情况,开始我用的是80MHz晶振给CPLD时钟,然后直通给SDRAM(没有反向),数据读写不稳定。后来我换成48M晶振,还是一样的问题,不稳定。
然后我把时钟反相,问题就解决了。我对这样的情况理解就是,当时钟频率下降,读写窗口都变宽,在SDRAM下降沿处又产生了一个有效窗口,所以当反相的时候,刚好数据落到这个有效窗口内。(但我不清楚这样的想法对不)

我看你说你用125M的时钟,也是反相时钟。数据读写稳定。所以这点我很困惑,高频率时钟很难在下降沿处有有效窗口交集。

你对这方面怎么看?

NJ8888 发表于 2012-9-11 20:22:50

geff 发表于 2012-9-11 17:26 static/image/common/back.gif
你说的这个情况对我很有用

我之前看到的很多文章关于FPGA_CLK,SDRAM_CLK的相位关系的文章,根据FPGA寄 ...

我是用示波器观察CLK和DATA相位定的,FPGA中时钟输出路径和时钟控制CAS RAS WE等等路径不一样。

kebaojun305 发表于 2012-9-11 21:01:48

我用的是68M的时钟    SDRAM_CLK的时钟和内部的时钟是一样的。不用取反的如果取反的话相当于时序上严了一倍。

geff 发表于 2012-9-11 23:09:12

NJ8888 发表于 2012-9-11 20:22 static/image/common/back.gif
我是用示波器观察CLK和DATA相位定的,FPGA中时钟输出路径和时钟控制CAS RAS WE等等路径不一样。 ...

时钟是通过组合电路直接输出
控制和数据是寄存器在上升沿输出,对么

你就是用示波器观察数据和时钟的关系,然后反相时钟,并没有调节时钟的相位对么?(这个方法我不是很理解)因为你的时钟频率很高,只用反向就能稳定读写,我不是很能理解了,这方面我没有太多的经验。

我有个问题,用示波器能准确地判断SDRAM CLK上升沿时,数据稳定么。示波器里看到的时钟上升沿时间比较宽,那应该怎么判断采样点的时间。

我现在就感觉反向后,写SDRAM时,数据有时不稳定,尤其相邻数据从0x0000->0xFFFF或0xFFFF->0x0000,有时数据会出错,一般情况下都正常;读是正常的

时钟不反向的时候,读有时不稳定

CPLD不知道有没有较好的方法来控制时钟?还是说SDRAM对时钟并不敏感,是模块其他地方有问题。

geff 发表于 2012-9-11 23:12:21

kebaojun305 发表于 2012-9-11 21:01 static/image/common/back.gif
我用的是68M的时钟    SDRAM_CLK的时钟和内部的时钟是一样的。不用取反的如果取反的话相当于时序上严了 ...

我同意不能取反。但我现在的情况是时钟频率低的时候去反是稳定的。

但时序严格一倍是怎么推算的呢?我感觉理论上,时钟频率上去,SDRAM CLK就不能反向了。这时候如果方向,读或写应该满足不了时序要求的。

kebaojun305 发表于 2012-9-12 08:50:19

本帖最后由 kebaojun305 于 2012-9-12 08:55 编辑

geff 发表于 2012-9-11 23:12 static/image/common/back.gif
我同意不能取反。但我现在的情况是时钟频率低的时候去反是稳定的。

但时序严格一倍是怎么推算的呢?我感 ...

你的感觉是对的你分析下 你如果取反的话   相当于SDRAM的时钟频率=2倍的逻辑频率    就是说你的逻辑电路在一个上升沿 修改数据和命令因取反了所以SDRAM就是在逻辑电路的下降沿锁存了(因你的时钟取反,所以SDRAM的时钟的上升沿实际上对应的逻辑时钟的下降沿), 这样分析的话所有的输入到SDRAM的数据和命令,时序要求都严格了一倍。

我刚开始也是取反的(因理解不深) 100M的时钟当时板子的线就是随便连的这个板子可以调好   换个板子就不行了,仔细想了下时序才理解 不用反相就对了。

geff 发表于 2012-9-12 08:57:26

kebaojun305 发表于 2012-9-12 08:50 static/image/common/back.gif
你的感觉是对的你分析下 你如果取反的话   相当于SDRAM的时钟频率=2倍的逻辑频率    就是说你的逻辑 ...

我明白你的意思

我觉得会不会因为我的SDRAM_CLK是晶振通过CPLD直通给SDRAM的,在CPLD里会不会产生了延时,pin to pin delay之类的。

而数据是通过寄存器输出,两者之间产生了相位差。

大家控制SDRAM的时候,时钟没出现过这类问题么?

kebaojun305 发表于 2012-9-12 09:01:49

本帖最后由 kebaojun305 于 2012-9-12 09:08 编辑

geff 发表于 2012-9-12 08:57 static/image/common/back.gif
我明白你的意思

我觉得会不会因为我的SDRAM_CLK是晶振通过CPLD直通给SDRAM的,在CPLD里会不会产生了延时 ...

应该就是这样问题时序约束的问题   你可以把SDRM_CLK的时钟添加几个缓冲器 来人为的延时一点时间。或者约束下输出到SDRAM管教的输入输出脚   
我现在的做法是 SDRAM_CLK的时钟比内部逻辑的驱动时钟提前了0.2ns (因我这带有PLL如果没有带的话 可以添加缓冲器 来手动调节)



你用的啥CPLD

geff 发表于 2012-9-12 09:31:01

kebaojun305 发表于 2012-9-12 09:01 static/image/common/back.gif
应该就是这样问题时序约束的问题   你可以把SDRM_CLK的时钟添加几个缓冲器 来人为的延时一点时间 ...

MAXII EPM1270

缓冲器是怎么添加的?这个我还不会

kebaojun305 发表于 2012-9-12 12:07:09

geff 发表于 2012-9-12 09:31 static/image/common/back.gif
MAXII EPM1270

缓冲器是怎么添加的?这个我还不会

加上2个非门然后加上关键字 不让优化    俺用的是A3P125100脚的 价格14元左右。很超值

geff 发表于 2012-9-12 13:24:59

kebaojun305 发表于 2012-9-12 12:07 static/image/common/back.gif
加上2个非门然后加上关键字 不让优化    俺用的是A3P125100脚的 价格14元左右。很超值 ...

多谢了

我去查一查,verilog怎么防止优化的语句

kebaojun305 发表于 2012-9-12 16:44:22

geff 发表于 2012-9-12 13:24 static/image/common/back.gif
多谢了

我去查一查,verilog怎么防止优化的语句

我说反了应该是驱动CPLD内部的逻辑时钟加们电路手动延时      如果频率不高的话取反也问题不大只是pcb布线 要注意。

sky5566 发表于 2012-9-12 20:42:23

http://xjhit.spaces.eepw.com.cn/articles/article/item/88031
防止FPGA设计中综合后的信号被优化
2011-07-11 22:37:11

      这不是一个新话题了,写这个也是当作自己的一个小小的笔记吧!觉得挺有用的。

      一般在做前仿真(即功能仿真)时,不会考虑信号被优化的问题。最近做一个关于运算的小程序,前仿真的数据没有问题,但是实际出来的数据总是有错误,所以不得不要进行后仿真。而后仿真一个很大的问题就是设计中很多信号在综合的过程中都优化掉了,所以需要添加相应的综合属性,让软件在综合的工程中,保留这些信号。另外,在利用SignalTap II观察信号时也会遇到相同的问题。

      在Verilog描述的程序中,通常包括两种类型的信号,即wire型,和reg型。对于不行类型的信号,需要使用不同的综合属性。

(1)对于wire型信号,使用/* synthesis keep="1" */综合属性,例如下面的语句:

      wire data_in/* synthesis keep="1" */;

(2)对于reg型信号,使用/* synthesis preserve = 1 */综合属性,例如下面的语句:

      reg data_in/* synthesis preserve = 1 */;

      需要注意的是:描述综合属性的语句一定要添加在“;”前面。

      其中,/* synthesis keep="1" */是Quartus II自带综合器的综合属性,对应于Synplify的综合属性是/* synthesis syn_keep=1 */。不过现在Quartus II也支持/* synthesis syn_keep=1 */


在这个BUF两端的信号线上加上下面的属性(Verilog HDL版本):
wire bufin/* synthesis syn_keep=1 xc_props="X" */;
具体解释:
1、syn_keep=1就是保留这个信号线,是它成为一个instance(synplify的),然后就可以对它添加XILINX的约束属性;
2、xc_props=“”是synplify为XILINX保留留的约束属性,可以透传到ISE的实现中去,从而约束实现过程。
3、“X”属性是在MAP时识别的KEEP属性,如果用XST综合就只需要在信号线的两端加上X属性就可以透传到MAP中去。但是synplify并不能识别,因此需要通过以上的方法将X属性透传到MAP中去。
类似在 VHDL中也适用
attribute syn_keep of temp01 : signal is true;
attribute xc_props of temp01 : signal is "X";

zcy0517 发表于 2014-4-30 21:38:38

收益了{:smile:}{:smile:}{:smile:}{:smile:}
页: [1]
查看完整版本: 如何高效的读写SDRAM?