|
寒假赋闲在家,想想也没什么特别重要的事情,就弄弄FPGA板子吧,把SDRAM控制器做好。从去年这个时候我就一直在构思这个SDRAM控制器,不过还是没有什么经验。先把第一部分的应用笔记发上来吧
IS42S32400B是一款128Mb同步DRAM芯片,组织方式为1Meg×32bit×4Banks。每个Bank分为4096行和256列。
A0-A11:行地址,共计4096行
A0-A7:列地址,共256列
BA0-BA1:Bank选择地址,共分为4个Bank
DQ0-DQ31:数据输入和输出
CLK:时钟输入
CKE:时钟有效
nCS:片选,低有效
nRAS:行地址有效指令,低有效
nCAS:列地址有效指令,低有效
nWE:写使能,低有效
在读SDRAM的时候,DQ上的信号取决于两个时钟之前DQM的电平。当DQM输入为高时,对应的DQ信号将在两个时钟周期后变为高阻,当DQM输入为低时,DQ会在两个时钟周期之后提供有效的数据。总之,DQM对数据读取操作有两个时钟周期的延迟。
在写SDRAM的时候,DQ上的数据和DQM应该同时出现,当DQM为低电平时,对应DQ上的数据会被写入到存储阵列中,而当DQM为高电平时,对应DQ上的数据不会被写入到存储阵列中。总是,DQM对数据写入的操作是没有延迟的。
图中的时间参数列于下表
tCH | tCS | tOH | tAC |
0.8ns | 1.5ns | 2.7ns | 5.4ns |
在写FPGA程序的时候,需要根据这个延时表来确定对应的时序关系,一般对FPGA工作时钟进行一个负相移然后输出,然后调整对SDRAM输出信号的采样时钟。
初始化分为以下四步
1、上电之后的前100us之内,不对SDRAM进行任何操作,只给SDRAM发送NOP或者COMMAND INHIBIT指令;
2、当100us延迟满足之后,需要产生一个PRECHARGE指令;
3、接着发送两次AUTO REFRESH指令。
4、设置模式寄存器。
此时,SDRAM的所有Bank都处于空闲状态,可以进行正常的访问了。
模式寄存器用于定义SDRAM的工作模式,包括突发长度,突发类型和CAL。模式寄存器通过LOAD MODE REGISTER指令进行设置。
突发长度决定了一次读写所能访问的最大的列单元数目,SDRAM支持1,2,4,8和全页共计五种突发模式。需要注意的是,1,2,4,8这四种突发模式支持交织读取,而全页模式不支持交织读取。全页突发模式需要BURST TERMINATE指令来决定突发长度。在突发读取的时候,如果地址到达边界,会重新回到0。突发时最低位的地址bit用于确定突发读写起始位置。
CAL表示在读SDRAM时,从READ指令到数据输出所经历的时钟周期数。当CAL为3时,最高工作频率为166MHz,当CAL为2时,最高工作频率为125MHz。
再对SDRAM进行任何读写操作的时候,需要通过ACTIVE指令将需要读写的行打开。当使用ACTIVE指令打开某行之后,在READ和WRITE指令之前,需要至少延迟tRCD。对同一个Bank内其他行进行激活必须先通过PRECHARGE指令关闭已经打开的行,相邻两个ACTIVE指令之间的最小时间间隔为tRC。不同Bank的行可以同时打开,不同Bank之间ACTIVE指令的最小间隔为tRRD。
任何突发读都可以被接下来的READ指令中断,固定长度的突发读可以紧接着进行突发读,这样可以实现一个连续的数据流读取。为了实现连续的数据读取,读指令需要在最后一个有效数据输出之前的CAL-1个时钟周期有效。在前一个READ指令之后的任意时钟周期内,都可以接着发出READ指令。
突发读也可以通过PRECHARGE指令终止。也可以通过BURST TERMINATE指令终止。
在突发写的时候,第一个有效数据将和WRITE指令一起被采样,在之后每个时钟的上升沿,数据都会被采样。任何突发写指令都可以被接下来的写指令打断,这样可以实现一个连续地数据写入。