SDRAM主要的原理过程,首先就是要进行初始化,初始化一共有四个过程,在这些过程中,可能会有一些等待周期。然后初始化结束之后进入工作状态。其中工作状态就是写操作,读操作,还有就是自动刷新操作。如果没有写读命令时,刷新操作也会定时工作,这也是为什么sdram,就做动态存储器。如果一旦有读写命令请求时,就会进入突发读写状态。
这个是SDRAM的常见参数
1.稳定200us周期
`define CMD_NOP 5'b10111 // NOP COMMAND
2.预充电: 预充电实际上就是对工作行中所有存储体进行数据重写
`define CMD_PRGE 5'b10010 // PRECHARGE
- 这个预充电命令发出后,还需要TPR的时间,预充电和激活命令之间需要大于等于TPR时间15ns,所以需要一个大于15ns的等待周期
parameter TRP_CLK = 10'd4; //预充电有效周期40ns
4. 8个自动刷新周期
`define CMD_A_REF 5'b10001 // AOTO REFRESH
5.TRC时间是min=60ns
parameter TRC_CLK = 10'd6; //自动刷新周期60》=60ns
6.设置模式寄存器,这里我们需要设置
`define CMD_LMR 5'b10000 // LODE MODE REGISTER
7.TRSC
parameter TRSC_CLK = 10'd6; //模式寄存器设置时钟周期60ns》20ns
8.初始化完成
工作状态
- 行激活,初始化完成后, 无论是读操作还是写操作, 都要先激活( Active) SDRAM中的一行,使之 处于活动状态(又称行有效) 。在此之前还要进行SDRAM芯片的片选和L-Bank的定址,不过它 们与行激活可以同时进行
(其中读写命令请求来自于FIFO模块)
2. 然而,在发送列读写命令时必须要与行激活命令有一个时间间隔,这个间隔被定义为tRCD, 即RAS to CAS Delay( RAS至CAS延迟)
parameter TRCD_CLK = 10'd2; //行选通周期20ns》15ns
3.写操作,WE=0,CAS=0
`define CMD_WRITE 5'b10100 // WRITE COMMAND
这里A10要设置是低电平,禁止自动预充电。在读写完事之后,在预充电。
4.将数据突发写入,等待写结束
(1).等待写完
`define CMD_NOP 5'b10111 // NOP COMMAND
(2).这个是突发结束命令
`define CMD_B_STOP 5'b10110 // BURST STOP
5. 为了保证数据的可靠写入,都会留出足够的写入/校正时间( tWR, Write Recovery Time),这个操作也被称作写回( Write Back)。 tWR至少占用一个时钟周期 或再多一点(时钟频率越高, tWR占用周期越多)
parameter TWR_CLK = 10'd2; //写入校正
6.读操作
`define CMD_READ 5'b10101 // READ COMMADN
7.需要等待CAS潜伏期,这里我们需要3个时钟周期
parameter TCL_CLK = 10'd3; //列潜伏期
7.将数据突发读出,等待读结束
(1).等待读完
`define CMD_NOP 5'b10111 // NOP COMMAND
(2).这个是突发结束命令
`define CMD_B_STOP 5'b10110 // BURST STOP
8.预充电: 预充电实际上就 是对工作行中所有存储体进行数据重写
`define CMD_PRGE 5'b10010 // PRECHARGE
9.这个命令发出后,还需要TPR的时间预充电和激活命令之间需要大于等于TPR时间15ns,所以需要一个大于15ns的等待周期,这个周期时间结束之后,调到初始状态
parameter TRP_CLK = 10'd4; //预充电有效周期40ns
10自动刷新,这个是周期的操作,为了防止数据丢失,对所有的L-Bank都操作
`define CMD_A_REF 5'b10001 // AOTO REFRESH
11.自动刷新之后,需要等待几个时钟周期,之后跳回初始状态
parameter TRC_CLK = 10'd6; //自动刷新周期60》=60ns