做FPGA或者高速数字设计的,迟早要跟SDRAM打交道。SDRAM也就是同步动态随机存储器,容量大、价格便宜,但控制时序比SRAM复杂得多,需要自己写控制器或者用厂商的IP核。很多人第一次调SDRAM都被各种时序参数搞得头大,其实把核心逻辑理清了也就那么回事。
SDRAM的基本操作包括初始化、读、写、刷新、预充电这几个。上电后先要按规定的时序完成初始化,发一系列命令让芯片进入正常工作状态,包括预充电所有bank、执行自动刷新、加载模式寄存器。模式寄存器里配置了突发长度、CAS延迟、寻址模式这些关键参数,配错了后面读写全乱。
读操作的时序是关键。先发激活命令打开对应bank和行,等tRCD时间后发读命令,列地址带上,再等CAS延迟个周期,数据就从DQ口出来了。因为是同步的,数据沿时钟沿输出,FPGA这边要用时钟沿去采样。写操作相对简单,发写命令的同时把数据放到DQ上,注意写延迟跟读延迟不一样,写是0延迟或者1延迟,看模式寄存器配置。
刷新是SDRAM跟SRAM最大的区别。SDRAM靠电容存数据,电容会漏电,所以每隔一段时间必须刷新一次,不然数据就丢了。标准是64ms内要把所有行刷新一遍,比如4096行的芯片,每15.6us就要发一次自动刷新命令。控制器里要做一个定时器,到点就插入刷新操作,不能因为正在读写就跳过,不然数据会出错。
用FPGA写SDRAM控制器,建议分模块设计。一个命令仲裁模块,处理刷新、读、写请求的优先级,刷新优先级最高。一个时序状态机,按照SDRAM的状态转换图产生各种命令和控制信号。一个数据通路模块,负责读数据的对齐和写数据的打包。这样分开写,调试的时候定位问题方便。
调SDRAM最头疼的就是时序不满足。信号在PCB上走有延迟,FPGA引脚到SDRAM引脚之间的走线、SDRAM本身的输出延迟,加起来可能超过一个时钟周期,导致采样错误。解决办法是用FPGA的PLL把时钟移相,或者用IDDR/ODDR原语,再不行就降频率。示波器和逻辑分析仪是调试SDRAM的利器,看命令、地址、数据的时序关系一目了然。
现在很多新项目直接用DDR3、DDR4了,时序更复杂,一般都用厂商的MIG IP核,不用自己手写。但理解SDRAM的基本原理对调DDR还是很有帮助的,核心概念都是通的。新手建议先拿SDR SDRAM练手,时序简单,把状态机写通了,再去碰DDR。
上一篇:Proteus仿真入门:单片机和电路在电脑上跑起来的方法
下一篇:没有了