-
[配套 实验例程(部分实验需要扩展模块支持)] 1、实验一 38译码器实验 2、实验二 十进制计数器实验 3、实验三 按键及拨码开关实验 4、实验四 蜂鸣器“梁祝”乐曲演奏实验 5、实验五 LED流水灯实验 6、实验六 数码管扫描显示实验 7、实验七 字符型LCD显示实验 8、实验八 串口通信实验 9、实验九 VGA输出八彩色 10、实验十 VGA输出乒乓球实验 11、实验十一 Ps2输入LCD显示实验 12、实验十二 ps2键盘控制串口 13、实验十三 ps2鼠标控制LED灯 14、实验十四 FPGA分频器实验 15、实验十五 正弦函数发生器实验 16、实验十六 AD转换实验 17、实验十七 IIR滤波器实验 18、实验十八 usb输入输出实验 19、实验十九 AUDIO实验 20、实验二十 双口ram仿真实验 21、实验二十一 SRAM的读写实验 22、实验二十二 E2PROM实验 23、实验二十三 SDRAM的读写实验 24、实验二十四 3.5寸触摸屏坐标显示 25、实验二十五 ADDA回环实验 26、实验二十六 音视频回环实验 27、实验二十七 microblaze控制led 28、实验二十八 microbalze控制串口通信
[ 本帖最后由 红色飓风 于 2012-4-17 17:55 编辑 ]
-
理解是对的,
连到2.5V,那么这个Bank只能是2.5V了.
怕IO浪费,可以接一些开关了,LED什么的,利用起来
-
////////////////////CHIPSCOPE_WATCH////////////////////
wire [35:0] CONTROL0;
ddr2_find_error ddr2_find_error_icon (
.CONTROL0(CONTROL0) // INOUT BUS [35:0]
);
ddr2_find_error_ila ddr2_find_error_ila (
.CONTROL(CONTROL0), // INOUT BUS [35:0]
.CLK (c3_calib_clk), // IN c3_clk0
.TRIG0({c3_p0_wr_data,error_data_display,c3_clk0}), // IN BUS [129:0]
.TRIG1({rd_data_display,c3_p0_rd_en,c3_clk0}), // IN BUS [129:0] c3_p0_rd_data
.TRIG2({state_ddr2,c3_p0_cmd_empty,c3_p0_rd_empty,wr_count}), // IN BUS [11:0] error_display
.TRIG3({c3_p0_cmd_en,c3_p0_cmd_instr,c3_p0_cmd_bl,c3_p0_cmd_byte_addr}), // IN BUS [39:0]
.TRIG4({c3_p0_wr_count}), // IN BUS
.TRIG5({c3_p0_rd_count}), // IN BUS [6:0]
.TRIG6({rd_data_compare,c3_p0_wr_en,rd_count}) // IN BUS [134:0]
);
复制代码
观测信号列表:
包括错误指示信号,读数据使能,状态机指示state_ddr2,写入数据c3_p0_wr_data,写入数据地址c3_p0_cmd_byte_addr,c3_p0_cmd_bl写入数据长度,c3_p0_cmd_instr读写操作命令,c3_p0_cmd_en写入命令使能,读写数据的计数指示,读出数据,和预比较数据源。
整体时序图可以看见error一直为低电平,可以看到读出的数据和预计数据源相符合,而且板卡上的ds3-ds7指示灯显示ddr3的工作正常
写入的递增数据源
按照递增的地址写入递增的数据,而且读出的数据也是无误的递增数据。
在chipscope的触发设置面板里面设置eerorr指示信号发生为高电平为触发条件,采集数据
可以长时间的采集发现没有错误,本测试为30分钟,证明板卡的ddr3在400M的工作频率下正常工作,逻辑控制也很稳定
-
重ddr3的其实地址向内其写入递增数据,当写满数据后与数据源比较,如有错误error指示信号为高电平。并通过逻辑分析仪采样看是否出现错误,计算误码,评估系统稳定性。
刚刚设置后CORE GEN生成的文件目录如下:
(1)对于example_design为用户测试使用测试功能参见ug388文件的debug部分
(2)User_design为用户实际使用的工程,里面有源文件以及基础的约束文件(我们开发主要应用这里的东西)
说明:在example的文件下里的chipscope工程可以直接用来仿真,而且里面提供编译的批量处理文件。这样很方便的运行逻辑,然后下载chipscope仿真即可。而且测试工作方式很全面。
时序、使用说明:
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 发送命令时序关系:
读写数据接口功能描述
1.然后就是读写的数据的有关接口,对于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总线数据,覆盖使用时相应位置高
-
用xilinx dds IP核吧 看下datasheet
-
CORE GENERATER
1.新建工程(ise11.1以上版本)file—>new project
2. 选择spartan6_etc配置如下(选择新片类型)
这里选择Spartan6_Xc6slx45T 核心芯片-3速度等级的fgg484封装器件
3.选择语言Verilog,点击OK下一步设置(其他配置如下图:
4.在Memory ——IP中选中MIG如下图
然后的两个对话框都为next下一步。
5选择硬件在bank3调用MCB, DDR3器件
6.选择DDR3的输入时钟,以及型号为MT41J64M16XX-187E
7.选择阻抗匹配参数和自动刷新有效,这里得MIG3.3_IPCore多了高温检测自动刷新。
8.我们选择128bit位宽得双向接口,并且按照raw,bank,column排列虚拟映射地址
9.都可以按照默认情况,最后我们注意一下system clock,3.3以上得ip都可以自己选择输入的时钟类型差分还是单端的(以下版本MIG需要手动改动输入时钟)
10.后面的界面完全可以按照默认,next。
这样在选定的目录下可以看到刚刚生成得。Ucf文件。在里面更改:
NET "c3_sys_clk_n" LOC = "K22" ;
NET "c3_sys_clk_p" LOC = "K21" ;
NET "led0" LOC = "W15" ;
NET "led1" LOC = "D21" ;
NET "led2" LOC = "AB4" ;
NET "led5" LOC = "D17" ;
在源文件中加入显示状态指示灯:
/////////////////////////////////////////////////////////////display///////////////////////////////////////////////////////////////////
assign c3_p0_wr_mask = 16'b0000_0000_0000_0000;
assign led0 = LED_BEGIN_DISPLAY; //开始写首地址指示灯亮起
assign led1 = LED_FINISH_DISPLAY; //结束地址指示灯亮起
assign led2 = error_data_display; //如果读出的数据错误指示灯亮起
assign led5 = LED_CLK_COUNT[24]; //200M的时钟是否工作为1HZ点亮
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
SP605 试用分享
(引用)如今的存储器工艺、性能发展之快真是让人岑木结舌,但是随之而来的控制复杂度也大大增加,对于PCB设计要求、如何使存储器跑到最大带宽,都是工程师们要考虑的事。对于电子市场来讲,现在一片1Gbit的800M速率的DDR3颗粒价格不到50元,无论从成本和性能讲都有绝对大的优势。
XILINX 公司率先在FPGA芯片中集成了MCB硬核,它可以支持到DDR3,而且对于大多数厂家的芯片系列都支持,这也是spartan6系列闪耀的地方。对于工程来讲,其MCB硬核优秀的误码校验和偏移时钟校验,以及PLL_ADV工作时的稳定、高精度都大大保证了项目产品的质量。而对于用户接口又是以FIFO的读写方式,代替复杂的ddr3读写逻辑。以sram的地址映射方式代替复杂的行列地址选择。可见spartan6 ——MCB控制器的诞生是值得大家高兴的。
因为时间仓促,对于sp605只是跑了下它上面的MCB硬核部分,其实这个板卡得功能还是很强大的,不仅有光纤接口、DVI接口,还有常用的千兆网,基础配置很高DDR3,还配置了256Mbit的norflash(不仅可以用作存储fpga程序而且还可以做为sopc系统的存储),而2GB的CF卡的灵活性也是板卡的一个亮点。下面我就分享下如何使用MCB来读写605上的ddr3.
Spartan6 LX45T 产品
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 ("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=actecl clk
.CLKFBOUT_PHASE (0.0),
.REF_JITTER (0.005000)
)
说明:设输入的时钟为X
CLKOUT0_DIVIDE= X * CLKFBOUT_MULT/ CLKOUT0_DIVIDE _paramater
-
一直没摸过Xilinx的MicroBlaze,现在终于有机会试一下了J
感谢EEWorld和Xilinx提供的这次机会~
SP605开发套件中,提供软件ISE11.1,还有一张光盘是升级到11.4的Update Patch,
全部装完后,
打开XPS,
按照ug728_sp605_hardware_tutorial.pdf里 step by step ,即可完成一个硬件平台的搭建以及测试.
XPS是一个完整的定制CPU系统的工具,
包括综合,引脚分配,生成下载文件,简单C程序的编写,编译,下载等.
完成的东西比sopcbuilder多,这可能也是编译慢的原因.
比如在XPS下即可完成一些基本的调试,
1>. 直接利用XMD,用命令行的方法调试,
有关XMD调试的详细文档可见
http://www.xilinx.com/support/documentation/dt_edk_edk11_xpsandsdk.htm
xilinx的文档写的比较详细,就不说了.
2>. 直接在XPS下Application里新建一个测试程序,
比如一个LED的测试程序
#include "xparameters.h"
int main()
{
int *led_base;
led_base = 0x81420000;
(*led_base) = 0x0000000a;
return 0;
}
经编译,初始化到BRAM, update bitstream,再下载,即可看到现象.
适合不喜欢用命令行的人J
使用的感受:
Xilinx的XPS使用起来相当不方便,界面做的非常复杂,
每添加一个IP或是configure IP时,都会有10s左右的等待,
每个需要export的IO,必须得一个个的make external,而每次都得很长时间,
Generate Bitstream时更基,会长达30min左右 - -||
而Altera的sopcbuilder就很快,界面也简洁.
另外自己新建了一个MicroBlaze的工程,
在XPS下加了DDR3,UART,LED_PIO等,
并在SDK下写了一个测试LED的程序,
把工程传上来供大家参考.
-
Xilinx和Altera都会提供详细的设计参考或者应用笔记,可以到官方网站上下载。
-
优化协议栈。另外MicroBlaze本身的处理能力也有一定局限。
-
网络接口速度可以做到100MHz。
IP的速度在不同速度等级的器件上性能会有所差异的。优化方法要针对不同器件的特性,找到关键路径。
Xilinx提供的MIG工具可以满足大部分Memory接口的性能要求
-
红色飓风专区是红色飓风开发板与电子工程世界-论坛合作推出的一个FPGA技术讨论专区,今天正式开通!
本分区由红色飓风工程师来维护,欢迎大家来这里讨论FPGA设计相关问题。
[ 本帖最后由 红色飓风 于 2010-3-8 18:11 编辑 ]
-
我们这个工程是采用50M的时钟,
但100M也是可以的.
更高的没有试过.