Spartan6 硬核MCB读写DDR2 实战篇Word文件下载.docx
《Spartan6 硬核MCB读写DDR2 实战篇Word文件下载.docx》由会员分享,可在线阅读,更多相关《Spartan6 硬核MCB读写DDR2 实战篇Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
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#中主要是设计时钟源的文件,系统的时钟都在这里设置
内部差分时钟输入可以根据自己设计选择加入或否
比如你愿意出高价格买差分的晶振“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
.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
选择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生成的文件目录如下:
对于example_design为用户测试使用测试功能参见ug388文件的debug部分
User_design为用户实际使用的工程,里面有源文件以及基础的约束文件(我们开发主要应用这里的东西)
在example的文件下里的chipscope工程可以直接用来仿真,而且里面提供编译的批量处理文件。
这样很方便的运行逻辑,然后下载chipscope仿真即可。
而且测试工作方式很全面.
V3_Spartan6板卡调试
调试须知
MCB的使用主要分为三大部分。
(1)cmd命令端口,这一端口来设置每次发送的数据量,以及要写入的地址信息.
(2)user_wr接口,主要完成MCB内部FIFO向DDR数据的过程.
(3)user_rd接口,主要完成DDR内部数据向MCB内部FIFO的写过程.
使用说明:
如框图所示对于用户端口有单独的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
发送命令时序关系:
读写数据接口功能描述
然后就是读写的数据的有关接口,对于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;
//初始化寄存器设置
WRITE
b0001;
//写入32个128bit数据
CMD_WRITE_PRE=4'
b0010;
//写入数据命令准备
CMD_WRITE_EN
b0011;
//cmd命令写进fifo
CMD_DELAY
b0100;
//延迟状态机
CMD_READ_PRE
b0101;
//读命令数据准备
CMD_READ_EN
=4'
b0110;
//读命令写进FIFO
READ_WAITE
b0111;
//判断是否写进ddr2
READ
b1000;
//从DDR2读取数据,返回IDEL状态
对于端口的mask设置问16’b000000000000000.即全不覆盖ddr216bit总线数据,覆盖使用时相应位置高
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的仿真时序)
chipscope波形观测
可以根据提供的DDR2_chipscope工程,下载程序,打开直接看到内部的数据变化,放大局部可以看见写入的数据与读出的数据。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
V3_SPARTAN6_KIT----DDR2
测试报告
-----------Xilinx
很谦虚
对于MCB端主时钟的极限测试
ddr2工作在200M,logic100M,chipscope100M采样时钟,读写周期为345刻度.
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给的指标还是很谦虚的!
对于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技术指标公开的很谦虚!
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,并且非常的稳定。