一、创建IP核
以管理员方式打开QUARTUS II 13.0,新建一个工程,打开MegaWizard plug-in manager
找到interface>>external memory>>ddr2,选择第二个IP核,IP核地址选择放在工程同一个文件夹下,
等待IP核设置GUI跳出来,win7系统下该图形界面显示不全,可以先将屏幕分辨率调制最低,再将分辨率恢复即可。
Device family 和speed grade根据自己的FPGA类型设置,pll参考时钟频率根据实际情况设置,我的是以板载50MHz时钟源作为PLL的参考时钟,存储器工作频率根据需要设定,我这里设为133.3MHz(设为166.67和200后续全编译时序会报错),
对于全速率和半速率:当器件的工作时钟和控制器的工作时钟(phy_clk)相等时,即为全速率,此时本地接口的local_wdata的宽度为dq宽度的两倍,因为时钟上升下降沿均写数据;
当器件的工作时钟是控制器(phy_clk)的工作时钟的两倍时,即为半速率,此时本地接口的local_wdata的宽度为dq宽度的四倍
根据自己DDR2的器件类型修改“Memory Presets”的参数。详细的可以参考这篇博客https://www.cnblogs.com/xianyufpga/p/13074382.html#4622838。
后面一直点next,直到这个界面,勾选“Generate simulatuon model”,待会前仿真的时候要用到。
点击finish,等待一分钟左右IP核就生成了。
将ddr2_example_top.v和ddr2_example_driver.v这两个文件添加进来,并将ddr2_example_top.v设置为工程顶层,ctrl+k分析和综合后设置仿真。
将生成的testbench文件夹里找到ddr2_example_top_tb.v,将其设置为仿真文件,并将仿真模型ddr2_mem_model.v添加进去。
点击RTL Simulatuion,开始前仿真。
二、使用IP核
对于用户而言,需要关注的是本地local接口信号,二不再需要关注复杂的DDR2的读写刷新初始化时序。
[ 24: 0] local_addr; //本地接口读写地址。我的DDR2行地址13位,bank地址 线3位,列地址10,加起来一共26位,但是每次读写都是上升沿和下降沿分别进行一次读写,因此列地址的最低位每次读写都是0 1 0的循环,可以忽略,只需关注列地址高9位即可,所以会省略一位,变成25位。
[ 3: 0] local_be; //字节使能信号,每一位使能一个字节数据,一般默认全1
[ 31: 0] local_rdata; //本地接口读出数据
local_rdata_valid; //本地接口读数据有效信号,和local_rdata同步
local_read_req; //本地接口读请求,每次读突发,在local_ready为高的前提下要保持一个时钟周期的高电平即可
local_ready; //本地接口读写请求握手信号,为高表示处于空闲或者读写请求被接收
[3:0] local_size; //本地接口突发长度(以local_wdata为单位)
[ 31: 0] local_wdata; //本地接口待写入数据
local_wr_req; //本地接口写请求,在local_ready为高的情况下,local_wr_req要保持local_size个时钟周期的高电平。
具体的本地接口信号时序见下图,图片来自博客https://www.cnblogs.com/xianyufpga/p/13080797.html
通过以上图片,本地接口的时序基本可以弄清楚了。
这里我自己编写了一个本地接口控制时序,替换了ddr2_example_driver.v,将原有的多余信号删除,前仿真也通过了。注意还是