参考设计来源于http://www.fpga.com.cn/freeip.htm存储器接口 标准SRD SDRAM控制器参考设计,xilinx提供.10采用了此设计的状态机,仅修改了刷新控制及系统命令的产生部分,并进行了控制器的不完全测试(前仿真上电装载,刷新,突发读写8421). 以下一些见解,纯属菜鸟10的个人理解,期待各位同行参与!
原控制器有以下一些特性:
·可编程的突发长度(Burst Lengths)为8、4、2、1
·可编程的读取潜伏期(CAS Latency)为2、3
·可编程的16位刷新周期
·突发长度应用于读(Read)和写(Write)
· ·支持SDRAM命令LOAD_MR、AUTO_REFRESH、PRECHARGE、ACTROW、READ、WRITE 、BURST_STOP与NOP
·输入时钟在62.5MHZ,数据改变在每个时钟边缘
·SDRAM时钟在125MHZ
·为减少FPGA与SDRAM之间的时钟偏移(Skew)采用了两个DLLS
这样设计灵活性很好,它允许不用重新编译FPGA设计更改Burst length、CAS latency、CAS-to-CAS delay、Refresh count、Refresh active period.但对控制器的操作比较麻烦.如下图:

故做修改,以使得只关心读写命令就行了.
修改后的设计,完成一次写所需要的周期=1+burst_count+4;一次读所需要的数据=burst_count+6.而刷新操作由控制器产生,不再由Place Addr_wr command on the bus Set AD[29:28] to 11来启动一个AUTO_REFRESH命令.通过刷新标志auto_ref来确定什么时候可以进行读写操作:auto_ref=1时,新的读写需等到Refresh active period(ki_max)之后才能进行,否则读写无效.
基于原设计的模块化,修改后的控制器仍由两大部分组成.见图2:


操作时序图如下:
1、上电装载模式寄存器

2、burst=4时的突发写

3、burst=4时的突发读

4、刷新与突发读

控制器目前不具有终止Burst的功能,修改状态机,通过data_addr_n_reg=0时,发送预充电命令,随后进入行活动,读或写.如下图: