1. 引言
内部存储器是用于存放当前待处理的信息和常用信息的半导体芯片。容量不大,但存取迅速。内部存储器包括RAM、ROM和Cache。RAM (随机存取存储器)是电脑系统的主存储器,人们习惯将RAM称为内存。RAM的最大特点是关机或断电数据便会丢失。内存越大的电脑,能同时处理的信息量越大。我们一般用刷新时间评价RAM的性能,单位为ns (纳秒),刷新时间越小存取速度越快[1] [2]。到目前为止出现过的内存规格主要有FPM、EDO、SDRAM、RDRAM以及DDR/DDR2 SDRAM等。DDR2 SDRAM 器件是DDR SDRAM系列的下一代器件。DDR2 SDRAM器件使用SSTL 1.8V I/O标准(DDR SDRAM是SSTL 2.5V I/O),并使用DDR架构实现高速运行。所以DDR2是在DDR技术基础上的改进,可以在较低的频率下具有更高的性能,更良好的稳定性、更低的功耗和更低的制造成本。与DDR相比,DDR2最主要的改进是在内存模块速度相同的情况下,可以提供相当于DDR内存两倍的带宽。技术上讲,DDR2内存上仍然只有一个DDR SDRAM核心,但是它可以并行存取,在每次存取中处理4个数据而不是两个数据[3] [4]。DDR2内存另一个改进之处在于,它采用FPGA封装方式替代了传统的数据存储方式。
2. 存储器芯片的选择及其原理框图
在电涡流传感器动态校准过程中,由于动态校准的最高频率为500 Hz,在一个周期内需要采集的数据点数设为200,则动态校准时需要的采样率为100 kSPS,如果选用简单的RS232通讯模块来进行数据传输,显然无法实现数据的实时传送,因此需要设计一个数据缓存器。在本装置的设计中选用的EP2C5Q208C8N核心板上附带有一片型号为HY57V641620的SDRAM,其存储容量大64 Mbit,能够满足存储器的设计要求,因此选用该芯片作为装置的存储器,控制系统存储器控制模块的原理框图如图1所示。
表1为HY57V641620芯片引脚说明,从引脚说明可以看出要实现对其进行数据主要是通过对片选信号/CS,行、列地址选择信号/RAS和/CAS,以及写使能信号/WE的控制来实现[5] [6]。在进行SDRAM控制器设计时,必须为SDRAM提供满足时序要求的控制信号,以准确地控制SDRAM的各种不同操作,其控制逻辑如表2所示[7] [8]。
3. 存储器的初始化和控制逻辑设计
3.1. SDRAM的初始化操作
系统在上电后要等待225 us。在等待时间到了以后至少执行一条空操作,空操作是为了让SDRAM的
Figure 1. Block diagram of the control system memory control module
图1. 控制系统存储器控制模块的原理框图
Table 1. Pin Description of HY57V641620 Chip
表1. HY57V641620芯片引脚说明
引脚 |
名称 |
描述 |
CLK |
时钟 |
芯片时钟输入 |
CKE |
时钟使能 |
片内时钟信号控制 |
/CS |
片选 |
禁止或使能CLK、CKE和DQM外的所有输入 |
BA0,BA1 |
组地址选择 |
用于片内4个组的选择 |
A12-A0 |
地址总线 |
行地址:A12-A0,列地址:A8-A0,预充电标志:A10 |
/RAS |
行地址选择 |
行、列地址锁存和写使能信号引脚 |
/CAS |
列地址选择 |
/WE |
写使能 |
LDQM,UDQM |
数据I/O屏蔽 |
读模式下控制输出缓冲,写模式下屏蔽输入 |
DQ15-DQ0 |
数据总线 |
数据输入输出引脚 |
VDD/VSS |
电源/地 |
内部电路及输入缓冲电源/地 |
VDDQ/VSSQ |
电源/地 |
输出缓冲电源/地 |
Table 2. SDRAM control logic table
表2. SDRAM的控制逻辑表
功能 |
/CS |
/RAS |
/CA |
/WE |
忽略命令 |
H |
X |
X |
X |
无操作 |
L |
H |
H |
H |
激活 |
L |
L |
H |
H |
读命令 |
L |
H |
L |
H |
写命令 |
L |
H |
L |
L |
突发中止 |
L |
H |
H |
L |
预充电 |
L |
L |
H |
L |
自动刷新 |
L |
L |
L |
H |
模式寄存器 |
L |
L |
L |
L |
各种数据线回到不操作的状态,以备后续使用。然后需要对所有芯片执行PRECHARGE命令,完成预充电。最后向每组内存芯片发出两条自刷新命令,使SDRAM芯片内部的刷新计数器可以进入正常运行状态。
3.2. 工作模式的设定
在进行模式设置时需要设置突发长度、突发类型、CAS延迟和读写模式寄存器。使用地址线A9~A0完成模式寄存器设置。其中A2~A0作为Burst长度,A3为Burst类型,A6~A4为CAS延迟。A8~A7为操作模式,A9为写Burst模式。模式寄存器的设置值如图2所示[9]。
在控制读写SDRAM的方式中,其读写方式分为突发读突发写和突发读单次写2种。在该系统中每次需要对SDRAM进行48位数据的读写,因此采用突发读写的方式。因为48位数据是连续地从SDRAM中读写,因此选择连续突发模式。同时SDRAM的突发长度可以设置为1、2、4、8,所以对48位数据选择的突发长度为4。通常可选的延时时钟为1,2,3个时钟,为了提高SDRAM工作的稳定性,选择3个时钟的延迟。因此模式设置命令为0001100010。
Figure 2. Mode register setting protocol
图2. 模式寄存器设置协议
3.3. SDRAM的读写操作
完成以上步骤后,SDRAM进入正常工作状态,等待控制器对其进行读、写和刷新等操作。在进行SDRAM控制时需要进行刷新是因为存储体中电容的数据有效保存期上限是64 ms,因此在使用SDRAM之前要执行自刷新的命令。等待需要写入数据的使能信号的上升沿,该使能信号由ADS1271数据采集模块提供,如果有上升沿到来,说明有数据要写入到SDRAM,则进入行激活操作。激活命令处于空闲状态存储体的任意一个行,使之进入准备写状态。如果没有写数据上升沿到来,则在这个状态等待。将空闲状态的行激活后需要写入列地址以确定需要写入的数据的存储地址,存储地址确定后将数据写入数据总线,完成一次数据的写入,然后进行一次自刷新,并判断需要写入的数据量是否已经写完,如果还有数据需要写入则等待下一个数据的到来,如果已完成所有数据的写入则结束对SDRAM的写操作。完成SDRAM的写操作后,数据被保存到SDRAM中等待被读取。当读使能信号到来时,对SDRAM数据进行读取,根据模式寄存器的设置要求,连续进行4次的读操作,由于数据为48位数据,因此最后一次读取的数据无效,在后期处理时会被删除。完成4次连续的读取之后,执行一次自刷新和空操作,完成一次48位数据的读取,依此循环,直至将SDRAM直至将SDRAM中的所有数据读完,从而完成对SDRAM的读写操作。SDRAM的写与读控制流程分别如图3和图4所示。
3.4. SDRAM工作状态的仿真验证
为了验证程序设计的正确性,通过Quartus II软件的Modelsim工具对SDRAM控制器的各个工作状态进行仿真验证。这里主要对SDRAM的模式寄存器的设置和SDRAM的读写操作进行仿真验证。
Figure 3. SDRAM write operation flowchart
图3. SDRAM的写操作流程图
Figure 4. SDRAM read operation flowchart
图4. SDRAM读操作流程图
在控制读写SDRAM的方式中,其读写方式分为突发读突发写和突发读单次写2种。在该系统中每次需要对SDRAM进行48位数据的读写,因此采用突发读写的方式。因为48位数据是连续地从SDRAM中读写,因此选择连续突发模式。同时SDRAM的突发长度可以设置为1、2、4、8,所以对48位数据选择的突发长度为4。通常可选的延时时钟为1,2,3个时钟,为了提高SDRAM工作的稳定性,选择3个时钟的延迟。因此模式设置命令为0001100010。
图5是模式寄存器控制的仿真图,图中高亮的两个信号分别为sdram_addr和state,此刻在竖线的state位置处表示在进行模式寄存器设置,而sdram_addr此时代表的是设置寄存器的具体值,即sdram_addr的第0-2位为010表示选择的是突发操作长度为4个字节。sdram_addr的第3位为0表示选择的是连续突发的操作。sdram_addr的第4~6位为011表示选择的是3个时钟的延迟。sdram_addr的第9位为0表示选择的突发模式。
SDRAM完成模式寄存器的设置后,进入写操作阶段,控制系统将从AD采集模块得到48位数据在采样完成后存储到SDRAM,因此在进行写SDRAM之前,首先需要得到AD采样数据有效标志信号,当该信号有效后,才能进入写SDRAM状态。在设计程序中en_write_rising表示AD采样完成后数据有效标志信号,该信号表示可以进行SDRAM写操作。data_need_write_to_sdram是从AD采样得到的48位采样数据。仿真图如图6所示,图中2个灰色标记信号分别为en_write_rising和data_need_write_to_sdram。
Figure 5. Simulation diagram of mode register settings
图5. 模式寄存器设置仿真图
Figure 6. Simulation diagram of waiting for read enable signal
图6. 等待读使能信号仿真图
在对SDRAM进行写操作时,先要对SDRAM的块进行激活,同时给定行选择信号和行数据,然后选择列信号及给定列数据。根据SDRAM协议块激活时sdram_csn和sdram_rasn为低,sdram_casn和sdram_wen为高。写操作时sdram_csn、sdram_casn和sdram_wen为低,sdram_rasn为高。仿真图如图7所示。
上图中灰色标记的信号分别为sdram_csn,dram_rasn,sdram_casn,sdram_addr,sdram_ba,sdram_data_inout,data_need_write_to_sdram和state,其中sdram_csn是片选信号,sdram_rasn选择行信号,sdram_casn选择列信号,sdram_addr是行或者列数据,sdram_ba是块数据,sdram_data_inout是SDRAM的16位双向IO数据信号,data_need_write_to_sdram是要写入到SDRAM的数据,state是控制SDRAM状态机的状态。在图中左边的竖线表示进入了块激活以及给了行选择信号及行数据,此时sdram_csn和sdram_rasn为低,sdram_casn和sdram_wen为高与SDRAM控制协议一致。仿真中给定data_need_write_ to_sdram为0000000006D8,为了便于仿真验证,在sdram_data_inout中将data_need_write_to_sdram的高16位、中16位和低16位分别进行加1存储、加2存储和直接存储。从图中右边竖线可以看出写操作时sdram_csn、sdram_casn和sdram_wen为低,sdram_rasn为高,与SDRAM控制协议一致,并将需要存储的数据正确地写入了SDRAM。
对SDRAM完成写操作后,通过上位机指令可以对其进行读操作。在进行读SDRAM操作之前,先要等待读使能信号上升沿到来,当有读使能信号上升沿到来后,对SDRAM进行一次空操作。空操作完成后进入激活列读取状态,将行选择信号拉低,在激活状态下,再进行一次空操作,进入准备读取状态,此时将列选择信号拉低,等待3个时钟状态,在3个时钟之后,连续读4次数据,由于存储的是48位的数据,因此最后一次读的数据是无效数据,将其删除。在读完4次数据后,进行一次自刷新,完成一次读操作。该部分的仿真图如图8所示。
Figure 7. Simulation diagram of write operation
图7. 写操作仿真图
Figure 8. Simulation diagram of read operation
图8. 读操作仿真图
该图中灰色标记信号是读SDRAM需要主要的信号,当en_read_rising为高后,控制SDRAM的状态机state进入了NOP7,也就是等待一个时钟的空操作状态,紧接着控制SDRAM的状态机state进入了激活列读取状态,按照SDRAM协议,该状态需要sdram_cke,sdram_casn,sdram_wen全部置高,sdram_csn、sdram_rasn全部拉低,sdram_ba、sdram_addr是当前要读取的块和行的相应的地址数据,这部分在仿真图中即当state==READ_BANK...部分,在激活之后,再进入一个空操作状态,然后再继续进行读操作,此时是提供列选择信号和列地址数据,sdram_cke、sdram_rasn、sdram_wen全部置高,sdram_csn、sdram_casn全部拉低,sdram_ba 和sdram_addr分别是块数据和列地址数据,在仿真图中即是state==READ_DATA...处,在该状态之后进入3个时钟的延迟,之后紧接着就进入了读取数据的状态,读取数据时sdram_cke、sdram_rasn、sdram_casn、sdram_wen全部置高,sdram_csn拉低,sdram_ba、sdram_addr高阻态,并且这个读操作状态保持4个时钟之后,再次对SDRAM进行一次自刷新,此时状态为state==AUTO_REFRESH4,各信号值sdram_cke、sdram_wen置高,sdram_csn、sdram_rasn、sdram_casn拉低,sdram_ba高阻,sdram_addr全部为0。至此完成4次突发读取SDRAM的操作。
4. 数据存储模块的实验研究
由于在校准装置的设计中,通讯方式选用的是RS232的串口通讯,波特率选择9600 bps,在电涡流传感器动态校准中数据采集速率为100 kSPS,显然使用RS232进行数据传递时,无法实现数据的实时传送,所以设计了一个存储容量为64 Mbit的存储器。对存储器的实验研究是为了确保存储器中数据读写的稳定性。在进行存储器的实验时,为了验证存储器数据写入和数据读取的正确性,给SDRAM写入个数和数值确定的数据,然后进行读取,观察读出的数据的个数和数值是否与给定的数据一致。同时本实验也验证了控制系统对SDRAM数据写入与读取的个数的控制的正确性。具体实验方法如下。
(1) 通过编写一个数据生成程序,以1 Mbps的速率写入1000个数据给SDRAM。1000个48位数据从000100020001以3作为增量逐渐递增至0001000200BE,然后循环。
(2) 通过上位机软件发送指令给SDRAM控制器,对存储的1000个数据进行读取,在上位机上显示读取的数据并绘制波形,同时对读取的数据个数进行计数。
(3) 观察读出的数据及数据量与写入的数据是否一致。
Figure 9. SDRAM read/write verification experiment results
图9. SDRAM读写验证实验结果
(4) 在上位机中控制读取的数据量大于写入SDRAM数据量,观察是否在读取写入的数据量后不再有数据被读取。从而验证控制系统对写入SDRAM的数据量的控制。
(5) 在上位机中控制读取SDRAM的数据量小于写入SDRAM数据量,观察是否读取了指令规定的数据量。从而验证控制系统对读出SDRAM的数据量的控制。
通过对SDRAM读写的实验,从图9可以判断数据存储器能够按照控制指令正确的完成数据的读写操作,并且从图10和图11可以判断SDRAM控制器对写入和读出SDRAM的数据量实现了正确的控制,能够根据使用者的需求实现其存储容量范围内任意数据量的写入和读出操作,因此数据存储器的设计满足使用要求。
Figure 10. Experimental results of lower-level machine controlling the amount of SDRAM data read
图10. 下位机控制读SDRAM数据量实验结果
Figure 11. Experimental results of lower-level machine controlling the amount of SDRAM data written
图11. 下位机控制写SDRAM数据量实验结果
5. 结论
本文以电涡流传感器动态校准作为应用场景,设计了基于SDRAM的数据存储器,并通过在LabVIEW软件的仿真对数据存储器的读写功能进行验证,仿真结果表明能够根据使用者的需求实现其存储容量范围内任意数据量的写入和读出操作,因此数据存储器的设计满足使用要求。