在官网下载DDR3 Demo后regenerate IP核,使用Active HDL对demo进行仿真,观察波形,发现cmd_burst_cnt设置为0(突发长度32)时,每个写命令会写64个write_data,对此产生了疑问,印象中使用ISE 编写XILINX SP6 DDR3的用户逻辑时,突发长度为32会写32个用户数据进DDR。为了弄明白Lattice DDR3的这个问题,反复设置了几次IP。
实验一
1.当bl=8,DQ位宽设置为16,cmd_burst_cnt=0时;write_data位宽为64。
观察仿真波形可以看出,每发1次WRITE_CMD命令,write_data发送了64个64位的数据,发送的数据量为64*64bit。
em_ddr_addr增加了32*8=256(个)。
(64*64= 16 * 256.)
2.当bl=8,DQ位宽设置为32,cmd_burst_cnt=0时;write_data位宽为128。
观察仿真波形可以看出,每发1次WRITE_CMD命令,write_data发送了64个128位的数据,发送的数据量为64*128bit。
em_ddr_addr增加了32*8=256(个)。
(64*128= 32 * 256.)
3.当bl=8,DQ位宽设置为8,cmd_burst_cnt=0时;write_data位宽为32。
观察仿真波形可以看出,每发1次WRITE_CMD命令,write_data发送了64个32位的数据,发送的数据量为64*32bit。
em_ddr_addr增加了32*8=256(个)。
(64*32= 8 * 256.)
通过以上实验总结出:DQ位宽为8时,em_ddr_addr增加1,存入8bit数据;
DQ位宽为16时,em_ddr_addr增加1,存入16bit数据;
DQ位宽为32时,em_ddr_addr增加1,存入32bit数据;
也就是DQ位宽是多少,Lattice DDR3的每个物理地址存入的数据就是多少bit。
以上实验弄明白了,Lattice DDR3的每个物理地址存多少bit数据的问题,以及cmd_burst_cnt=32时,为什么每发一次WRITE_CMD就要发送64个数据(发64个数据才能将此次增加的DDR3的物理地址刚好写满)。
接下来还有一个问题,就是设置IP核的时候有一个BL选项,可以设置为BL=8和BL=4.想弄明白不同的BL值有什么影响,于是继续做实验。
实验二
1.设置BL=4,cmd_burst_cnt=0,DQ位宽=16.
观察仿真波形看到,每发一次WRITR_CMD,em_ddr_addr增加32*4=128个。说明BL=4时一个突发长度地址增加4,BL=8时一个突发长度地址增加8.
从仿真波形也可以看到,datain_rdy是交替置1的,虽然write_data发送了64个64位的数据,但写入DDR的只有32个。
写入DDR的数据量=32*64bit = 16*128,这与实验一的结论是吻合的。