SDRAM读写操作仿真与分析

1.行有效时序图
  初始化完成后,要想对一个L-Bank中的阵列进行寻址,首先就要确定行(Row),使之处于活动状态(Active),然后再确定列。虽然之前要进行片选和L-Bank的定址,但它们与行有效可以同时进行。
 
     二、SDRAM - loving you - 天道酬勤
 
  从图中可以看出,在CS#、L-Bank定址的同时,RAS(Row Address Strobe,行地址选通脉冲)也处于有效状态。此时An地址线则发送具体的行地址。如图中是A0-A11,共有12个地址线,由于是二进制表示法,所以共有4096个行(2的12次方=4096),A0-A11的不同数值就确定了具体的行地址。
 
  由于行有效的同时也是相应L-Bank有效,所以行有效也可称为L-Bank有效。
 
 2.列读写
 
  行地址确定之后,就要对列地址进行寻址了。但是,地址线仍然是行地址所用的A0-A11(本例)。没错,在SDRAM中,行地址与列地址线是共用的。
 
  不过,读/写的命令是怎么发出的呢?其实没有一个信号是发送读或写的明确命令的,而是通过芯片的可写状态的控制来达到读/写的目的。显然WE#信号就是一个关键。WE#无效时,当然就是读取命令。
 
    
 
 
  列寻址信号与读写命令是同时发出的。虽然地址线与行寻址共用,但CAS(Column Address Strobe,列地址选通脉冲)信号则可以区分开行与列寻址的不同,配合A0-A9,A11(本例)来确定具体的列地址。
 
    
 
  然而,在发送列读写命令时必须要与行有效命令有一个间隔,这个间隔被定义为tRCD,即RAS to CAS Delay(RAS至CAS延迟),大家也可以理解为行选通周期,这应该是根据芯片存储阵列电子元件响应时间(从一种状态到另一种状态变化的过程)所制定的延迟。
 
  tRCD是SDRAM的一个重要时序参数,可以通过主板BIOS经过北桥芯片进行调整,但不能超过厂商的预定范围。
 
  广义的tRCD以时钟周期(tCK,Clock Time)数为单位,比如 tRCD=2,就代表延迟周期为两个时钟周期,具体到确切的时间,则要根据时钟频率而定,对于PC100 SDRAM,tRCD=2,代表20ns的延迟,对于PC133则为15ns。
 
