环境说明
由于项目设计需要,在FPGA上挂载了一个1G的DDR2 SDRAM,型号为MT47H64M16,FPGA为Cyclone IV E系列。要用DDR2实现多个GMII高速输入的缓存。
DDR2驱动需求:
1、最大限度的提升DDR2的吞吐率。
2、支持多通道、不同类型、不同位宽的数据。
3、支持FIFO和RAM两种接口。
结构
-->FIFO[0]---->|--->---\ /-->FIFO'[0]---->
-->FIFO[n-1]-->|--->----\ /--->FIFO'[n-1]-->
|--->[ID,WRaddr,RDaddr,ExistNum]--->[DDR2]---->|
-->RAM[0]---->|--->----/ \--->RAM'[0]---->
-->RAM[m-1]->|--->---/ \-->RAM'[m-1]->
关于速度方面的考虑
根据<ug_ddr_ddr2_sdram_hp.pdf>的Interface Description章节的描述,可以知道,Consecutive Write/Read将会有更高的吞吐率,而Consecutive Write/Read在一个ROW内的操作,因此,尽量减少row的切换将有效提高DDR2的吞吐率。
在这里,我们采用突发长度为2,Full-Rate模式,即local端,数据结构为32比特,不超过单个M9K的最大位宽(36比特)。
因此,我们在对连续地址的数据进行读写时,尽量按尽可能多的突发的操作进行。就是,一次性进行1~N个突发读或突发写操作。
在Cyclone IV E中,基本RAM单元是M9K,可配置成256x32bits的模式,因此,输入缓存可以最大缓存128个突发操作。设计时,同样需要考虑数据的延迟、读空。
较大的连续突发操作,能够抵抗输入最大的突发性;较小的连续突发操作可以保证FIFO中的数据可以被完全读出。
设计伪随机序列进行验证,在125MHz(Cyclone IV E中最大时钟频率167MHz)的时钟下,突发连续突发操作为1,DDR的吞吐率大约在800Mbps,在突发操作为2的情况下,DDR2的吞吐率大约在1Gbps,其余待验证。
最后
格式很乱,还是习惯用typora做项目文档,详细设计将在调试完成后一起上传。