SPRATAN6 - MCB - 使用分享 - 图文

更新时间:2023-12-26 13:48:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Spartan6 ------MCB_DDR2 设计说明

如今的存储器工艺、性能发展之快真是让人岑木结舌,但是随之而来的控制复杂度

也大大增加,对于PCB设计要求、如何使存储器跑到最大带宽,都是工程师们要考虑的事。对于电子市场来讲,现在一片1Gbit的800M速率的DDR2颗粒价格在40元左右,无论从成本和性能讲都有绝对大的优势。

XILINX 公司率先在FPGA芯片中集成了MCB硬核,它可以支持到DDR3,而且对于大多数厂家的芯片系列都支持,这也是spartan6系列闪耀的地方。对于工程来讲,其MCB硬核优秀的误码校验和偏移时钟校验,以及PLL_ADV工作时的稳定、高精度都大大保证了项目产品的质量。而对于用户接口又是以FIFO的读写方式,代替复杂的ddr2读写逻辑。以sram的地址映射方式代替复杂的行列地址选择。可见spartan6 ——MCB控制器的诞生是值得大家高兴的。

本文从(1)“MCB_CLK”设计须知”(系统时钟需要考虑的问题)

(2)“CORE Gen的使用” (即MCB控制器的生成) (3)“硬件平台调试” (红色飓风spartan6开发板完成DDR2高速的

读写并且校验误码)

(4)“Xilinx谦虚的地方” (揭秘PLL_ADV / MCB硬核的性能指标) (5)“您用得到的我粘出来” (在XILINX应用设计中很有用的文档)

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的通讯速率为

doudle rate,是pll输入时钟的两倍,而1xclk则给ddr2的硬件主时钟。

MCB驱动器示意图

(3)Calibration clk校验时钟则要求时钟设计在min=50M / max=100M

(4)HDL内部逻辑时钟则与MCB端口设置的宽度有关 最佳设置公式如下,时钟应该大于等于这个clk0:Clk0(内部逻控制辑同步时钟)=system_clk(硬件输入时钟)*2(double rate)*X

(X=ddr2的数据宽度*16 or*8 or*4)/MCB端口的设置宽度128 or 64 and etc。

(5)CMD_FIFO的读写clk建议要使用一致的时钟,如使用Clk0(内部逻控制辑同步时钟)。

2. 关于程序中时钟PLL的设置

module memc3_infrastructure # 中主要是设计时钟源的文件,系统的时钟都在这里设置

(1) 内部差分时钟输入可以根据自己设计选择加入或否

(比如你愿意出高价格买差分的晶振“100M差分170RMB”,你可以加上如下的BUF转成单时钟,反之修改设计中的这部“如下”注销即可,并将NET“sys_clk_ibufg” LOC=“单端晶振”)

// IBUFDS SYS_CLK_INST // (

// .I (sys_clk_p), // .IB (sys_clk_n), // .O (sys_clk_ibufg) // );

(2)内部时钟输入相位和频率可以根据自己设计选择参数,具体如下: (后面有对其评估的详细报告)

PLL_ADV # (

.BANDWIDTH (\ .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 (\ .DIVCLK_DIVIDE (1),

.CLKFBOUT_MULT (6),//**参数设置 MUSLT/clkoutx*clkinbuf=actecl clk .CLKFBOUT_PHASE (0.0), .REF_JITTER (0.005000) )

说明:设输入的时钟为X

CLKOUT0_DIVIDE= X * CLKFBOUT_MULT/ CLKOUT0_DIVIDE _paramater

CORE GENERATER

“为了大家学习截图很多,照做就可以”

1新建工程(ise11.1以上版本)file—>new project

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. clik next,clik gen生成IP核,关闭弹出的窗口,可以看见生成好的MIG,

这里为3.1版本,11.3以上的版本为3.2

11. 注意设置:下面的页面为ddr2参数的设置,如用其他ddr2类型参数可

以在datasheet中找到设置即可。

12. 刚刚设置后CORE GEN生成的文件目录如下:

(1) 对于example_design为用户测试使用测试功能参见ug388文件的

debug部分

(2) User_design为用户实际使用的工程,里面有源文件以及基础的约束文

件(我们开发主要应用这里的东西)

说明:在example的文件下里的chipscope工程可以直接用来仿真,而且里面提供编译的批量处理文件。这样很方便的运行逻辑,然后下载chipscope仿真即可。而且测试工作方式很全面。

软件设计

1. 时序说明

使用说明:

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

***********************WRITE FIFO部分***********************

.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.即全不覆盖ddr2 16bit总线数据,覆盖使用时相应位置高

4. chipscope验证说明

ddr2_find_error_ila ddr2_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}),

//状态机信号,cmd fifo空标志位 读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) (2) (3) (4) (5) (6) (7) (8)

ddr2工作在200M,logic 100M,chipscope 100M采样时钟,读写周期为345刻度。 ddr2工作在400M,logic 100M,chipscope 100M采样时钟,读写周期为228刻度。 ddr2工作在450M,logic 100M,chipscope 100M采样时钟,读写周期为223刻度。 ddr2工作在600M,logic 60M, chipscope 100M采样时钟, 读写周期为204刻度。 ddr2工作在700M,logic 100M,chipscope 100M采样时钟,读写周期为198刻度 ddr2工作在800M,logic 100M,chipscope 100M采样时钟,读写周期为188刻度 ddr2工作在900M,logic 100M,chipscope 100M采样时钟,读写周期为184刻度 ddr2工作在1000M,logic 100M,chipscope 100M采样时钟,读写数据错误串位现象发生

结论:MCB随着PLL频率的100M递增,完成相同批量的读写数据测试需要的时间在递减,但是pLL频率提升到1000M时发生错误。 可见在以XILINX文档(677M)为理论基础上,ddr2(MT47H64M16-3E)可以最快在MCB_900M时ddr2_CLK 450M工作,可见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. More than 30 minutes ------------误码率测试

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

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

本文来源:https://www.bwwdw.com/article/01zx.html

Top