SDRAM的读/写时序与突发长度
   1) 数据输出(读)
 
  在选定列地址后,就已经确定了具体的存储单元,剩下的事情就是数据通过数据I/O通道(DQ)输出到内存总线上了。
  但是在CAS发出之后,仍要经过一定的时间才能有数据输出,从CAS与读取命令发出到第一笔数据输出的这段时间,被定义为CL(CAS Latency,CAS潜伏期)。
  由于CL只在读取时出现,所以CL又被称为读取潜伏期(RL,Read Latency)。
  CL的单位与tRCD一样,为时钟周期数,具体耗时由时钟频率决定。
 
  不过,CAS并不是在经过CL周期之后才送达存储单元。实际上CAS与RAS一样是瞬间到达的,但CAS的响应时间要更快一些。
  为什么呢?假设芯片位宽为n个bit,列数为c,那么一个行地址要选通n×c个存储体,而一个列地址只需选通n个存储体。
  但存储体中晶体管的反应时间仍会造成数据不可能与CAS在同一上升沿触发,肯定要延后至少一个时钟周期。
 
  由于芯片体积的原因,存储单元中的电容容量很小,所以信号要经过放大来保证其有效的识别性,这个放大/驱动工作由S-AMP负责,一个存储体对应一个S-AMP通道。
  但它要有一个准备时间才能保证信号的发送强度,事前还要进行电压比较以进行逻辑电平的判断,因此从数据I/O总线上有数据输出之前的一个时钟上升沿开始,数据即已传向S-AMP,也就是说此时数据已经被触发,经过一定的驱动时间最终传向数据I/O总线进行输出,这段时间我们称之为tAC(Access Time from CLK,时钟触发后的访问时间)。
  tAC的单位是ns,对于不同的频率各有不同的明确规定,但必须要小于一个时钟周期,否则会因访问时过长而使效率降低。比如PC133的时钟周期为7.5ns,tAC则是5.4ns。
  需要强调的是,每个数据在读取时都有tAC,包括在连续读取中,只是在进行第一个数据传输的同时就开始了第二个数据的tAC。
    
    
 
  CL的数值不能超出芯片的设计规范,否则会导致内存的不稳定,甚至开不了机,超频的玩家应该有体会,而且它也不能在数据读取前临时更改。
  CL周期在开机初始化过程中的MRS阶段进行设置,在BIOS中一般都允许用户对其调整,然后BIOS控制北桥芯片在开机时通过A4-A6地址线对MR中CL寄存器的信息进行更改。
 
  不过,从存储体的结构图上可以看出,原本逻辑状态为1的电容在读取操作后,会因放电而变为逻辑0。
  所以,以前的DRAM为了在关闭当前行时保证数据的可靠性,要对存储体中原有的信息进行重写,这个任务由数据所经过的刷新放大器来完成,它根据逻辑电平状态,将数据进行重写,逻辑0时就不重写,由于这个操作与数据的输出是同步进行互不冲突,所以不会产生新的重写延迟。
 
  后来通过技术的改良,刷新放大器被取消,其功能由S-AMP取代,因为在读取时它会保持数据的逻辑状态,起到了一个Cache的作用,再次读取时由它直接发送即可,不用再进行新的寻址输出,此时数据重写操作则可在预充电阶段完成。
 
   2) 数据输入(写)
  数据写入的操作也是在tRCD之后进行,但此时没有了CL(记住,CL只出现在读取操作中),行寻址与列寻址的时序图和上文一样,只是在列寻址时,WE#为有效状态。
      
  从图中可见,由于数据信号由控制端发出,输入时芯片无需做任何调校,只需直接传到数据输入寄存器中,然后再由写入驱动器进行对存储电容的充电操作,因此数据可以与CAS同时发送,也就是说写入延迟为0。
 
  不过,数据并不是即时地写入存储电容,因为选通三极管,就如读取时一样,与电容的充电必须要有一段时间,所以数据的真正写入需要一定的周期。
 
  为了保证数据的可靠写入,都会留出足够的写入/校正时间(tWR,Write Recovery Time),这个操作也被称作写回(Write Back)。
  tWR至少占用一个时钟周期或再多一点,时钟频率越高,tWR占用周期越多。
 
   3) 突发长度
  突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,连续传输所涉及到存储单元(列)的数量就是突发长度(Burst Lengths,简称BL)。
 
  在目前,由于内存控制器一次读/写P-Bank位宽的数据,也就是8个字节,但是在现实中小于8个字节的数据很少见,所以一般都要经过多个周期进行数据的传输。
 
  上文讲到的读/写操作,都是一次对一个存储单元进行寻址,如果要连续读/写就还要对当前存储单元的下一个单元进行寻址,也就是要不断的发送列地址与读/写命令(行地址不变,所以不用再对行寻址)。
 
  虽然由于读/写延迟相同可以让数据的传输在I/O端是连续的,但它占用了大量的内存控制资源,在数据进行连续传输时无法输入新的命令,效率很低(早期的FPE/EDO内存就是以这种方式进行连续的数据传输)。
 
  为此,人们开发了突发传输技术,只要指定起始列地址与突发长度,内存就会依次地自动对后面相应数量的存储单元进行读/写操作而不再需要控制器连续地提供列地址。
 
  这样,除了第一笔数据的传输需要若干个周期(主要是之前的延迟,一般的是tRCD+CL)外,其后每个数据只需一个周期的即可获得。
 
  在很多北桥芯片的介绍中都有类似于X-1-1-1的字样,就是指这个意思,其中的X代表就代表第一笔数据所用的周期数。
 
      
 
    
 
  至于BL的数值,也是不能随便设或在数据进行传输前临时决定。在上文讲到的初始化过程中的MRS阶段就要对BL进行设置。
 
  目前可用的选项是1、2、4、8、全页(Full Page),常见的设定是4和8。
 
  顺便说一下,BL能否更改与北桥芯片的设计有很大关系,不是每个北桥都能像调整CL那样来调整BL。
 
  某些芯片组的BL是定死而不可改的,比如Intel芯片组的BL基本都为4,所以在相应的主板BIOS中也就不会有BL的设置选项。
 
  而由于目前的SDRAM系统的数据传输是以64bit/周期进行,所以在一些BIOS也把BL用QWord(4字,即64bit)来表示。如4QWord就是BL=4。
 
    
    
 
  另外,在MRS阶段除了要设定BL数值之外,还要具体确定读/写操作的模式以及突发传输的模式。
 
  突发读/突发写,表示读与写操作都是突发传输的,每次读/写操作持续BL所设定的长度,这也是常规的设定。
  突发读/单一写,表示读操作是突发传输,写操作则只是一个个单独进行。
 
  突发传输模式代表着突发周期内所涉及到的存储单元的传输顺序。
  顺序传输是指从起始单元开始顺序读取。假如BL=4,起始单元编号是n,顺序就是n、n+1、n+2、n+3。
  交错传输就是打乱正常的顺序进行数据传输。比如第一个进行传输的单元是n,而第二个进行传输的单元是n+2而不是n+1。
