SDRAM控制器大概是FPGA项目里"翻车率"最高的模块。时序差一个周期,回读全是垃圾数据;忘了刷新,跑十分钟Bank静默丢失。如果你正在啃SDRAM模块代码却理不清状态机,下面把关键逻辑拆给你看。
SDRAM不是"给地址就出数据"的直通器件。物理结构决定了控制器必须处理三类操作:
初始化序列:上电后依次执行Precharge All → Auto Self-Refresh → 写Mode Register,整个过程约200 µs,漏一步后续全废。
读写访问:先Row Activate,等待tRCD后访问列,相邻列操作间还有tCCD间隔。
周期性刷新:每6.4 ms内必须覆盖全部1024行(Refresh),错过窗口数据不可恢复。
一个完整控制器的本质是状态机,状态至少包含:IDLE、INIT、PRECHARGE、ACTIVATE、READ/WAIT、WRITE/WAIT、REFRESH。每个状态切换对应一组地址/数据总线操作,Mode Register中的CAS Latency和Burst Length直接决定等待周期数。
## FPGA SDRAM模块程序中最容易卡住的环节是什么?
两个字:时序对齐。
常见卡点:
tRCD(行激活到列访问最小间隔)配错,控制器以为数据就绪,实际Sense Amplifier还没充完;
刷新窗口被连续读挤掉,Bank数据静默丢失,跑几十分钟才暴露;
Mode Register设CAS Latency=2,代码里只等1个周期就采样,拿到的全是前拍残留。
排查方法:用逻辑分析仪抓CS、RAS、CAS、WE、OE信号,对照器件Datasheet时序图逐周期比对,重点确认tRCD、tCCD、tRAS在波形中是否严格满足。
## SDRAM为什么不能像SRAM一样"给地址就读"?
SRAM每个Cell是独立6T结构,地址译码后直接选中。SDRAM把1024行×N列数据排布在4或8个Bank里,读写前必须经过三步:
1. Precharge当前Bank行,释放Sense Amplifier;
2. Activate目标行,整行数据泵入Sense Amplifier;
3. 等tRCD后,对列地址执行Read或Write。
所以控制器不是"地址→数据"的直通逻辑,而是"行地址→等待→列地址→等待→数据"的流水线,流水线深度由CAS Latency决定。这也是初学者写状态机时最容易漏掉等待周期、导致数据错位的根源。
SDRAM控制器核心就是状态机+时序约束,把tRCD / tRP / tRAS画在时序图上标清楚,代码基本就能写通。
思考题:项目同时需要SDRAM和DDR3、FPGA资源紧张时,你会怎么取舍控制器位宽与Bank交错策略?如果你正卡在某段具体时序上,可以通过官网右下角会话窗口把波形和代码片段发给我们,帮你逐周期定位问题。
未经许可,禁止转载!
下一篇:没有了