刚上研一时跟着实验室师兄做一个FPGA压缩算法实现 项目,算法采用最新的LPAQ压缩算法,FPGA采用xilinx KC705。
项目做了一年,到最后结尾的时候,测试性能,发现速度不能达标。师兄们顶着很大的压力进行各种尝试,却效果显微。
项目结束后师兄开始找工作,轮到我接着去改进这个压缩算法的硬件性能。老师给我的意见是在mig这块,用SDRAM替换DDR3 SDRAM也许能提升性能。毕竟之前的速度瓶颈在与mig的读延时过大,拖累的其他模块的流水线效率。
遂开始进行SDRAM与DDR3读写速度调研,发现DDR3虽然在突然读写大规模数据上速度远高于SDRAM,但是在离散型数据的读写情况下,读写速度和延时效果却不如SDRAM。而我们的工程中是大量的对离散的哈希地址进行读写操作。
于是我开始更改工程的mig模块,和与之相连的cache模块。思路是将8个数据位宽为32bit的SDRAM进行并联,达到之前DDR3一次读写256bit有效数据的效果。
代码更改完成后,发现第一次读SDRAM出来的数据就和正确工程仿真结果相异。仔细寻找出错原因,发现在于往SDRAM中进行写数据操作时存在问题,数据并没有写到正确的地址当中。
其实这个问题在我当初进行SDRAM调研时就已发现。在进行读写仿真时发现,第一个数据总是不能正确的写入第一个地址,而是将第二个数据写入了第一个地址,第一个数据丢失,同样最后一个地址没有写入数据。
今天又仔细研读了一下SDRAM的操作手册,发现出现这样的情况是有原因的。以下给出SDRAM操作手册中的写数据流控图:
wr_en信号有效时,在时钟上升沿才能采集到写入该地址的数据信息。
我之前采用的测试操作是:给出地址,并发出ACTIVE命令,然后给出有效数据,并给出SDRAM写操作。然后给出下一个地址,ACTIVE,然后是数据和WRITE指令......
这样操作的结果就是数据写入了上一个地址,而第一个数据和最后一个地址丢失:
为解决写错位的问题,有两种方法可以采用使得数据与地址对其。第一种方法是在发出WRITE指令后再给出一个NOP指令,使得数据在dq总线上延时一拍:
方法二是控制流控,在读写操作中寄存一个dq_reg信号,将这个信号在write信号给出一拍后再传入数据总线,也可以达到数据地址对齐的目的。使用该方法要注意流控,好处是写数据操作只
占用了2个clk,而方法一占用了3个clk,SDRAM工作频率一般是100MHz,方法二相当于在写操作减少了10ns,这个数值在工程项目中是很客观的。建议采用流控的办法来使得数据地址对齐。