以上原理性内容来自网络。
 
系统向SDRAM写数据时,先将数据写入SDRAM控制器内的wrFIFO,当wrFIFO中的数据大于等于某一个数量时,再由SDRAM控制器向片外的SDRAM芯片执行突发写操作。
 一、将数据写入到wrFIFO的过程
该过程的仿真波形如下:
第一条黄线之前为系统向SDRAM控制器内的wrFIFO写数据。此时wrFIFO的wrf_wrreq写请求信号有效,将最后一个(第8个)数据0x0467(16bit)写入到wrFIFO,同时wrf_use(已写入的字数)变为8.
当wrf_use变为8的同时(根据设计要求,当wrFIFO中的字数大于等于8时,要将wrFIFO中的数据写入到片外SDRAM),向片外SDRAM发出写请求信号sdram_wr_req。
二、采用突发方式将数据从wrFIFO写到片外SDRAM的过程
突发写数据仿真波形如下图所示:
(a)当时钟上升沿时刻检测到sdram_wr_req输入信号为1时,work_state从0空闲状态转为ACTIVE状态(1状态)。
(b)当下一个时钟上升沿到来时,则发送ACTIVE激活命令和行、bank地址(这里全为0);同时向wrFIFO发送sdram_wr_ack信号,表示读请求信号;同时work_state从1状态转为2状态(W_TRCD状态:等待RCD延时结束)。
(c)当时钟上升沿时检测到cnt_clk=1时(表示TRCD延时周期结束),work_state从2状态转为7状态(W_WRITE状态);同时从wrFIFO中读取数据,通过sys_data_in输入数据线输入。
(d)下一个时钟上升沿到来时,则发送突发写命令,同时将输入数据sys_data_in捕捉到内部寄存器sdram_data,同时输出列地址0x400,其中A10=1,表示允许写完后允许预充电;同时work_state从7状态转为8状态(W_WD状态):
(e)下一个时钟上升沿到来时,继续将输入数据sys_data_in捕捉到内部寄存器sdram_data。注:在7和8两个状态下都会捕捉sys_data_in上的数据,实现突发写8个16bit数据。
(f)当时钟上升沿时检测到cnt_clk=6时,捕捉最后一个sys_data_in上的数据(突发写结束),同时work_state从8状态转为9状态(W_TDAL状态:写延时)。
(g)当时钟上升沿时检测到cnt_clk=3时,表示写延时周期结束,work_state从9状态转为0状态,整个突发写过程结束,SDRAM重新进入空闲状态。
 
 
通过串口来读取SDRAM数据的过程:将SDRAM中的数据读到rdFIFO中,然后再从rdFIFO中读取数据。
1、将SDRAM中的数据读到rdFIFO中
当rdFIFO中的字数小于某一值时,自动发出sdram_rd_req请求信号,要求读取SDRAM数据。
突发读取SDRAM数据
 
 work_state状态机依次进入1,2,3,4,5,6状态。各状态含义如下:
1状态下:发送ACTIVE命令,激活行地址和bank地址;2状态下:RCD延时状态;3状态:发送列地址和读数据命令;4状态:CL延时,即读延时;5状态:连续读取数据;6状态:自动预充电延时。
注意:在状态5即连续读数据状态下,当cnt_clk计数值为2~9之间时,要产生一个sdram_rd_ack信号,用于向rdFIFO发送写数据请求,即将连续读到的数据依次的写入到rdFIFO中。
 
2、当rdFIFO中有数据时,tx_start有效,通知串口从rdFIFO中读取一次数据,然后串行发送出去,发送完毕,再次产生rdf_rdreq请求信号从rdFIFO中读取一次数据,直到将rdFIFO中的数据全部发送出去。
 
 
 

转载于:https://www.cnblogs.com/qyl1999/p/4278248.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值