分为两种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
|