wudi123baobei 发表于 2014-11-12 19:28:52

EE_PGA之SDRAM调试记录


SDRAM调试遇到了一些问题,不过现在基本上解决了,没有做时序约束,跑100M的时钟现在也没有问题了。
网上关于SDRAM的资料有很多,《高手进阶,终极内存技术指南》还可以,当然datasheet是最好的资料了,在网上其实还可以找到特权同学写的SDRAM控制器的verilog源文件,我参考了一下,但是没有仔细的看其源文件,代码我主要参考datasheet写的。
板子上的SDRAM是三星的K4S641632,容量8M,关于SDRAM,有几个重要概念及参数:
tRCD:有于SDRAM是行列地址线复用,所以是先设置行地址,然后设置列地址,二者之间要有一定时间间隔;
CAS Latency :读命令与数据有效之间的延迟时间,可以设置为2或3个clk;
Precharge: 由于SDRAM的寻址具体独占性,所以在进行完读写操作后,如果要对同一L-Bank的另一行进行寻址,就要将原来有效(工作)
             的行关闭,重新发送行/列地址。L-Bank关闭现有工作行,准备打开新行的操作就是预充电(Precharge);
Refresh:   SDRAM之所以成为DRARM就是因为它要不断进行刷新才能保留住数据,因此它是DRAM最重要的操作,一般64ms刷新一次,具
            体时间参考数据手册;
Burstlength:突发长度,可以设置为1、2、4、8以及full page;突发读写时一次可以读写多个数据,这样效率比单个地址读写要高;
SDRAM初始化过程如下:
1)   等待至少200us;
2)   所有Bank预充电;
3)   发送2次自动刷新命令;
4)   装载模式寄存器
5)   初始化完成
单个地址读写以及非全页突发读写时可以采用带自动预充电(由地址线A10控制)的读写命令,即在突发读写结束时自动进行预充电,这样就不用自己负责预充电了,但是整页突发读写时没有这个功能,但是通过发送突发停止命令可以达到Precharge的效果,即下次读写同一
bank 另外的行时,不用发送Precharge命令了。
SDRAM的时钟我直接用的是clk的取反(相差180度),SDRAM的操作时序也不是非常难,要读到数据是比较简单的(不一定正确),关键是要注意Refresh和Precharge命令,不然读出的数据可能会有一些错误。我实际调试就遇到这样的问题,我在全页突发读结束之后没有发生突发停止命令,之后突发写、突发读出的数据有一些就出错了,在网上搜了一下,有提到这一点,然后改了一下程序,真的就没问题了。
以上仅为个人观点,仅供参考,如有问题,可以相互讨论,共同进步,我也正在学习FPGA,呵呵!
附件代码:时钟50M,可以单个地址以及全页突发读写,通过串口调试助手可以查看读写结果,其实100M时钟也是可以的,我试过,只需稍微改一下,不用做时序约束。要跑100M,首先要保证代码的fmax超过100M,若小于100M,要将延时最长的路径上的大组合逻辑拆成小的组合逻辑,这样可以提高fmax。
记录, 技术, 高手进阶, 资料

472888370 发表于 2015-1-15 09:39:00

谢谢分享啊 看看
页: [1]
查看完整版本: EE_PGA之SDRAM调试记录