Spartan6 硬核MCB读写DDR2 实战篇Word文件下载.docx

上传人:b****4 文档编号:17305661 上传时间:2022-12-01 格式:DOCX 页数:19 大小:462.08KB
下载 相关 举报
Spartan6 硬核MCB读写DDR2 实战篇Word文件下载.docx_第1页
第1页 / 共19页
Spartan6 硬核MCB读写DDR2 实战篇Word文件下载.docx_第2页
第2页 / 共19页
Spartan6 硬核MCB读写DDR2 实战篇Word文件下载.docx_第3页
第3页 / 共19页
Spartan6 硬核MCB读写DDR2 实战篇Word文件下载.docx_第4页
第4页 / 共19页
Spartan6 硬核MCB读写DDR2 实战篇Word文件下载.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

Spartan6 硬核MCB读写DDR2 实战篇Word文件下载.docx

《Spartan6 硬核MCB读写DDR2 实战篇Word文件下载.docx》由会员分享,可在线阅读,更多相关《Spartan6 硬核MCB读写DDR2 实战篇Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。

Spartan6 硬核MCB读写DDR2 实战篇Word文件下载.docx

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,并且非常的稳定。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学案例设计

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1