资源描述
SDRAM的控制时序
SDRAM需要正确的上电逻辑和模式设置来进入期望的工作模式。访问特定的逻辑单元必须先激活相应的存储块,并锁定对应的行列地址。另外,必须有定时的刷新逻辑保持数据不丢失,SDRAM有多种操作模式,由引脚CS#、RAS#、CAS#、WE#和地址信号的不同状态来决定,SDRAM控制器必须为SDRAM提供满足时序要求的这些控制信号,以准确地控制SDRAM的各种不同操作。
图1 SDRAM操作命令表
SDRAM初始化和模式设置
SDRAM的所有电源引脚必须同时加电,并且所有输入和电源引脚上电电压不得超过标称值0.3V。加电完成后应等待100us之后再对所有BANK进行预充电,等待期间要求CKE保持高电平。
预充电之后要执行两个自动刷新命令,之后发出模式设置命令以初始化模式寄存器。由于在上电后模式寄存器的状态是不确定的,所以在进行SDRAM操作之前一定要先设置模式寄存器。
模式设置命令使用地址线A10~A0作为模式数据输入线。其中A2~A0作为Burst长度,A3为Burst类型,A6~A4为CAS延迟。A8~A7为操作模式,A9为写Burst模式。模式寄存器的设置值必须与器件的延迟参数以及读写操作的控制时序一致。模式寄存器的设置值如下表所示。
图2 模式设置值
SDARAM的读写控制逻辑
为了减少IO引脚数量,SDRAM复用地址线A0~A11。对SDRAM的访问要以激活命令开始,随后才能发出读或写命令。同激活命令同时出现的地址位用来选择所要访问的块和行,其中BA1,BA0用来选择块,A0~A11用来选择所要访问的行,同后面读写命令一起出现的地址位用来选择一个Burst所要访问的起始列。在读命令发出后到第一个有效数据出现之间有一个间隔,即为CAS反应时间,CAS可以设置成1、2或3个时钟。
对SDRAM的读写操作一般以Burst模式进行,Burst的长度可以设置为1、2、4、
8以及全页面,最常用的Burst长度是8个。
刷新逻辑和预充
为了保持SDRAM上的数据不丢失,必须定时刷新,刷新计数器决定了刷新的时间间隔,刷新计数器要保证每个单元都能按一定周期刷新。SDRAM提供两种类型的刷新模式:自动刷新和自刷新。在自动刷新是在正常的操作中进行的,但不持久,因此需要定时进行刷新,这样就会占用系统资源,降低系统性能。而自刷新模式下无需系统时钟而保持数据不丢失。相比较两种模式,自动刷新实现较为简单而自刷新功耗更小。
预充命令是用来对BANK预充电或关闭已激活的BANK。当CS、RAS、和WE为低电平而CAS为高时为预充命令。SDRAM既可以分别预充特定BANK也可以同时作用于所有BANK。
下面是带自动预充的Burst读写时序图:
图3 带自动预充的Burst读时序
基于FPGA的SDRAM控制器设计
SDRAM的控制时序是很复杂的,上面所列出的远非全部。但针对特定的系统不可能把所有的功能都用到,只是用到部份必要的功能。笔者针对系统设计的需要定制了必需的S DRAM的功能,如下所示:
1. 支持Burst长度为8的读写操作。
2. 自动刷新
3. 初始化
4. 读、写、自动刷新和初始化之间的优先级仲裁机制以及转换机制。
具有以上功能的SDRAM控制器可以满足系统对SDRAM访问的需要,同时舍去了对
系统无用的功能。这样不仅可以减小开发难度,还可以节省系统资源和成本,提升系统的性能。下面分别阐述每项功能的设计要点:
初始化
上电之后外部产生Reset命令送给SDRAM控制器,SDRAM控制器由此进入初始化状态。对SDRAM进行初始化执行一系列操作,完成上电、预充电、自动刷新和模式寄存器设置,在进行Verilog程序设计时,可以通过状态机来实现这一过程。
图4 初始化状态机
其中NOP指的是空操作,具体等待长度可以查看相关芯片资料,在此不作详述。
自动刷新
SDRAM要求定时进行刷新,以保持数据不丢失,以MICRON的MT48LC4M32B2YG-7芯片为例,共需4K刷新周期/64ms,即每15.625us刷新一次才能满足需要。SDRAM采用的是33M的 PCI总线时钟,即每420个时钟周期启动一次刷新命令,为此本文在SDRAM控制器中设置一个定时器,每计数到420便发出刷新命令。
同样刷新操作也是由一系列SDRAM命令来组成的,每次启动刷新操作时要先进行预充电,随后再执行两个自动刷新命令即完成一次刷新操作。在Verilog中可用如下状态机来实现自动刷新:
图5 刷新状态机
读写控制逻辑
SDRAM采用地址线行列复用技术,对于存储器单元的访问基于页面,而外部地址线总线是独立的,与SDRAM的地址线并不能直接相连,这样就需要SDRAM控制器提供一种地址映射,在外部地址和SDRAM内部地址线之间建立对应关系,为此本文将外部地址的高位映射到SDRAM的行地址,低位地址映射到SDRAM页面内的列地址。
控制器在NOP状态下等待存储器读写信号出现,然后进入激活状态,控制器激活指定的BANK(由BS0,BS1决定),同时进行行地址锁定。此时存储器地址线提供A11~A0共12位的行地址。SDRAM完成行地址锁定后,再经过一个周期的延迟即可以进行列地址锁定。在列地址锁定周期存储器地址线提供列地址。
由于读SDRAM需要有CAS反应时间,所以读写之间的时序并不完全相同,在完成行列地址锁定后,写操作的有效数据是在下一个时钟周期即可给出的,不需要等待。而读操作的有效数据出现要根CAS反应时间来决定,如果CAS反应时间为2,则读有效数据要在读命令之后两个时钟周期后才能出现。两种操作的不同在状态机上可以很清楚地表示出来:
图6 读状态机
图7 写状态机
仲裁机制
为了合理地控制和管理系统中对SDRAM的访问操作,SDRAM控制器必须实现一个特别的优先级仲裁算法,以便在外部设备同时提出多个SDRAM操作时,能依据该仲裁算法判决出哪个操作应获得对SDRAM的控制权。SDRAM控制器可以确保在任何时刻系统中最多对SDRAM进行一种操作。而决不会出现多个操作同时占用SDRAM从而造成冲突的情况。
由于SDRAM仲裁算法从根本上说与SDRAM技术无关。所以设计者可以根据实际需要,自由地进行选择和修改。
SDRAM优先级仲裁算法通常有两种:一种是固定优先级算法,一种是循环优先级算法。但不管哪一种仲裁算法都必须满足以下三个基本要求:
1. 每一时刻只能对SDRAM进行一种操作。
2. 先请示者先响应,且在一个操作周期内不被打断。
3. 同一时刻有多个操作时,按优先级排序。
固定优先级算法的优先级是事先定义好的,在仲裁过程中优先级顺序是不变的,而循环
优先级算法的优先级在仲裁中过程中过程优先级顺序不是一成不变,而是随一定规律变化。相比较来说循环优先级算法比较灵活,各种操作占用SDRAM的机会均等,在一定意义上循环优先级算法是最公平的算法。但是循环优先级算法在处理大批量实时数据时会造成效率的降低,特别是笔者所设计的SDRAM控制器是应用在实时图像处理系统中的,对数据处理效率要求很高。此外循环优先级算法复杂,占用的系统资源比较多,设计难度也较大,而采用固定优先级算法对那些有重要数据访问,或有大量实时数据操作以及经常需要占用SDRAM的操作赋于较高的优先权,因此在这个SDRAM控制器的设计中选用固定优先级算法。对以上四种SDRAM的操作,本文规定优先级如下:
初始化>刷新>读>写>其它操作
运行时,外部设备要对SDRAM进行一种操作时需要先发送占用请求,SDRAM仲裁器接收到占用请求后,按仲裁算法予以响应。
这个仲裁机制可以很方便地用Verilog语言描述
SDRAM控制器设计在FPGA上的实现
本文所设计的SDRAM控制器基于Verilog语言编写程序,并采用模块化设计,整个设计分为初始化模块,刷新模块,命令请求模块,命令产生模块以及命令仲裁模块,各模块之间通过函数接口连接。仿真后的图形如下:
图8 在FPGA上的仿真波形
本文设计的实现平台为Altera公司的ACEX系列FAPGA芯片EP1K100QC208-1,芯片资源为4992个逻辑单元,50K RAM。所采用的开发软件为QuartusII 2.1,采用synplify软件进行综合优化。
经过综合,系统时钟为85MHz,可以支持66M的PCI总线操作,占用50个逻辑单元和3K RAM,仅占用5%左右的系统资源,这个SDRAM控制器的设计作为整个图像处理系统的子模块最大限度地节省了系统资源,整个系统下载到FPGA后运行性能良好,SDRAM的数据读写速度完全满足系统需要,能够较好地完成SDRAM与图像处理模块之间的数据交换。
参考文献:
1.SDRAM控制器的VHDL实现,陈飞,电子产品世界。
2.微型计算机原理与应用,易先清,莫松海,喻晓峰,电子工业出版社。
3.数字电路设计与VerilogHDL 张亮,人民邮电出版社。
展开阅读全文