DDR的存储单元[2]按照块(BANK)、行(ROW)、列(Column)地址分布,支持最大猝发操作为8个存储单元,每次切换块、行地址必须首先进行充电状态(Precharge)来关闭当前操作的块、行中的存储单元,并且在进行新的操作时首先要激活操作单元所在的块和行,控制器在工作空闲状态下发出激活命令(ACTIVE)进入激活状态,在此状态下等候应用层发送的控制命令以进行数据操作。
由以上分析可知:由于存在猝发长度限制及块和行地址切换等控制时间开销,DDR的随机操作的数据吞吐量实际上是有限的,不适合高速图像缓存这种应用环境,必须设计一种新的猝发模式来提高数据吞吐量。本文结合DDR充电以及图像缓存的特点,提出并实现了一种一次操作DDR一行、一行1 024个存储单元的猝发模式,由于DDR只支持2、4、8长度的猝发模式,设计中采用了猝发长度为4的连续猝发方式,核心思想是在一次猝发正在进行的时候又发起操作命令从而使得该次猝发后连续进行下一次猝发。实现了一次连续操作2KB数据的高吞吐量操作。如图2状态机所示,当一行操作完后则进入空闲状态,然后再进行自动刷新和充电的操作。这种猝发模式一次猝发只需要一次充电操作,而猝发长度为8的猝发模式完成2KB的数据传输共需要进行125次充电操作,而一次充电操作需要几个时钟周期开销,相比较而言,大大节省了控制开销,提高了数据吞吐量。
1.2 应用层控制模块
本设计将DDR作为FIFO的容量扩展来实现高速缓存,这需要内部产生地址逻辑。在应用层控制模块中,负责接收用户接口模块送过来的命令信号,并对命令进行译码。判断当前命令与上次命令一样的时候地址继续累加产生,当前命令与上次命令不同时则地址复位,重新从DDR的零地址开始操作,这样符合FIFO的工作特点。模块产生DDR的地址信号和物理层的控制信号,并根据地址逻辑产生DDR状态信号反馈到用户层接口。
1.3 用户层接口模块
用户层接口模块[3]负责接收图像输入数据,并提供简易用户接口,屏蔽了内部控制的复杂性,在用户看来对该DDR的操作实际上就是对FIFO的操作,判断DDR内部产生的DDR状态信号,发出缓存或者数据读出命令。
用户接口层模块方框图如图3所示。当用户发出缓存命令时,内部状态机自动监测图像帧的开始位置并将一帧中的几行数据写入“输入FIFO”,当此FIFO达到一次猝发操作数据量2KB时,状态机发出DDR写命令到下一层,并一次性读完输入FIFO的数据。图像数据连续向“输入FIFO”输入,状态机不间断地检测“输入FIFO”的编程状态信号并发出DDR写命令。由于图像数据存在行场消隐期以及DDR的行猝发写操作效率高,因此在一定的像素时钟条件下不会出现数据堵塞情况。
当用户发出读出命令时,状态机自动检测“输入FIFO”的状态,在可编程空信号有效时一次性向“输出FIFO”输入2KB数据,此时“输出FIFO”输出数据有效信号以提示用户可以进行数据读取。用户从DDR读出数据操作实际上就是对FIFO的读操作,因此用户只需要提供读FIFO使能信号以及读FIFO时钟就可以将DDR内部的数据依次读出。当用户快要将FIFO的数据读空的时候,状态机发出读命令从DDR存储器中一次性读出2KB数据存入“输出FIFO”中,由于DDR读的峰值速度高达400MB/s(100MHz×2B×2),而用户接口读速率一般不超过这个值,因此不会出现数据堵塞情况。
该模块完成了用户接口、图像输入、控制器三个时钟域的设计,极大地简化了用户接口的操作。良好的功能模块化划分,使得用户只需按照具体要求对图像输入接口进行简单修改便可实现对于任何数据源的缓存,拓宽了该缓存技术的应用范围。
1.4 时钟管理单元模块
本设计DDR控制器时钟频率[4]为100MHz,在各模块中时钟相位可以不同。因此时钟管理模块对时钟输入信号进行90°、180°、270°等相移,设计中可以采用FPGA的数字时钟管理单元(DCM)。该模块产生复位信号,当上电复位该模块自动检测复位信号,并延迟200μs产生控制器所需要的复位信号。
2 性能测试
使用VHDL语言[5]在ISE7.1i软件环境下完成整个模块的设计,综合后共占14%的芯片Slice资源,最高时钟频率可达156.5MHz。在基于Xilinx的VirtexIIpro硬件平台上加载测试,硬件平台中使用的DDR为Micron公司的MT46V32M16芯片,晶振为100MHz。
为测试该设计的最高平均缓存速度,采用逻辑分析仪采集控制器内部工作时的数据传输状态。发现一行数据的猝发共需要512个时钟周期,而刷新、充电、状态等待等时钟开销只需要不到50个时钟周期,因此,实际平均数据吞吐量为理论峰值速率400MB/s×512/(512+50)≈360MB/s。
为测试该图像缓存的数据记录的完整性,向该模块输入模拟产生的相机数据。8位灰度图像大小为512×512,图4为从DDR器件中读出的缓存图像。
本文设计并实现了一种基于DDR的高速图像缓存。创新地采用了行猝发操作以提高数据吞吐量。在100MHz的时钟条件下实现峰值传输速率400MB/s、最大平均传输速率360MB/s的图像缓存。在提高时钟频率的情况下数据传输率还有上升空间。同时用户可根据需求对输入接口进行修改以应用于特殊要求的数据缓存,应用广泛。