分为两种IP core : UNIPHY 和ALTMEMPHY
比较 UNIPHY 性能更好一点不支持cyclone系列芯片,,ALTEMPHY 支持所有altera支持DDR2的芯片
其实两种IP 使用方法相同
http://www.altera.com.cn/literature/hb/external-memory/emi_rldram_ii_ug.pdf
uniphy:IP核设置步骤:
Memory clock frequency:给DDR的时钟频率
1、对FPGA PHY设置
PLL reference clock frequency:FPGA时钟引脚输入的时钟,供DDR的PLL使用时钟频率(关键设置)
Full or half rate on Avalon-MM interface: FULL---verilog逻辑部分数据位宽X2,速度/2,,达到了降频的目的(关键设置)
Additional address/command clock phase:是否允许地址、控制信号有相位的移动(一般要设置,否则时钟采样有问题)
PLL sharing mode:指是否与IP核外部的PLL共用,如果共用的话会有相应的引脚从IP核引出----一般选择NO SHARE 不共用,使用单独的
PLL sharing mode:同上
OCT sharing mode:同上
2、对DDR 设置
memory vendor:厂家
memory format:discrete 分立器件(设计为单片DDDR) DIMM 内存条()
memory device speed grade :DDR2:速度等级,根据DDR 手册
total interface with:数据位宽度(根据设计填写)
DQ/DQS groups:一般8
number of chip selects CS: 片选的个数 一般为1个
ROW address width:行地址个数 13 (根据DDR 手册)
column address width:列地址个数(根据DDR 手册)
bank-address width:bank个数(根据DDR 手册)
ddr寄存器设置
mode register 0
burst length:突发长度
read bust type:突发类型--sequence顺序的--interle断续的 一般为sequence
CAS latency :CAS延时参数设置
mode register 1
output drive strength :输出电流强度(对信号的阻抗匹配有帮助)
memory ODT:设置DDR2的片上电阻值
到此-----------------------------------------------------------------
自己定制的DDR2/DDR3控制器就完成了-----------可以进行编译了-------------其中红色为关键设置
注意:随着IP核会产生很多tcl文件--------------必须运行引脚分配约束的TCL 否则无法编译通过
------------------
最后经过调试:心得
DDR2的IP使用调试非常简单,也非常稳定---------注意参考IP核的LOCAL信号的时序要求
DDR2
(
// inputs:
.pll_ref_clk(CLOCK_50),//input 输入给DDR2pll的时钟
.global_reset_n(rst_n),//input复位
// inputs:
.local_ready(local_ready),//output 为高时可以进行写--为低时DDR2忙
.local_burstbegin(local_burstbegin),//input 突发写开始--一个时钟周期
.local_address(local_address),//input [22:0] 读写的地址---包括行列bank地址的排列位数和
// read
.local_read_req(local_read_req),//input 读请求
.local_rdata(local_read_data),//output [63:0] 数据输出
.local_rdata_valid(local_rdata_valid),//output 输出数据的有效信号
// write
.local_write_req(data_en),//input data_en1,local_write_req 写请求
.local_wdata(local_wdata),//input [63:0] 写数据
//
.local_be(8'hff),///input [7:0] 是否屏蔽字节,8位 一位为一个字节
.local_size(4),//input [2:0] 突发长度1---7
.soft_reset_n(rst_n),//input
//output
.local_refresh_ack(),//output
.local_init_done(),//output
.reset_phy_clk_n(),//output
.aux_full_rate_clk(),//output
.aux_half_rate_clk(),//output
.phy_clk(phy_clk),//output 外部逻辑使用时钟
.reset_request_n(),//output
//outputs:
.mem_addr(mem_addr),
.mem_ba(mem_ba),
.mem_cas_n(mem_cas_n),
.mem_cke(mem_cke),
.mem_clk(mem_clk),
.mem_clk_n(mem_clk_n),
.mem_cs_n(mem_cs_n),
.mem_dm(mem_dm),
.mem_dq(mem_dq),
.mem_dqs(mem_dqs),
.mem_odt(mem_odt),
.mem_ras_n(mem_ras_n),
.mem_we_n(mem_we_n)
);
时序-----------------
写:突发为4--8个时钟周期延时较好
时钟: 1 2 3 4 5 6 7
给地址 写请求=1 写请求=1 写请求=1 写请求=1 写请求=0 地址加4
突发请求=1 突发请求=0 突发请求=0 突发请求=0 突发请求=0
数据1 数据2 数据3 数据4
写:突发为4--8个时钟周期延时较好
时钟: 1 2 3 4
给地址 读请求=1 读请求=0 地址加4
突发请求=1 突发请求=0
同有效信号一起出来4个64位数据
数据1 数据2 数据3 数据4