Spartan6 硬核MCB读写DDR2 实战篇.docx
- 文档编号:4380269
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:19
- 大小:462.08KB
Spartan6 硬核MCB读写DDR2 实战篇.docx
《Spartan6 硬核MCB读写DDR2 实战篇.docx》由会员分享,可在线阅读,更多相关《Spartan6 硬核MCB读写DDR2 实战篇.docx(19页珍藏版)》请在冰豆网上搜索。
Spartan6硬核MCB读写DDR2实战篇
Spartan6硬核MCB读写DDR2实战篇
如今的存储器工艺、性能发展之快真是让人岑木结舌,但是随之而来的控制复杂度也大大增加,对于PCB设计要求、如何使存储器跑到最大带宽,都是工程师们要考虑的事。
对于电子市场来讲,现在一片1Gbit的800M速率的DDR2颗粒价格在40元左右,无论从成本和性能上讲都有绝对的优势。
XILINX 公司率先在FPGA芯片中集成了MCB硬核,它可以支持到DDR3,而且对于大多数厂家的存储芯片都支持(Micron、Elpida、Hynix.....),这也是spartan6系列闪耀的地方。
对于工程来讲,其MCB硬核优秀的误码校验和偏移时钟校验,以及PLL_ADV工作时的稳定、高精度都大大保证了研发产品的质量。
而对于用户控制接口又是以通用FIFO的读写方式,代替复杂的ddr2读写逻辑。
以sram的地址映射方式代替复杂的行列地址选择。
可见spartan6——MCB硬核控制器的诞生是值得大家推崇的。
主要内容
(1)“MCB_CLK”设计须知”(系统时钟需要考虑的问题)
(2)“COREGen的使用” (即MCB控制器的生成)
(3)“硬件平台调试” (红色飓风spartan6开发板完成DDR2高速的读写并且校验误码)
(4)“Xilinx谦虚的地方” (揭秘PLL_ADV/MCB硬核的性能指标)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PhotoSharing
XILINX技术工程师们(Enthusiastic!
) SPARTAN6研讨会现场(Lively!
)
MCB ——CLK设计须知
1. MCB-CLK驱动说明
(1) 对于两个以上的MCB同时使用,对于同端的PLL输出clkout0、clkout1要共用。
如果只应用一个,Xilinx建议首先要选择3_bank,这样不会占用配置引脚和复用引脚。
MCB布局
从PLL输出的时钟只有两条时钟线可以到达硬件的左右两侧,并与IO_clk网络相连,因此同侧的MCB要共用一样的IO_clk网络、跑相同的速率。
(如clkin200M则clkout0、1=400M).
(2) BUFPLL_MCB驱动器内部参数为DIVIDE=2,2x_clk提供给ddr2的通讯速率为doudlerate,是pll输入时钟的两倍,而1xclk则给ddr2的硬件主时钟。
MCB驱动器示意图
(3)Calibrationclk校验时钟则要求时钟设计在min=50M/max=100M
(4)HDL内部逻辑时钟则与MCB端口设置的宽度有关最佳设置公式如下,时钟应该大于等于这个clk0:
Clk0(内部逻控制辑同步时钟)=system_clk(硬件输入时钟)*2(doublerate)*X(X=ddr2的数据宽度*16or*8or*4)/MCB端口的设置宽度128or64andetc。
(5)CMD_FIFO的读写clk建议要使用一致的时钟,如使用Clk0(内部逻控制辑同步时钟)。
2. 关于程序中时钟PLL的设置
modulememc3_infrastructure#中主要是设计时钟源的文件,系统的时钟都在这里设置
(1) 内部差分时钟输入可以根据自己设计选择加入或否
比如你愿意出高价格买差分的晶振“100M差分170RMB”,你可以加上如下的BUF转成单时钟,反之修改设计中的这部“如下”注销即可,并将NET“sys_clk_ibufg”LOC=“单端晶振”)
// IBUFDSSYS_CLK_INST
// (
// .I (sys_clk_p),
// .IB(sys_clk_n),
// .O (sys_clk_ibufg)
// );
(2)内部时钟输入相位和频率可以根据自己设计选择参数,具体如下:
(后面有对其评估的详细报告)
PLL_ADV#
(
.BANDWIDTH ("OPTIMIZED"),
.CLKIN1_PERIOD (CLK_PERIOD_NS),
.CLKIN2_PERIOD
(1),
.CLKOUT0_DIVIDE
(1),//******用于处理外部的ddr2数据的2X时钟
.CLKOUT1_DIVIDE
(1),//******用于处理外部的ddr2数据的2X_180时钟
.CLKOUT2_DIVIDE (6),//*******内部logic工作时钟
.CLKOUT3_DIVIDE (6),//*******校验时钟50---100M
.CLKOUT4_DIVIDE
(1),//*******可选频率端口
.CLKOUT5_DIVIDE
(1),//*******可选频率端口
.CLKOUT0_PHASE (0.000),
.CLKOUT1_PHASE (180.000),
.CLKOUT0_DUTY_CYCLE(0.500),
.CLKOUT1_DUTY_CYCLE(0.500),
.CLKOUT2_DUTY_CYCLE(0.500),
.CLKOUT3_DUTY_CYCLE(0.500),
.COMPENSATION ("SYSTEM_SYNCHRONOUS"),
.DIVCLK_DIVIDE
(1),
.CLKFBOUT_MULT (6),//**参数设置 MUSLT/clkoutx*clkinbuf=acteclclk
.CLKFBOUT_PHASE (0.0),
.REF_JITTER (0.005000)
)
说明:
设输入的时钟为X
CLKOUT0_DIVIDE=X*CLKFBOUT_MULT/CLKOUT0_DIVIDE_paramater
CORE GENERATER
“为了大家学习截图很多,照做就可以”
1.新建工程(ise11.1以上版本)file—>newproject
2. 选择spartan6_etc配置如下(选择新片类型)
3. 选择语言Verilog,点击OK下一步设置(其他配置如下图:
4. 在Memory ——IP中选中MIG如下图
然后的两个对话框都为next下一步。
5. 选择硬件在bank3调用MCB, DDR2器件
6. 选择ddr2器件的时钟范围,主要的型号
7. 参数如下设置选项如图,点击next
8. 设置端口位宽为128bit,也可以设置64bit、32etc
Map方式的选择顺序映射表如下设置,后面两个页面的设置均为next下一步,默认即可
9. 这里面显示的配置信息内容如下:
(可以核对设置是否正确)
10. cliknext,clikgen生成IP核,关闭弹出的窗口,可以看见生成好的MIG,这里为3.1版本,11.3以上的版本为3.2
11. 注意设置:
下面的页面为ddr2参数的设置,如用其他ddr2类型参数可以在datasheet中找到设置即可。
12. 刚刚设置后COREGEN生成的文件目录如下:
(1) 对于example_design为用户测试使用测试功能参见ug388文件的debug部分
(2) User_design为用户实际使用的工程,里面有源文件以及基础的约束文件(我们开发主要应用这里的东西)
说明:
在example的文件下里的chipscope工程可以直接用来仿真,而且里面提供编译的批量处理文件。
这样很方便的运行逻辑,然后下载chipscope仿真即可。
而且测试工作方式很全面.
V3_Spartan6板卡调试
1. 调试须知
MCB的使用主要分为三大部分。
(1)cmd命令端口,这一端口来设置每次发送的数据量,以及要写入的地址信息.
(2)user_wr接口,主要完成MCB内部FIFO向DDR数据的过程.
(3)user_rd接口,主要完成DDR内部数据向MCB内部FIFO的写过程.
使用说明:
1. 如框图所示对于用户端口有单独的cmd指令端口,对于指令的操作类似于fifo的控制模式,其深度为4_deepth
主要信号功能描述
************************CMD 指令部分*********************
.c3_p0_arb_en(1'b1), //注意仲裁使能引入为高电平
.c3_p0_cmd_clk(c3_clk0), //c3_p0_cmd_clk
.c3_p0_cmd_en(c3_p0_cmd_en), //CMD时能en、高有效
.c3_p0_cmd_instr(c3_p0_cmd_instr), //为3bit命令接口如3’b000写命令
当然这里也支持数据刷新,我们为自动刷新,控制字参考UG388的用户接口说明
.c3_p0_cmd_bl(c3_p0_cmd_bl), //64深度的fifo向ddr2搬运的数据数量
里最多为64个和fifo深度想通
.c3_p0_cmd_byte_addr(c3_p0_cmd_byte_addr), //32map地址如软件测试
.c3_p0_cmd_empty(c3_p0_cmd_empty), //高有效空flag
.c3_p0_cmd_full(c3_p0_cmd_full), //高有效满flag
Cmd 发送命令时序关系:
读写数据接口功能描述
2. 然后就是读写的数据的有关接口,对于128bit设置的端口模式,其中端口的主要参数如上,他们共用的fifo数据深度为64_deepfifo
***********************WRITEFIFO部分***********************
.c3_p0_wr_clk(c3_clk0), //c3_p0_wr_clk
.c3_p0_wr_en(c3_p0_wr_en), //写数据的使能
.c3_p0_wr_mask(c3_p0_wr_mask), //屏蔽数据的宽度
.c3_p0_wr_data(c3_p0_wr_data), //写数据接口
.c3_p0_wr_full(c3_p0_wr_full), //写满数据flag
.c3_p0_wr_empty(c3_p0_wr_empty), //写空数据flag
.c3_p0_wr_count(c3_p0_wr_count), //写计数
.c3_p0_wr_underrun(c3_p0_wr_underrun), //fifo不够写标志
.c3_p0_wr_error(c3_p0_wr_error),
写数据FIFO时序图:
在使能有效的高电平写入数据
***********************READ FIFO***********************
.c3_p0_rd_clk(c3_clk0), //c3_p0_rd_clk
.c3_p0_rd_en(c3_p0_rd_en), //读信号使能
.c3_p0_rd_data(c3_p0_rd_data), //写数据端口
.c3_p0_rd_full(c3_p0_rd_full), //读满数据flag
.c3_p0_rd_empty(c3_p0_rd_empty), //读空数据flag
.c3_p0_rd_count(c3_p0_rd_count), //读数据技术指针
.c3_p0_rd_overflow(c3_p0_rd_overflow), //fifo不够读标志
.c3_p0_rd_error(c3_p0_rd_error), //读error信号
均为高电平有效
读数据FIFO时序图:
在使能有效的高电平有数据在总线上,可以看见读计数寄存器递减.测试操作,先写入fifo内部64个128bit的数据,然后发送一个写命令,写进ddr2中,然后写进完毕由wr_conter==0判断。
读16个128bit的数据从写入的地址比较是否一致。
***********************Verilog 设计***********************
状态机说明:
localparam IDEL =4'b0000; //初始化寄存器设置
localparam WRITE =4'b0001; //写入32个128bit数据
localparam CMD_WRITE_PRE=4'b0010; //写入数据命令准备
localparam CMD_WRITE_EN =4'b0011; //cmd命令写进fifo
localparam CMD_DELAY =4'b0100; //延迟状态机
localparam CMD_READ_PRE =4'b0101; //读命令数据准备
localparam CMD_READ_EN =4'b0110; //读命令写进FIFO
localparam READ_WAITE =4'b0111; //判断是否写进ddr2
localparam READ =4'b1000; //从DDR2读取数据,返回IDEL状态
对于端口的mask设置问16’b000000000000000.即全不覆盖ddr216bit总线数据,覆盖使用时相应位置高
4. chipscope验证说明
ddr2_find_error_iladdr2_find_error_ila
(
.CONTROL(CONTROL0), 连接信号
.CLK (c3_calib_clk),//c3_clk0 采样时钟
.TRIG0({c3_p0_wr_data,c3_p0_wr_en,c3_clk0}), //写FIFO数据,同步时钟
.TRIG1({rd_data_display,c3_p0_rd_en,c3_clk0}), //读FIFO数据,同步时钟
.TRIG2({state_ddr2,c3_p0_cmd_empty,c3_p0_rd_empty,wr_count}),
//状态机信号,cmdfifo空标志位 读FIFO空标志,数据源计数器
.TRIG3({c3_p0_cmd_en,c3_p0_cmd_instr,c3_p0_cmd_bl,c3_p0_cmd_byte_addr}), //cmd命令时序检测,加入cmd的长度、命令
.TRIG4({c3_p0_wr_count}), //写FIFO计数
.TRIG5({c3_p0_rd_count}) //读FIFO计数
);
对于数据源与User_DDR接口不匹配的解决说明
由于MCB提供的用户接口宽度为32bit—128bit,对于不同的外部数据源可以用串并转换的方式满足不通的接口(上图为外部数据为8bit,User_DDR接口为32bit的仿真时序)
5. chipscope波形观测
可以根据提供的DDR2_chipscope工程,下载程序,打开直接看到内部的数据变化,放大局部可以看见写入的数据与读出的数据。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
V3_SPARTAN6_KIT----DDR2 测试报告
-----------Xilinx 很谦虚
1. 对于MCB端主时钟的极限测试
(1) ddr2工作在200M,logic100M,chipscope100M采样时钟,读写周期为345刻度.
(2) ddr2工作在400M,logic100M,chipscope100M采样时钟,读写周期为228刻度.
(3) ddr2工作在450M,logic100M,chipscope100M采样时钟,读写周期为223刻度.
(4) ddr2工作在600M,logic60M, chipscope100M采样时钟,读写周期为204刻度.
(5) ddr2工作在700M,logic100M,chipscope100M采样时钟,读写周期为198刻度.
(6) ddr2工作在800M,logic100M,chipscope100M采样时钟,读写周期为188刻度.
(7) ddr2工作在900M,logic100M,chipscope100M采样时钟,读写周期为184刻度.
(8) ddr2工作在1000M,logic100M,chipscope100M采样时钟,读写数据错误串位现象发生.
结论:
MCB随着PLL频率的100M递增,完成相同批量的读写数据测试需要的时间在递减,但是pLL频率提升到1000M时发生错误。
可见在以XILINX文档(677M)为理论基础上,ddr2(MT47H64M16-3E)可以最快在MCB_900M时ddr2_CLK450M工作,可见XILINX给的指标还是很谦虚的!
2. 对于DDR2_CLK极限测试
对于DDR2_CLK的测试,将DDR2_CLK转成单端输出给普通IO,示波器测试。
下面均为ddr2主时钟:
(1)300M 8分频为37.5M,400M 8分频为50M输出正确(均为稳定的正弦波)
(2)450M 32分频为14.062输出正确(低于20M的波形为标准方波,怀疑是高频的时钟经过电阻被整形)
(3)500M 32分频为15.625输出正确(同样方波输出)到此数据已经频频错误
(4)600M 32分频为18.75输出正确(同样方波输出)
(5)700M 32分频为21.875输出正确(同样方波输出),PLL已经1400M的高频了
(6)800M 32分频为25输出正确(同样方波输出),PLL已经1600M的高频了
(7)900M 32分频为28.125输出正确(同样方波输出)此时芯片非常烫手,PLL已经1800M的高频了
(8)1000M 32分频输出错误(现象输出时钟不稳定而且时有时无,频率混乱),此时芯片明显更烫手,PLL已经2000M的高频了
结论:
:
PLL_ADV可正常工作在可靠频段200-1800M比手册的400-1000M要宽松很多,但是还是建议在其工作范围内,这样在长时间工作环境中会比较稳定,可见XILINX技术指标公开的很谦虚!
3. Morethan30minutes------------误码率测试
将V3_spartan6板卡进行ddr2测试,依次跑到的频率:
(1)ddr2工作在400M的时钟下进行全部地址的读写,并将数据进行对比,采集error_data_display指示信号10分钟的时间,正确
(1)ddr2工作在500M的时钟下进行全部地址的读写,并将数据进行对比,采集error_data_display指示信号10分钟的时间,正确
(2)ddr2工作在700M的时钟下进行全部地址的读写,并将数据进行对比,采集error_data_display指示信号10分钟的时间,错误频频出现(几乎抓图可见)
(3)ddr2工作在600M的时钟下进行全部地址的读写,并将数据进行对比,采集error_data_display指示信号10分钟的时间,正确
(4)ddr2工作在650M的时钟下进行全部地址的读写,并将数据进行对比,采集error_data_display指示信号30分钟的时间,正确
结论:
:
对于V3的spartan6板卡,可以正常工作在ddr2-3即为667M主频的ddr2,可以完全跑到650M并且长达30分的测试没有问题,误码率为0,并且非常的稳定。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Spartan6 硬核MCB读写DDR2 实战篇 MCB 读写 DDR2 实战