Lattice 的 DDR IP核使用调试笔记之DDR 的 仿真
—— 远航路上ing 整理于 博客园。转载请标明出处。
在上节建立完工程之后,要想明确DDR IP的使用细节,最好是做仿真。然后参考仿真来控制IP 核。
仿真的建立:
1、在IP核内的以下路径找到以下三个文件加入并设置为仅仅仿真。这三个文件的作用是作为外部监视和仿真头文件(test_mem_ctrl).
2、在IP核内部的以下路径内将以下两个文件加入到工程里,设置为仅仅仿真。这两个文件的作用是模拟外部DDR器件,并存储数据。
、
3、加入之后,基本就是下图这样的了。
4、然后建立仿真工程。并调用Modelsim仿真.在Modelsim里第一次自动运行仿真的时候,会出现下面的错误。双击错误的信息,会弹出
错误文件的错误提示。基本都是找不到参数文件,只要把参数文件copy到testbench的工程里就可以了。
5、在IP核的以下路径内找到ddr3_sdram_mem_params.v文件,copy到testbench的工程下。
还有就是以下三个文件都要copy到testbench的工程目录下。
还有个是模拟外部DDR的参数,否则ddr3.v和ddr3_dimm_16.v就会出现错误。
接着打开modelsim内的ddr3_dimm_16.v文件,在顶部加入下面两个参数声明(原来是没有这连个参数声明的)。
最好在DIamond的软件的工程内也把这个文件修改了,这样下次再使用这些文件建立新的仿真的时候就不需要加入这个参数声明了。
在没有加入“tb_config_params.v”的声明的时候,ddr3_dimm_16.v文件会出现下面的报错。这是因为蓝色方框内的参数都在“tb_config_params.v
内声明的。
最后,可以再次在MODELSIM中编译一下全部文件,如果没有错误,则就出现下面的提示,如果有错误,则需再次修改。
在顶层文件test_mem_ctrl.v文件的底部还包括了下面两个我们已经加入的文件。这两个是任务声明文件。
包括了仿真步骤和仿真任务的产生。
testecase里面是仿真的步骤:
1)、先是IP核的设置。可以看到都是用了任务名。比如:reset、init、self_ref等等。而这些任务的具体操作步骤都可以在cmd_gen.v的文件内找到。
2)、设置MR0(只是设置了MR0),然后就会读写数据。具体参数含义还是要看cmd_gen.v文件。
3)、改变突发长度只需要设置MR0即可。
4)、设置为OTF模式,突发长度由otf_bit参数决定。
5)、设置为OTF模式并且burst_cnt可以改变。
6、运行仿真,并且将仿真进行到自动停止。观察仿真波形。
1)、初始化完成
2)、设置IP核。
3)当cmd==2 的时候开始写数据。cmd_rdy = 1,则命令被接受。
写入的第一个数据'Hd82d5c69ea418124,然后在数据线上四位一个数据,从低位向高位写起。'h8124,'hea41,'h5c69,'hd82d.依次被写入到DDR芯片内的
第一个地址、第二个地址、、、等。
burst_length 为4, burst_count 为15的情况。
2)、读取数据的操作的情况。
3)、读取数据操作和写入数据操作的区分可以是:em_ddr_dqs信号。在写操作时,em_ddr_dqs先变为11,再变为00,当再次变为11时就开始了
写入第一个数据。当读取操作时,em_ddr_dqs先是变为00,然后再保持一个时钟,然后变为11,开始读取第一个数据。所以根据这可以判断出下图
左边是读取操作,右边是写入操作。
4)、下图是burst_length = 4,brust_count = 15的情况下读数据操作的波形图。
值得注意的是:;::DDR IP核可以记忆若干读写操作,然后按顺序执行读写操作而不会混乱,这样可以大大节约DDR的操作时间。在进行读写操作的时候依然可以处理ddr的命令。