做FPGA开发的朋友迟早会碰到SDRAM。SDRAM跟SRAM不一样,它需要控制器来管理刷新、行激活、读写这些操作,不能像SRAM那样直接读写。很多人第一次接触SDRAM控制器时被它的状态机搞晕了,其实搞懂了SDRAM的工作原理,控制器写起来就有章法了。
SDRAM(Synchronous Dynamic RAM)是同步动态随机存储器,"同步"是指它的所有操作都跟时钟同步,"动态"是指存储单元需要定期刷新来保持数据。SDRAM的存储单元是电容,电容会漏电,所以必须每隔一段时间(通常64ms)刷新一次,不然数据就丢了。SDRAM的内部结构是按Bank组织的,常见的有4个Bank,每个Bank是一个存储矩阵,由行和列组成。
SDRAM的一次读写操作其实分好几步。第一步是行激活(ACTIVE),指定Bank地址和行地址,把整行数据读到行缓冲器里。第二步是列读写,指定列地址,从行缓冲器里读数据或写数据。读操作有潜伏期(CAS Latency),就是发列读命令后要等几个时钟周期数据才出来。写完一行后要发预充电命令(PRECHARGE),关闭这行,才能访问其他行。整个过程由命令总线(RAS、CAS、WE)和地址总线配合完成。
SDRAM控制器的核心是一个状态机。常见的状态有:初始化、空闲、行激活、读、写、预充电、刷新、自动刷新。控制器要根据用户的读写请求和SDRAM的状态,在这些状态之间切换。初始化阶段要按SDRAM的要求发一系列命令:上电等待、预充电所有Bank、设置模式寄存器、若干次自动刷新。模式寄存器决定了CAS潜伏期、突发长度、突发类型这些参数。
写SDRAM控制器时,最重要的是处理好刷新。SDRAM要求每个刷新周期(64ms)内所有行都要刷新一次。常见的做法是用一个定时器,每隔一段时间(比如64ms除以行数)发一次自动刷新命令。自动刷新会占用SDRAM的带宽,如果刷新太频繁,读写效率就低;刷新太少,数据会丢。要根据SDRAM的datasheet计算好刷新间隔。
为了简化用户接口,SDRAM控制器一般提供一个类似SRAM的简单接口:用户给地址和数据,发一个读或写命令,控制器内部完成所有复杂的时序,把数据返回或写入。这样上层逻辑就不用关心SDRAM的操作细节了。更高级的控制器还会加一个FIFO做数据缓存,把用户时钟域和SDRAM时钟域隔离开,方便跨时钟域处理。
FPGA里实现SDRAM控制器,推荐先看SDRAM芯片的datasheet,把时序图搞明白,再去写状态机。常见的SDRAM有IS42S16400、HY57V641620这些,时序都差不多。也可以用FPGA厂商提供的IP核,比如Xilinx的MIG(Memory Interface Generator),配置一下就能生成控制器,省事很多。但学习阶段还是建议自己手写一个,能加深对SDRAM工作原理的理解。
下一篇:没有了