**
一,生成DDR2IP核
如何建项目就不多赘述,直接到DDR2的部分–
1.1接下来点击 tool -> MigWizard…
进入IP管理界面
1.2点击NEXT
1.3选择DDR2IP核
因为QUARTUS的文件很乱,所以最好是在项目文件夹里建一个子目录,这里我们将其命名为ipcore用于存放IP核的文件
1.搜索DD2关键字
2.选择对应的IP
3.将其放入我们新建的文件夹并且命名为ddr2_32b(因为开发板上是两片DDR2,位宽有32位)
1.4点击NEXT
1.5配置参数
参数的各个意思可以参考《ug_ddr_sdram.pdf》也可以参考这篇博文
一直到生成IP核这篇博文都有详细的说明,所以直接到自己写代码的部分
**
二,编写简单的读写测试代码
2.1代码目标
部分信号解释:
“phy_clk”留给用户的操作时钟
不断写入突发长度为4的数据 然后将其读出。
“local_init_done ”初始化完成后为高可作为复位信号使用
“local_burstbegin ”表示开始一次突发操作,无论mem_local_ready为高还是为低(前提是初始化完成)
“mem_local_ready”这个信号是表示能接受请求,高电平有效
“local_read_req” 读请求,不能与写请求同时为高 只用在mem_local_ready为高时保持一个高时钟周期,否则会进行多次突发(可以自己尝试)
“local_write_req” 写请求,不能与读请求同时为高 并且在写的时候要一直为高并且保持为突发长度那么多个时钟周期
“local_address ”不要求在突发时跟随时钟变化,因为其一开始就被锁存,在IP核内部进行自加
module ddr2wrtest (
input clk , // Clock
input global_reset_n , // Asynchronous reset active low
output [ 12: 0] mem_addr ,
output [ 2: 0] mem_ba ,
output mem_cas_n ,
output mem_cke ,
inout mem_clk ,
inout mem_clk_n ,
output mem_cs_n ,
output [ 3: 0] mem_dm ,
inout [ 31: 0] mem_dq ,
inout [ 3: 0] mem_dqs ,
output mem_odt ,
output mem_ras_n ,
output mem_we_n
);
parameter LEN = 4; // 突发长度 4
parameter IDEL = 5'b00001; // 空闲态
parameter WRITER = 5'b00010; // 准备写
parameter WRITING = 5'b00100; // 写状态
parameter READR = 5'b01000; // 准备读
parameter READING = 5&#