文档库 最新最全的文档下载
当前位置:文档库 › FPGA学习经验之谈

FPGA学习经验之谈

FPGA学习经验之谈
FPGA学习经验之谈

FPGA学习-经验之谈

目录

1.杂记 (3)

1.1 FPGA中未赋初值寄存器的值 (3)

1.2关于initial在仿真中的应用 (3)

1.3 仿真程序控制的变量 (3)

1.4 错误汇总 (3)

1.5 Inout口的编写办法 (3)

1.6 Component 相当于assign不能用在什么always 模块中 (7)

1.7 If-else不完全配套时 (7)

1.8 X实际上是0 (7)

1.9 关于BRAM(BLOCK RAM) (7)

1.10 一个FPGA设计最大能工作的频率 (7)

1.11 DCM不能直接接管脚?输出一般要先过一个buf再输出? (8)

1.12 FPGA中不同BANK区别?DSP概念?BUFG? (8)

1.13 全局时钟只能跑一半?DCM输出时钟一般能跑1/4整芯片? (8)

1.14把F68013_PC_FPGA程序最大工作频率提高,方法: (8)

1.15 单词翻译 (9)

1.16时序报告解读及解决 (9)

1.17 关于FPGA Editor (10)

1.18未用管脚电平设置 (11)

2.关于Chip Scop (11)

2.1简介 (11)

2.2关于常用核 (12)

2.3 重要操作 (13)

2.4 缺点 (13)

2.5 使用说明 (13)

3 Modesim 与ISE 联合仿真 (13)

3.1 安装方法,照下面操作即可实现联合仿真 (13)

3.1.1 安装注意事项 (14)

3.2 主要的优点 (14)

3.2.1 关于波形比较 (14)

3.2.2 数据流窗口调试 (15)

3.2.3 代码覆盖率,这功能不错 (15)

4.BUFG,IBUFG,BUFGP,IBUFGDS等含义以及使用 (16)

4.1全局时钟资源的使用方法(五种) (17)

4.2 全局时钟资源的例化方法 (18)

4.3详解IBUFG/IBUFGDS+BUFG用法 (18)

5.I2C网上程序精读(尽快抽空) (18)

5.1 关于上复位 (18)

FPGA设计

1.杂记

1.1 FPGA中未赋初值寄存器的值

在硬件平台中,当系统上电后,信号电平不是1就是0,不会存在X,因此,设计中用到的寄存器如果在没有初始化的情况下,在不同的平台上,其初始状态是不一定的,存在两种可能全0或者全1,而在XILINx公司的FPGA/CPLD上,默认为0。

1.2关于initial在仿真中的应用

在实验中发现,硬件输出分频器已经获得了成功,但是仿真的结果却始终不对,老是输出X。原因如下:在不同的平台中,未赋于初值的寄存器的初始值不一样。一般情况下有人加一个复位信号,这个信号用来对未赋值的信号进行下初始等初始操作,但是,有时不用。这时,我们就必须要加个initial 语句,虽然它是不可综合的,但是,在仿真操作时会对未赋值变量赋于一个初值。这时仿真才可以正确的运行。

1.3 仿真程序控制的变量

还要注意一点在仿真程序中,只能控制的是输入变量,而原程序中的中间变量和输出变量都不是受人工控制的。

1.4 错误汇总

Cannot mix blocking and non blocking assignments on signal i

这种错误一般是因为程序中变量i阻塞和非阻塞一起使用了,解决的办法不要只看报错的那一行,而是要把这个变量的上下文全找一下,是否有混合使用的地方。

Always程序块能够直接在@符号后面放置字符*,在这种情况下,模拟器创建一个隐含的灵敏度列表,它包含了所有可能会影响到过程语句产生结果的那些信号。而同时,一个不完全灵敏度列表的“组合逻辑”其行为将具有时序特性。就是把所有的输入的变量全列进去。

1.5 Inout口的编写办法

下面是在网上找的一篇资料,是一个关于IO口的程序及测试程序的书写的完整例子。不错

先谈下自己的体会:

首先,IO口要做为输出口时,此时一定要用assign语句让IO口输出高阻态。在做测试程序时,也要用到assign但是,assign里面的判断语句的符号要反过来。

其中inner_port与芯片内部其他逻辑相连,outer_port为芯片外部管脚,out_en用于控制双向端口的方向,out_en为1时,端口为输出方向,out_en为0时,端口为输入方向。

assign a = ( (s[2:0]!=4))? ibus : 8'bz;

如上原程序中s为4时输出高阻,同时IO口为输入,不为4时,为输出。则对应测试程序为: assign a = ( (s[2:0]==4))? a_t : 8'bz;

可以发现s为4时,a口数据为a_t,也就是假定的外界的输入,此时a口为输入口。S不为4时,为高阻态,与原程序中比较不难发现其实相当于Z&*=*.

用Verilog语言描述如下:

module bidirection_io(inner_port,out_en,outer_port);

input out_en;

inout[7:0] inner_port;

inout[7:0] outer_port;

assign outer_port=(out_en==1)?inner_port:8'hzz;

assign inner_port=(out_en==0)?outer_port:8'hzz;

endmodule

用VHDL语言描述双向端口如下:

library ieee;

use IEEE.STD_LOGIC_1164.ALL;

entity bidirection_io is

port ( inner_port : inout std_logic_vector(7 downto 0);

out_en : in std_logic;

outer_port : inout std_logic_vector(7 downto 0) );

end bidirection_io;

architecture behavioral of bidirection_io is

begin

outer_port<=inner_port when out_en='1' else (OTHERS=>'Z');

inner_port<=outer_port when out_en='0' else (OTHERS=>'Z');

end behavioral;

仿真时需要验证双向端口能正确输出数据,以及正确读入数据,因此需要驱动out_en端口,当out_en 端口为1时,testbench驱动inner_port端口,然后检查outer_port端口输出的数据是否正确;当out_en端口为0时,testbench驱动outer_port端口,然后检查inner_port端口读入的数据是否正确。由于inner_port和outer_port端口都是双向端口(在VHDL和Verilog语言中都用inout定义),因此驱动方法与单向端口有所不同。

这是一个self-checking testbench,可以自动检查仿真结果是否正确,并在Modelsim控制台上打印出提示信息。图中Monitor完成信号采样、结果自动比较的功能。

testbench的工作过程为

1)out_en=1时,双向端口处于输出状态,testbench给inner_port_tb_reg信号赋值,然后读取outer_po rt_tb_wire的值,如果两者一致,双向端口工作正常。

2)out_en=0时,双向端口处于输如状态,testbench给outer_port_tb_reg信号赋值,然后读取inner_po rt_tb_wire的值,如果两者一致,双向端口工作正常。

用Verilog代码编写的testbench如下,其中使用了自动结果比较,随机化激励产生等技术。

`timescale 1ns/10ps

module tb();

reg[7:0] inner_port_tb_reg; wire[7:0] inner_port_tb_wire; reg[7:0] outer_port_tb_reg; wire[7:0] outer_port_tb_wire; reg out_en_tb;

integer i;

initial

begin

out_en_tb=0;

inner_port_tb_reg=0;

outer_port_tb_reg=0;

i=0;

repeat(20)

begin

#50

i=$random;

out_en_tb=i[0]; //randomize out_en_tb

inner_port_tb_reg=$random; //randomize data

outer_port_tb_reg=$random;

end

end

//**** drive the ports connecting to bidirction _io

assign inner_port_tb_wire=(out_en_tb==1)?inne r_port_tb_reg:8'hzz;

assign outer_port_tb_wire=(out_en_tb==0)?oute r_port_tb_reg:8'hzz;

//instatiate the bidirction_io module

bidirection_io bidirection_io_inst(.inner_port(in ner_port_tb_wire),

.out_en(out_en_tb),

.outer_port(outer_port_tb_wire));

//***** monitor ******

always@(out_en_tb,inner_port_tb_wire,outer_po rt_tb_wire)

begin

#1;

if(outer_port_tb_wire===inner_port_tb_wire)

begin

$display("\n **** time=%t ****",$time);

$display("OK! out_en=%d",out_en_tb);

$display("OK! outer_port_tb_wire=%d,inner_po rt_tb_wire=%d",

outer_port_tb_wire,inner_port_tb_wire);

end

else

begin

$display("\n **** time=%t ****",$time);

$display("ERROR! out_en=%d",out_en_tb);

$display("ERROR! outer_port_tb_wire != inne r_port_tb_wire" );

$display("ERROR! outer_port_tb_wire=%d, in ner_port_tb_wire=%d",

outer_port_tb_wire,inner_port_tb_wire);

end

end

endmodule

1.6 Component 相当于assign不能用在什么always 模块中

1.7 If-else不完全配套时

有时会生成一个锁存器,以便在always模块的所有逻辑路径都没有给出赋值的情况下,用来保存前一个级联输出。由于这种情况不会发生,所以你可能认为没有什么损坏,但是扮演出锁存器会增加最后综合出来的电路规模和延迟,尽管你不需要这个锁存器。

1.8 X实际上是0

对某种情况的输出不关心时,就把把对应的输出设置为x,而实际上Xilinx HDL,编译器似乎把X输出当成0,所以也不会提高设计电路的性能。

1.9 关于BRAM(BLOCK RAM)

大多数FPGA都具有内嵌的块RAM,这大大的拓展了FPGA的应用范围和灵活性,块RAM可被配置为单端口RAM,双端口RAM,内容地址存储器(CAM)以及FIFO 等常用存储结构。

单片块RAM的容量为18Kbit,即位宽为18bit,深度为1024.可以根据需要改变其位宽和深度,但是要记住两个原则:首先,修改后的容量(位宽*深度)不能大于18Kbit;

其次,位宽最大不能超过36bit,当然可以将多片RAM级联起来形成更大的RAM,此时只受限于芯片内块RAM的数量,而不受上面的两条原则的约束。

1.10 一个FPGA设计最大能工作的频率

当添加时序约束后,用constraints editor, 给时钟添加约束。然后布局布线,然后在报告文件中的Timing constraint中就可以直接看到你的设计是否能达到你的要求,以及最高能跑到多大的频率。

而同时,报告中还会给出不满足条件的线路中的延时情况。

它主要是由最大延时路径来控制,而在PlaneAhead中可以直接看到最大延时路径的网络是哪些,也可以由条状图输出大部分网络的延时信息,从而你可以通过Pblock限定其布局布线的位置来进行约束后再布线,可能最后最大工作频率会有所提高。

1.11 DCM不能直接接管脚?输出一般要先过一个buf再输出?

1.12 FPGA中不同BANK区别?DSP概念?BUFG?

1.13 全局时钟只能跑一半?DCM输出时钟一般能跑1/4整芯片?1.14把F68013_PC_FPGA程序最大工作频率提高,方法:

1.给时钟添加约束,这样它跑的时候会对时钟相关线路特别对待,这样有利于提高最大工

作时钟频率。实现完成后,在design summary/report static timing中会给出不满足时钟约束要求的线路是哪些,同时会给出该设计支持的最大工作频率。

2.在此基础上还有可能提高设计最大工作频率:打开Plane ahead->file->new

project->specify synthesized(edif or ngc) netlist导入ISE中设计的经过综合后的网表文件,并新建一个工程。

3.进入Plane ahead 后,可以tools ->creat multip runs然后在根据提示一步步的创建该项目

文件的多种实现方式。然后implement

4.完成上面操作后,就可以对上面设定的多种实现的结果的每一种的实现情况进行查询

了,从其报告文件中也可以发现其最大延时路径情况,同时还有它的最大能工作的频率。

但是,如果上面的各种方案都不能满足你的要求的话。

5.找到最大延时路径:

可以通过slack histogram,打开延时条状图条状图中最高的那一条也就是本设计中的延时最长的关键路径了。选中对应路径。

也可以通过Timing result直接看到未满足条件的结果。也是选中未满足条件的路径。

你可以选中该路径或者网络,右击选择schematic,就会在打开这条去路的原理图,从而可以方便分析造成延时过大的原因。

然后就可以在Device中看到你选中的那些路径了,这时,你可以通过画一个pblock 把对应这些关键路径的布局布线位置合理的分配,然后就再实现一次看看是否有所提高。针对这里我说下我的感受,TMD试了N次,最后结果各不一样,时好时坏的,反正,这个Pblock的位置不好搞的很哪。

这里要说明的是,好的设计是设计出来的,比如我本次程序的设计中就设计的很差

劲,在分频产生19200的时钟售的时候,用到了一个integer型的,计数达6000多的计数器,而计数器在实现的时候我感觉它是通过一个串行加法器来实现的,而这样做直接的结果就是经过了一大串的组合逻辑,最后才输出,而这样带来的组合逻辑延时,以及布线延时就很大了。

要从根本上提高设计的工作频率应该从设计上下手。比如上个设计中我使用200M 的主时钟,经DCM后,时序报告中没有时序的警告或者不满足的地方,也即,让系统达到了200M的工作频率。

1.15 单词翻译

Slack :裕量

Skew:偏移,时钟偏移时常用到这个词

LVDS:Low-votage Differential Signaling

1.16时序报告解读及解决

时序原因一般三类:布局较差,逻辑级数过多,信号扇出过多。

解决方法:

布局较差:

1 高速布线工具的努力程序

2 利用布局布线工具的特别努力程序

3 利用区域约束

4 自用FPGA EDITOR优化布线,尽可能小地降低走线延迟

逻辑级数过多:修改代码

1 流水线技术,在组合逻辑中插入寄存器,简化原有的逻辑结构

2 好的编码习惯,不要嵌套使用IF或者IF case,尽量使用CASE。

信号扇出:

1 通过逻辑复制的方法来降低信号的高扇出,可以HDL代码中手动复制

或者通过在综合工具中设置来达到目的

2 利用区域约束,把相关逻辑放在一起,当然本方法限于高级用户

结论:

时序约束只是一个提高设计时序的辅助手段,有一定效果,但最终仍需设计人员通过时

序分析器的反馈结果来反复优化代码才能实现预期的目标。

实验中我加入了一个DCM然后呢,每一级输入为200M,DIV16输出第一级DCM,然后DIV8以及FX11.54输出。得到的静态报告如下:

从上面可以看出:输入为200M,且第一次16分步,时序要求都要求了条件。

可以从上图看出,第一级DCM分步后最大频率能达到50M,其中下面这边支路满足时钟条件,而且时钟裕量非常大。77.87

可以看出,该线路的扇出并不大,才1,总延时为1.417,其中逻辑延时较大,布线延时较小,如果有问题,应该集中搞搞逻辑延时,其逻辑级数应该比较深

1.17 关于FPGA Editor

ISE中的实现工具提供了功能强大的自动布线功能,但在一些高级设计中,仍然需要对某些关键路径采用手动布线才能达到设计要求,FPGA editor 就是手动的底层布线功能工具,可以设计人员提供丰富的FPGA底层编辑器。

现在用的上的,就是:

1.可以用来修改CHIP scope的ILA核的连线,而不用经过重新的编译以及布局布线,

只需要在FPGA editor中重新配置即可。

Tools→ILA→进行修改

2.可以用来添加探针:使设计人员快速鉴别和发送内部信号给未被占用的IO引脚。

一旦信号发送给了引脚,通过外部测试设备就可以观察该内部信号的实时活动情

况。

Tools→probs→add

1.18未用管脚电平设置

在ISE中选中工程顶层文件后,在genrate programming file上点击鼠标右键,然后

点击properties打开属性配置窗口,在窗口的左侧选择configurate opinions,里面有一项unused IOB pins通过它右侧的下拉选项就可以选择对未使用的管脚进行处理了。

2.关于Chip Scop

2.1简介

https://www.wendangku.net/doc/204100233.html,/article/08-11/57627s.html,教材在这里……

它可以将逻辑分析仪,总线分析器和虚拟IO等逻辑直接插入设计中,可查看任何内部信号,包括嵌入式软或硬件以及高速串行IO模块.

PC和芯片之间的JTAG通信电缆有一定的要求,目前支持:

1.Platform Cable Usb

2.Parallel Cable IV

3.MultiPRO(JTAG Mode only)

Chipscope是XILINX推出的一款在线调试软件,价格便宜,通过它完全可以脱离传统逻辑分析仪(太贵)来调时序,观察FPGA内部的任何信号,触发条件、数据宽度和深度等的设置也非常方便,但是肯定也存在不足,比如速度和数据量方面。Chipscope本身是一个逻辑分析仪,主要用于在上板测试过程中采集并观察芯片内部信号,以便于调试。

它的原理是,在你综合完的网表里插入用于采集数据的core(包括ILA和ICON),插入的方式可以用core inserter,也可以用core generator,只不过后者需要在源代码中实例化。用core inserter更为快捷,基本上就是选择你要观察的信号以及触发源、时钟等,然后运行之后会自动生成一个新的网表文件,再用这个网表在ISE里面进行布局布线,生成下载文件,通过JTAG方式下载到芯片里运行。在芯片运行的过程中,如果你选择的触发源发生跳变,

或满足触发条件时,芯片里的core会将你要观察的信号采集并存储在芯片内的RAM(也可以是FF)中,然后通过JTAG口将采集到的信号上载到PC,最后在PC的chipscope analyzer 的界面中以波形的方式显示出来,因此你就能看到芯片里的信号波形。

我们平时都是使用Chipscope的core inserter 方式来往我们的工程里面植入Chipscope 核。凡事都是利弊相生的,XILINX的Chipscope core inserter工具帮你便捷地把core植入到你的工程里面,那么存在一定的弊端,那就是编译时间被延长得很长,而且每次编译过程中,都会根据你的cdc工程文件重新生成一次ICON、ILA内核网表,再重新编译整个工程,那么编译时间就不可避免地被延长了。

所以,如果要采集到你所要的信号波形,首先是你的触发条件被满足。chipscope不会去改变你的原始设计中的信号,只对他们作采集。

总结来说,chipscope是利用植入FPGA的两个core: ILA 和ICON,利用JTAG数据线传回数据的方式来观察、调试设计的。

2.2关于常用核

CHIPSCOPEPRO提供了7类不同的核资源,其中ICON核,ILA核,VIO核及ATC2核获得了广泛应用。

ICON核(Integrated controller)

所有的核都需要通过JTAG电缆完成计算机和芯片的通信,在CHIPSCOP PRO中,只有ICON核具备和JTAG边界扫描端口通信的能力,因此它是必不可少的核。

ILA核(Integrated logic analyzer)

ILA核提供触发和跟踪功能,根据用户设置的触发条件捕获数据,然后在ICON控制下,通过边界扫描口将数据传输到PC机上,最后在ANAL YZER中显示波形。

VIO核(Vitual input/output)

虚拟输入、输出核用于实时监控和驱动FPGA内部的信号,可以观测FPGA设计中任意信号的输出结果,以及添加虚拟输入,如DIP开关,按键等。且不战胜块RAM。

ATC2核(Angilent Trace )

它由xilinx公司和Aglient合作开发,适配于Agilent最新一代的逻辑分析器,联合完成调试捕获,允许逻辑分析仪访问FPGA内部设计中任何一点人网表,提供更深的捕获深度。更复杂的捕获设置。它可以为每个信号提供2MB的捕获深度,是ILA深度的60倍,此外最多允许在FPGA内部添加64个观测信号组,和逻辑分析仪链接数据最多达128管脚。大

的捕获深度以及多的观测信号对于查找设计故障原因是非常有用的。

2.3 重要操作

●综合工程后在ISE工程中右键Add New Souce选择chipscope definition connection

file……

●Chipscope pro只能分析FPGA设计的内部信号,因此不能直接连接输入信号的网表,

所以输入信号网表全部以灰色表示。如果要采样输入信号,则可通过连接其输入缓冲信号来实现。时钟信号选择相应的BUFGP,普通信号选择相应的IBUF.

2.4 缺点

经过使用后我觉得,其深度太浅,只能记录那么点数据(16384),还好,触发条件是可以自己控制的。

2.5 使用说明

Add new source→ChipScope definition and connection File→输入文件名→在工程中添加Chipscope→双击打开该文件→配置chipscope→配置完后→编译,布局布线→打开Chipscope→→device →config→双击trigger setup→→运行就OK了

3 Modesim 与ISE 联合仿真

3.1 安装方法,照下面操作即可实现联合仿真

在生成modesim.ini文件之前最好先把EDITER->PREFERENCE->INTEGRA TED TOOL 里面的综合工具的路径先修改了。

1、直接找到E:\Xilinx\11.1\ISE\bin\nt\compxlib.exe(根据自己的安装路径来找),打开compxlib.exe,一路默认确定即可...,这个很漫长,一开始一直是0%,我还以为没有运行,后来等了好久,突然之间变成9%,确信这个没有问题了,好像大概运行了半个多小时吧,才完事。没看《无线通信FPGA设计》这本书的时候我还以为这样就好了呢,调用了一下发现还是找不到库。接下来是那本书上说的第二步

2、在Xilinx本地库编译成功之后,在相应的目录下会自动生成modelsim.ini文件,

用任何一个文本编辑器将该文件中[Library]目录下(除others以外)的内容添加到硬盘上相应的另外的Modelsim安装目录下同名modelsim.ini文件中的相应[Library]位置。我找了一下,发现modelsim.ini中没有others,就直接把刚才生成的modelsim.ini直接复制到Modelsim安装目录下了,将原来的modelsim.ini覆盖掉了,(为了安全起见,你可以先把Modelsim安装目录下的modelsim.ini复制到另外的位置,)然后再ISE中调用了一下Modelsim,就好使了。

注意;网上的那些新建库,然后编译库的那些方法,我都试了,可就是不好使,不知道为什么,有兴趣的话你可以试一下,说不定就好使了。反正我没有整好使。

之后的话就简单了,像在ISE中进行仿真一样。编好测试文件后,进入simulatin 面板,你会惊喜的发现,突然低下不是ISE自己的仿真器了,而是MODOLESIM,另外右边还多了几个仿真的选项前仿真,后仿真,或者其它。

3.1.1 安装注意事项

不知道为什么,我把ISE12.1中生成的MODESIM.INI直接覆盖或者修改到MODESIM 安装目录下时,12.1总是不能正确的仿真。而11.4可以。更奇怪的是,我用11.4生成的MODESIM.INI修改MODESIM安装目录下的该文件后,12.1也可以用了。

3.2 主要的优点

晕了,ISE自带的仿真工具和MODSIM中的仿真工具在仿真的速度上根本就不是一个等级,快了N倍,反正就是快多了。在较小的设计中或许ISE还能满足要求,如果设计复杂的话,MODESIM的优点就太明显了。

MODESIM可能对仿真的处理更准确些,在针对FPGA_68013这个项目的仿真中,ISE 的仿真中START_T信号是一串固定的,快速变化的信号,但是呢,在MODESIM中它就是一根红线,表示不确定。而实际用示波器进行测试时其实也是不确定的,它的值可能多种变化。

上面的结论都是从一个项目中得出的,不一定准确。

3.2.1 关于波形比较

按照1中把波形产生后,首先,对综合后波形进行存储为WLF文件,方法如下:FILE->DATASET->选中当前仿真文件SIM(Vsim.wlf)->点击save as->命名并保存之后布局,布线,之后再打开MODESIM,进行比较,方法如下:

Tools->wave compare->compare wizard->^^^^

设置完成后,TOOLS->Wave form compare->start comparison

就可以看到其结果了,在结果中,相比较的两个波形不同的地方会用红色表示。

3.2.2 数据流窗口调试

其实我觉得没什么用,因为,看其数据图也看不出到底是哪的代码出了问题:

先记录如下:以后再来深究

数据流窗口的最大用途是用来进行信号跟踪,方便查找错误的根源所在,这在布局布线后仿真作用中非常明显。

方法如下:

1 通过ISE进入MODESIM仿真

2 IEW->dataflow,打开数据流窗口后,

3 还是要全速进行仿真,发现你感兴趣的信号后,双击,会在dataflow窗口中出现一堆逻辑符号,之后你就可以trace /chase x一直查找到导制你的信号变成X的根源为止。

3.2.3 代码覆盖率,这功能不错

所谓的代码覆盖率,指的是Modesim能得到statement(语句),branch(分支),condition(条件),expression(表达式),toggle(信号翻转),fsm(有限状态机)等多种条件下的覆盖率。

1通过ISE进入MODESIM仿真

2编译目标代码,在命令行输入以下命令

Vlog –cover bcsxf file1.v file2.v file3.v …test.v

其中“-cover bcsxf”代表modesim执行branck,condition,toggle,fsm的覆盖统计操作。3加载该程序,在命令行输入以下命令

Vsim –voptargs = ”+acc”–coverage file1/file2/…/test

之后运行代码就可以看到哪些代码运行了,哪些代码没有运行,而运行了的代码运行了多少次。

4view->object 查看翻转统计

4.BUFG,IBUFG,BUFGP,IBUFGDS等含义以及使用

目前,大型设计一般推荐使用同步时序电路。同步时序电路基于时钟触发沿设计,对时钟的周期、占空比、延时和抖动提出了更高的要求。为了满足同步时序设计的要求,一般在FPGA设计中采用全局时钟资源驱动设计的主时钟,以达到最低的时钟抖动和延迟。FPGA 全局时钟资源一般使用全铜层工艺实现,并设计了专用时钟缓冲与驱动结构,从而使全局时钟到达芯片内部的所有可配置单元(CLB)、I/O单元(IOB)和选择性块RAM(Block Select RAM)的时延和抖动都为最小。为了适应复杂设计的需要,Xilinx的FPGA中集成的专用时钟资源与数字延迟锁相环(DLL)的数目不断增加,最新的Virtex II器件最多可以提供16个全局时钟输入端口和8个数字时钟管理模块(DCM)。

与全局时钟资源相关的原语常用的与全局时钟资源相关的Xilinx器件原语包括:BUFG、IBUFGDS、BUFG、BUFGP、BUFGCE、BUFGMUX、BUFGDLL和DCM等

1. IBUFG即输入全局缓冲,是与专用全局时钟输入管脚相连接的首级全局缓冲。所有从全局时钟管脚输入的信号必须经过IBUF元,否则在布局布线时会报错。IBUFG支持AGP、CTT、GTL、GTLP、HSTL、LVCMOS、LVDCI、LVDS、LVPECL、LVTTL、PCI、PCIX和SSTL等多种格式的IO标准。

2. IBUFGDS是IBUFG的差分形式,当信号从一对差分全局时钟管脚输入时,必须使用IBUFGDS作为全局时钟输入缓冲。IBUFG支持BLVDS、LDT、LVDSEXT、LVDS、LVPECL 和ULVDS等多种格式的IO标准。

3. BUFG是全局缓冲,它的输入是IBUFG的输出,BUFG的输出到达FPGA内部的IOB、CLB、选择性块RAM的时钟延迟和抖动最小。

4. BUFGCE是带有时钟使能端的全局缓冲。它有一个输入I、一个使能端CE和一个输出端O。只有当BUFGCE的使能端CE有效(高电平)时,BUFGCE才有输出。

5. BUFGMUX是全局时钟选择缓冲,它有I0和I1两个输入,一个控制端S,一个输出端O。当S为低电平时输出时钟为I0,反之为I1。需要指出的是BUFGMUX的应用十分灵活,I0和I1两个输入时钟甚至可以为异步关系。

6. BUFGP相当于IBUG加上BUFG。

7. BUFGDLL是全局缓冲延迟锁相环,相当于BUFG与DLL的结合。BUFGDLL在早期设计中经常使用,用以完成全局时钟的同步和驱动等功能。随着数字时钟管理单元(DCM)

的日益完善,目前BUFGDLL的应用已经逐渐被DCM所取代。

8. DCM即数字时钟管理单元,主要完成时钟的同步、移相、分频、倍频和去抖动等。DCM与全局时钟有着密不可分的联系,为了达到最小的延迟和抖动,几乎所有的DCM应用都要使用全局缓冲资源。DCM可以用Xilinx ISE软件中的Architecture Wizard直接生成。

4.1全局时钟资源的使用方法(五种)

1:IBUFG + BUFG的使用方法:

IBUFG后面连接BUFG的方法是最基本的全局时钟资源使用方法,由于IBUFG组合BUFG相当于BUFGP,所以在这种使用方法也称为BUFGP方法。

2. IBUFGDS + BUFG的使用方法:

当输入时钟信号为差分信号时,需要使用IBUFGDS代替IBUFG。

3. IBUFG + DCM + BUFG的使用方法:

这种使用方法最灵活,对全局时钟的控制更加有效。通过DCM模块不仅仅能对时钟进行同步、移相、分频和倍频等变换,而且可以使全局时钟的输出达到无抖动延迟。

4. Logic +BUFG的使用方法:

BUFG不但可以驱动IBUFG的输出,还可以驱动其它普通信号的输出。当某个信号(时钟、使能、快速路径)的扇出非常大,并且要求抖动延迟最小时,可以使用BUFG驱动该信号,使该信号利用全局时钟资源。但需要注意的是,普通IO的输入或普通片内信号进入全局时钟布线层需要一个固有的延时,一般在10ns左右,即普通IO和普通片内信号从输入到BUFG输出有一个约10ns左右的固有延时,但是BUFG的输出到片内所有单元(IOB、CLB、选择性块RAM)的延时可以忽略不计为“0”ns。

5.Logic + DCM + BUFG的使用方法:

DCM同样也可以控制并变换普通时钟信号,即DCM的输入也可以是普通片内信号。使用全局时钟资源的注意事项全局时钟资源必须满足的重要原则是:使用IBUFG或

IBUFGDS的充分必要条件是信号从专用全局时钟管脚输入。换言之,当某个信号从全局时钟管脚输入,不论它是否为时钟信号,都必须使用IBUFG或IBUFGDS;如果对某个信号使用了IBUFG或IBUFGDS硬件原语,则这个信号必定是从全局时钟管脚输入的。如果违反了这条原则,那么在布局布线时会报错。这条规则的使用是由FPGA的内部结构决定的:IBUFG和IBUFGDS的输入端仅仅与芯片的专用全局时钟输入管脚有物理连接,与普通IO 和其它内部CLB等没有物理连接。另外,由于BUFGP相当于IBUFG和BUFG的组合,所以BUFGP的使用也必须遵循上述的原则。

4.2 全局时钟资源的例化方法

全局时钟资源的例化方法大致可分为两种:

一是在程序中直接例化全局时钟资源;

二是通过综合阶段约束或者实现阶段约束实现对全局时钟资源的使用;

第一种方法比较简单,用户只需按照前面讲述的5种全局时钟资源的基本使用方法编写代码或者绘制原理图即可。

第二方法是通过综合阶段约束或实现阶段的约束完成对全局时钟资源的调用,这种方法根据综合工具和布局布线工具的不同而异。

4.3详解IBUFG/IBUFGDS+BUFG用法

IBUFG(全局时钟缓冲)后面接BUFG(全局缓冲)是最基本的全局时钟使用方法。

IBUFG CLKIN_IBUFG (.I(CLKIN).O(CLKIN_IBUFG));

BUFG CLK_BUFG (.I(CLKIN_IBUFG),.O(CLK_OUT));

当输入信号是差分信号时,需要使用IBUFGDS代替IBUFG,相应语法如下:

IBUFGDS CLKIN_IBUFGDS (.I(CLKIN_P_IN),.IB(CLKIN_N_IN),.O(CLKIN_IBUFGDS));

BUFG CLK_BUFG (.I(CLKIN_IBUFGDS),.O(CLK_OUT));

5.I2C网上程序精读(尽快抽空)

5.1 关于上复位

reg nrst;

integer nrst_count;

always @ (posedge clkdiv)

begin

nrst_count <=nrst_count+1;

if(nrst_count==0 && flag ==0) begin nrst<=0; flag=1;end else if(nrst_count==300000) begin nrst<=1; flag=1;end else begin nrst<=nrst;flag=flag;

end reg nrst;

integer nrst_count;

always @ (posedge clkdiv) begin

nrst_count <=nrst_count+1; if(nrst_count==0) nrst<=1;

if(nrst_count==3000) nrst<=0; if(nrst_count==5000) nrst<=1; end

左边是正确的结果,而右边是错误的。仔细分析下右边。因为integer是32位的,也就是最大能表示32位的2bit的数值。然后,如果计数器超过这个值以后呢,nrst_count就会溢出。重新自动归0,如此的话,就成了过段时间就会复位,而这不是设计都(我)的思路。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。未完待续

一个硬件工程师高手的设计经验分享(上)

推荐到论坛 一:成本节约 现象一:这些拉高/拉低的电阻用多大的阻值关系不大,就选个整数5K 吧 点评:市场上不存在5K 的阻值,最接近的是 4.99K(精度1%),其次是5.1K(精度5%),其成本分别比精度为20%的4.7K 高4倍和2 倍。20%精度的电阻阻值只有1、1.5、2.2、3.3、4.7、6.8几个类别(含10的整数倍);类似地,20%精度的电容也只有以上几种值,如果选了其它的值就必须使用更高的精度,成本就翻了几倍,却不能带来任何好处。 现象二:面板上的指示灯选什么颜色呢?我觉得蓝色比较特别,就选它吧 点评:其它红绿黄橙等颜色的不管大小(5MM 以下)封装如何,都已成熟了几十年,价格一般都在5毛钱以下,而蓝色却是近三四年才发明的东西,技术成熟度和供货稳定度都较差,价格却要贵四五倍。目前蓝色指示灯只用在不能用其它颜色替代的场合,如显示视频信号等。 现象三:这点逻辑用74XX 的门电路搭也行,但太土,还是用CPLD吧,显得高档多了 点评:74XX的门电路只几毛钱,而CPLD至少也得几十块,(GAL/PAL虽然只几块钱,但公司不推荐使用)。成本提高了N 倍不说,还给生产、文档等工作增添数倍的工作。现象四:我们的系统要求这么高,包括MEM、CPU、FPGA等所有的芯片都要选最快的 点评:在一个高速系统中并不是每一部分都工作在高速状态,而器件速度每提高一个等级,价格差不多要翻倍,另外还给信号完整性问题带来极大的负面影响。 现象五:这板子的PCB 设计要求不高,就用细一点的线,自动布吧 点评:自动布线必然要占用更大的PCB 面积,同时产生比手动布线多好多倍的过孔,在批量很大的产品中,PCB 厂家降价所考虑的因素除了商务因素外,就是线宽和过孔数量,它们分别影响到PCB 的成品率和钻头的消耗数量,节约了供应商的成本,也就给降价找到了 理由。 现象六:程序只要稳定就可以了,代码长一点,效率低一点不是关键 点评:CPU 的速度和存储器的空间都是用钱买来的,如果写代码时多花几天时间提高一下程序效率,那么从降低CPU 主频和减少存储器容量所节约的成本绝对是划算的。CPLD/FPGA设计也类似。 二:低功耗设计 现象一:我们这系统是220V供电,就不用在乎功耗问题了 点评:低功耗设计并不仅仅是为了省电,更多的好处在于降低了电源模块及散热系统的成本、

一个合格的FPGA工程师需要掌握哪些知识

一个合格的FPGA工程师需要掌握哪些知识?这里根据自己的一些心得总结一下,其他朋友可以补充啊。 1.Verilog语言及其于硬件电路之间的关系。 2.器件结构(最好熟练掌握Spartan3,Vertix4系列的器件结构,及其资源于Verilog行为描述方法的关系。)。 3.开发工具(熟练掌握Synplify,Quartus,ISE,Modelsim)。 4.数字电路(组合电路,触发器,特别是D触发器构成分频器,奇数倍分频占空比为50%,时序电路,并且能用Verilog语言描叙。)。 5.熟悉FPGA设计流程(仿真,综合,布局布线,时序分析)。 6.熟练掌握资源估算(特别是slice,lut,ram等资源的估算)。 7.同步设计原理。 8.熟练掌握基本概念(如建立时间,保持时间,流量(即所做FPGA设计的波特率)计算,延迟时间计算(所做FPGA设计),竞争冒险,消除毛刺的方法等等)。 9.具备具体设计经验(对应届生而言如毕业设计)。 10.良好的设计思路(流水线设计即熟称打拍子,在速率资源功耗之间的折中考虑)。 一个合格的FPGA工程师至少在以下三个方面的一个非常熟悉: 1.嵌入式应用 2.DSP应用 3.高速收发器应用 将自己的走过的弯路和总结的经验与大家分享一下,希望对您有一点点

的参考价值。 首先从先从如何成为一个合格的设计者说起吧!初学者觉得一切都是挑战,一切都新鲜,不知从何处下手。我总结了学习EDA逻辑设计的4个步骤,请拍砖! 1。首先,应该好好学习一下FPGA/CPLD的设计设计流程。 不要简单的以为就是设计输入-》仿真-》综合-》实现那么一回事,要抠细,要学精,要多问每个步骤的注意事项,区分相关步骤的联系和区别。比如要搞清楚功能仿真、综合后仿真、Translate后仿真、Map 后的仿真、布局布线后仿真的作用都是什么,什么时候应该做,什么时候可以不做这些仿真!学习清楚了设计流程最大的好处就是有利于培养良好的EDA设计习惯,日后会受益非浅! 2。关于设计输入和Coding Style。 设计输入最好学习HDL语言,Verilog、VHDL都可以,可以把状态机输入和原理图输入作为补充内容,但不是重点。我在前面的帖子已经反复强调了Coding Style的重要性。因为它是逻辑设计人员的一个基本业务素质。而且Coding Style不是看几篇文章,学几条原则就能够成为高手的,他需要您在工作中不断的体会和积累,在学习的最初,有Coding Style的意识,设计者就会有意的积累,对日后发展很有好处。反之则后患无穷。 3。培养硬件的意识,培养系统的观念。 我也在交流和授课的时候很强调硬件意识,如果从形式上看,逻辑设计随着智能化和优化手段的不断发展最后会越来越灵活,越来越简单。比

(完整版)FPGA资深FAE的经验独白

骏龙科技Andrew —— FPGA资深FAE的经验独白 时间:2014-08-25 来源:elecfans 作者: 关键字:FPGA FAE骏龙科技 看似简单的几个问题,Andrew却回答的井井有条,小编已经没有办法有什么其他词语去形容了。本文Andrew不仅仅对FPGA入门学习流程做了详细的分享,更是对FPGA开发工作的要求分成大公司和小公司两个层面来分析。你能想象曾经从一个疏忽学业的人成为一名资深FAE的嘛? 1. 您认为想学FPGA的话,先学好什么才最重要? Andrew:我们玩FPGA的通常就是跟数字电路打交道,要想玩得转,必须先学习并掌握最最基础的数字电路和HDL硬件描述语言,当然这只是入门必备,实际上远远不够。个人拙见,要入行除了至少掌握一种FPGA的仿真及开发调试流程之外;起码还要了解一些模拟电路知识,掌握诸如电源纹波、时钟抖动、信号质量等经常需要测量的硬件参数的测试方法;起码还要掌握一种原理图和Layout设计软件,能够查看分析调试电路板上的电路模块,如电源、时钟、存储器、配置、I/O和高速收发器等模块;起码还要掌握一种单片机的开发流程,项目中难免有一些需要配置控制的需求,使用外置单片机或者内置ARM硬核或者其他软CPU来实现,简单又方便;由于本人水平有限,其他方面这里就不再赘述。 那么,针对FPGA入门学习的一般流程,简单总结一下,供朋友们参考,有经验的大牛可以绕道: 1.首先要有开发平台,把该准备的都准备好,磨刀不误砍柴工: 比如ALTERA的Quartus II软件、开发板和配置调试工具USB Blaster,以及仿真软件Modelsim SE。软件可以从网上下载,入门功能的许可的和谐方法一大堆;开发板和USB Blaster可以借,可以买,动手能力强的朋友,自己画一块也行。对于初学者,建议找一块有详细配套教程的开发板。 2. 对于新手来讲,按部就班地学习往往就是最快的学习方法: 照猫画虎尽管囫囵吞枣一知半解,但起码能把开发流程摸熟,能跑起来。刚拿到开发板,肯定是丈二和尚摸不着头脑。这个时候,建议先根据开发板的配套教程,把原理图上的各项模块功能厘清,把FPGA周围的电源、时钟、复位、配置、GPIO和连接器等的电路原理理一理分析分析。再按照配套教程中介绍的流程,把配套的测试工程跑通,在这个阶段,

10年FPGA开发经验的工程师肺腑之言

10年FPGA开发经验的工程师肺腑之言 从大学时代第一次接触FPGA至今已有10多年的时间。至今记得当初第一次在EDA实验平台上完成数字秒表,抢答器,密码锁等实验时,那个兴奋劲。当时由于没有接触到HDL硬件描述语言,设计都是在MAX+plus II原理图环境下用74系列逻辑器件搭建起来的。后来读研究生,工作陆陆续续也用过Quartus II,Foundation,ISE,Libero,并且学习了verilogHDL语言,学习的过程中也慢慢体会到verilog的妙用,原来一小段语言就能完成复杂的原理图设计,而且语言的移植性可操作性比原理图设计强很多。 在学习一门技术之前我们往往从它的编程语言入手,比如学习单片机时,我们往往从汇编或者C语言入门。所以不少开始接触FPGA的开发人员,往往是从VHDL或者Verilog开始入手学习的。但我个人认为,若能先结合《数字电路基础》系统学习各种74系列逻辑电路,深刻理解逻辑功能,对于学习HDL 语言大有裨益,往往会起到事半功倍的效果。 当然,任何编程语言的学习都不是一朝一夕的事,经验技巧的积累都是在点滴中完成,FPGA设计也无例外。下面就以我的切身体会,谈谈FPGA设计的经验技巧。 1)看代码,建模型 只有在脑海中建立了一个个逻辑模型,理解FPGA内部逻辑结构实现的基础,才能明白为什么写Verilog和写C整体思路是不一样的,才能理解顺序执行语言和并行执行语言的设计方法上的差异。在看到一段简单程序的时候应该想到是什么样的功能电路。 例如: 上面这段代码实现的功能就是一个带使能端的2选1数据选择器,如下图所示。

再例如: 上面这段always实现的是带同步清零端的串并转换移位寄存器,位宽为width,下图为8位电路模型 当你具备了一定的识代码能力之后,你会发现原来Verilog不是那么的枯燥,只不过是一个个电路模型的拼搭而已。 2)组合逻辑中的if...else...与case 对于多输入端的组合逻辑来说,如果不需要考虑优先级应该尽量采用case语句来描述,这样综合出来的电路并行度要大一些,如果采用if...else...结构,综合出来的电路都是串行的,增大了信号时延路径。降低寄存器间组合路径的延迟是提高系统工作频率的主要手段,因此在完成相同功能的前提下应该尽量使用并行结构逻辑。

FPGA学习步骤30页

FPGA学习步骤,我的体会 FPGA在目前应用领域非常,在目前的单板设计里面,几乎都可以看到它的身影。从简单的逻辑组合,到高端的图像、通信协议处理,从单片逻辑到复杂的ASIC原型验证,从小家电到航天器,都可以看到FPGA应用,它的优点在这里无庸赘述。从个人实用角度看,对于学生,掌握FPGA可以找到一份很好的工作,对于有经验的工作人员,使用fgpa可以让设计变得非常有灵活性。掌握了fpga的设计,单板硬件设计就非常容易(不是系统设计),特别是上大学时如同天书的逻辑时序图,看起来就非常亲切。但fpga的入门却有一定难度,因为它不像软件设计,只要有一台计算机,几乎就可以完成所有的设计。fpga的设计与硬件直接相关,需要实实在在的调试仪器,譬如示波器等。这些硬件设备一般比较昂贵,这就造成一定的入门门槛,新人在入门时遇到一点问题或者困难,由于没有调试设备,无法定位问题,最后可能就会放弃。其实这时如果有人稍微指点一下,这个门槛很 容易就过去。 我用FPGA做设计很多年了,远达不到精通的境界,只是熟悉使用,在这里把我对fpga的学习步骤理解写出来,仅是作为一个参考,不对的地方,欢迎大家讨 论和指正。 1、工欲善其事,必先利其器。

计算机必不可少。目前FPGA应用较多的是Altera 和xilinx这两个公司,可以选择安装quartusII或者ISE 软件。这是必备的软件环境。 硬件环境还需要下载器、目标板。虽然有人说没有下载器和目标板也可学习fpga,但那总是纸上谈兵。这就像谈女朋友,总是嘴上说说,通个电话,连个手都没牵,能说人家是你朋友?虽说搭建硬件环境需要花费,但想想,硬件环境至多几百元钱,你要真的掌握FPGA的设计,起薪比别人都不止高出这么多。这点花费算什么? 2、熟悉verilog语言或者vhdl语言,熟练使用 quartusII或者ISE软件。 VHDL和verilog各有优点,选择一个,建议选择verilog。熟练使用设计软件,知道怎样编译、仿真、下载 等过程。 起步阶段不希望报一些培训班,除非你有钱,或者运气好,碰到一个水平高、又想把自己的经验和别人共享的培训老师,不然的话,培训完后总会感觉自己是一个冤大头。入门阶段可以在利用网络资源完成。 3、设计一个小代码,下载到目标板看看结果 此时可以设计一个最简答的程序,譬如点灯。如

基于verilog的FPGA编程经验总结

基于verilog的FPGA编程经验总结 用了半个多月的ISE,几乎全是自学起来的,碰到了很多很多让人DT好久的小问题,百度也百不到,后来还是都解决了,为了尽量方便以后的刚学ISE的童鞋不再因为一些小问题而纠结,把这几天的经验总结了一下。好了,废话不多说,上料! 1.用ISE仿真的时候.所用变量一定要初始化. ISE默认初始量为”XXXXX”, 而Quarters是默认为”00000”的, 其实实际上, 下到FPGA里后也是默认为0的,只是可以说ISE严谨得令人DT吧. 比如说用一个累加器, result = A+B+result ,必须保证在某一刻A, B, result都为定值时, 之后的数据才不会一直为”XXXXX”; 2.所有的中间线(就是module间用来传递参数的信号)都要用wire定义一下. 这个ise一般会提醒的; 3.任何一个warning都是有用的; 4.debug时要多把中间变量设成输出,然后查看仿真波形; 5.其实,新版本还是比较好用的.虽然取消了test bench wave 功能. 但是最好学会编测试文件,后期比test bench wave好用, 而且貌似一旦测试信号太多,test bench wave就不

显示某些输出了; 6. warning: Nod is unconnected. 表明所在的模块没用被执行,一般是参数没进来, 或者进来的参数不对(“XXXX”之类)的原因引起的. 7.建立rom时候,Error: sinrom can’t be resolved. 因为在把程序挪地方的时候,sinrom.ngc文件没有一同拷过来. 8.把”XXXXX”信号处理掉的一个方法可以是: 从信号中随意选出一位if (data[0] == 0) ....; else if (data[0] == 1).... else data = 0; 就可以把”XXXX”信号给清成”0000”了. 可以很好的解决1中仿真的问题. 9.如果某一个不是时钟的信号被当作周期信号来用的话,就会出现WARNING:Route:455 - CLK Net:trn_clk_OBUF may have excessive skew. because 0 CLK pins and 1 NON_CLK pins failed to route using a CLK template 不管也行. 10. 一开始用FPGA时不要害怕,用ucf文件配好引脚,直接LOAD,先不用管什么区域约束,以后进阶了再学. . 11.暂时就记得这些,以后再补充吧.

FPGA学习心得体会

篇一:fpga学习心得大报告 《fpga技术基础》学习报告 --课程内容学习心得 姓名: 学号:年级专业: 指导教师: 瞿麟 201010401128 自动化101薛小军摘要从开始学fpga到现在粗略算来的话,已经有3个多月了,就目前而言,我并不确定自己算不算高手们所说的入门了,fpga学习总结。但是不管现在的水平如何,现在就总结一下自己学习它的感受或一些认识吧。 关键词 fpga de2板 quartusii软件 verilog语言 引言 fpga是什么?fpga现状?怎样学习fpga? fpga是现场可编程门阵列的简称,fpga的应用领域最初为通信领域,但目前,随着信息产业和微电子技术的发展,可编程逻辑嵌入式系统设计技术已经成为信息产业最热门的技术之一,应用范围遍及航空航天、医疗、通讯、网络通讯、安防、广播、汽车电子、工业、消费类市场、测量测试等多个热门领域。并随着工艺的进步和技术的发展,向更多、更广泛的应用领域扩展。越来越多的设计也开始以asic转向fpga, fpga正以各种电子产品的形式进入了我们日常生活的各个角落。 正文 (1)掌握fpga的编程语言 在学习一门技术之前我们往往从它的编程语言开始,如同学习单片机一样,我们从c语言开始入门,当掌握了c语言之后,开发单片机应用程序也就不是什么难事了。学习fpga也是如此,fpga的编程语言有两种:vhdl和verilog,这两种语言都适合用于fpga的编程。 (2)fpga实验尤为重要 除了学习编程语言以外,更重要的是实践,将自己设计的程序能够在真正的fpga里运行起来,这时我们需要选一块板子进行实验,我们选择使用de2板才进行试验。 初识de2开发板 de2的资源de2的资源非常丰富,包括 1. 核心的fpga芯片-cyclone ii 2c35 f672c6,从名称可以看出,它包含有35千个le,在altera的芯片系列中,不算最多,但也绝对够用。altera下载控制芯片- epcs16以及usb-blaste对jtag的支持。 2.存储用的芯片有: 512-kb sram,8-mbyte sdram,4-mbyte flash memory 3. 经典io配置:拥有4个按钮,18个拨动开关,18个红色发光二极管,9个绿色发光二极管,8个七段数码管,16*2字符液晶显示屏, 4. 超强多媒体:24位cd音质音频芯片wm8731(mic输入+linein+ 标准音频输出),视频解码芯片(支持ntsc/pal制式),带有高速dac视屏输出vga模块。 5.更多标准接口:通用串行总线usb控制模块以及a、b型接口,sd card接口,irda红外模块, 10/100m自适应以太网络适配器,rs-232标准串口, ps/2键盘接口 6.其他:50m,27m晶振各一个,支持外部时钟, 80针带保护电路的外接io 7.此外还有:配套的光盘资料,qutuarsii软件,niosii 6.0ide,例程与说明文档。 关于管脚分配 当我们创建一个fpga用户系统的时候,到最后要做的工作就是下载,在下载之前必须根据芯片的型号分配管脚,这样才能将程序中特定功能的管脚与实际中的fpga片外硬件电路一一对

SignalTap_ELA的FPGA在线调试技术

经验交流 EXPERIENCE EXC HAN GE Signal T apII ELA 的FPGA 在线调试技术 刘政,蒋志勇 (桂林航天工业高等专科学校电子工程系,桂林541004) 在设计基于FPGA 的电子系统时,一般需要用示波器、逻辑分析仪等外部测试设备进行输入输出信号的测试,借助测试探头把信号送到测试设备上进行观察分析。当然,前提是需要保留足够多的引脚,以便能选择信号来驱动I/O 进行测试。但是外部的测试设备在测试FPGA 系统时,常会遇到这样的情况:FPGA 的I/O 引脚数量不够丰富,PCB 布线和封装工艺复杂导致I/O 引脚引出困难,外部测试探头有影响FPGA 信号时序和完整性的可能 [1-2] 。 如果能在FP GA 内部嵌入具有外部测试设备功能的逻辑测试模块,那么以上问题就可以一一解决。Signal 2 Tap II 就是这样一种嵌入式逻辑分析器(embedded logic analyzer ),简称为Signal Tap II ELA 。它是Quart usII 软件 中集成的内部逻辑分析软件,使用它可以实时观察内部信号波形,方便用户查找设计的缺陷。 1SignalTapII E LA 的原理 S ignal T apII ELA 是Quartus 软件中第二代系统级调试 工具。将Signal T apII ELA 代码和系统逻辑代码组合交由 QuartusII 编译、综合、布局布线,生成sof 文件中内含Sign 2al T apII ELA ,把sof 文件配置到FPG A 内。FPGA 运行时, 一旦满足待测信号的触发条件,Signal T apII ELA 就立即启动,按照采样时钟的频率捕获待测信号数据并暂存于FP 2 G A 片内的RAM 中,采样数据不断刷新片内存储器,最后 通过J T A G 口将捕获的信号从片内RAM 传至Quartus II 实时显示。Signal T apII ELA 的原理流程如图1 所示。 图1 SignalT apII E LA 原理流程 实际工程中,加入Signal Tap II ELA 不会影响系统原有的逻辑功能。 2SignalTapII E LA 的配置 Signal Tap II ELA 基本配置过程[3] 如下: ①添加采样时钟。Signal Tap II ELA 在时钟的上升沿进行采样,可以使用设计系统中的任何信号作为采样时钟,根据Altera 公司的建议最好使用同步系统全局时钟作为采样时钟。但是在实际应用中,多数使用独立的采样时钟,这样能采样到被测系统中的慢速信号,或与工作时钟相关的信号。当然采样时钟的频率要大于被测信号的最高频率,否则被测信号波形会有较大误差。 ②定义采样深度。采样深度决定了待测信号采样存储的大小,而可以采样的深度是根据设计中剩余的RAM 块容量和待测信号的个数决定的。若待测信号较多,则在同样I/O Bank 个数情况下采样深度较浅。待测信号个数的增减和采样深度的深浅会直接改变RAM 块的占用情况,采样深度的范围为0~128K B 。 ③定义RAM 类型。设置占用片内何种RAM 块资源,随着采样深度的改变,RAM 块的数据线和地址线宽度可以分割成多种组合。例如:采样深度是1K B ,RAM 数据线、地址线可以分割成2×512或4×256等多种组合。依此类推。 ④定义触发位置。Pre trigger position 表示采样到的数据12%为触发前,88%为触发后;Center trigger position 表示采样的数据处于触发前后各一半;Post trigger posi 2 tion 表示采样到的数据88%为触发前,12%为触发后。 ⑤触发条件级数设置。Signal Tap II ELA 支持多触发级的触发方式,最多可支持10级触发,帮助滤除不相干的数据,更快地找到需要的数据。若有多级触发条件,首先分析第一级触发条件。若第一级为TRU E ,则转到分析第二级是否满足,直到分析完所有触发条件均为TRU E 才最终触发时钟采样数据。 ⑥触发条件。设定约束性的触发条件。可以允许单个信号的独立触发条件Basic ,直接采用单个外部或设计模块内部的信号;也可以允许多个节点信号的组合触发条 件Advanced ,构成触发函数的触发条件方程。例如:使能

9年FPGA工作经验总结

9年FPGA工作经验总结 三年的,用altera的c3和c4 做led控制卡。2年的用lattice的MACHXO-XO2和ECP2做了视频和网络光端机,3年的XILINX的SPARTAN 6 做了视频ISP处理,现在一年的xilinx的ZYNQ做机器视觉。 第一个,9年的fpga,说起来,给我感觉fpga写代码牛逼的人,都是写着看不懂的代码。基本上的代码都是小逻辑做的。大逻辑做的都是沙雕。 第二个,知道各类高速接口,做fpga只会玩玩串口,I2C,SPI还有DVI,这种低能儿工资也就是低于几千块钱。高速总线,列入DDR3控制,双边沿,SERDRES,这个是必须知道怎么用,怎么调试。好多沙雕就知道下载代码,有问题也不知道从哪里入手。 第三个,知道时序约束,fpga很傻的元件,你经常发现,他自己不知道哪个是时钟,要求跑多少。还有各类并行总线,要求相位抖动控制多少。还有不同时钟不要去约束。特别是用低端器件,用上了60%资源的人,经常无缘无故的bug的,低于五位数的工资基本不知道啥原因的。 第四个,也就是我一直遗憾的东西,行业的算法和需求了。有些沙雕一辈子就是打工的命。一年除去房租和吃饭,回去大农村还被邻居鄙视大学生读书无用。所以有些时候,要学会沉淀。也许我当年在led行业待了9年,我估计现在已经接无数的兼职和订单,少数一年买个宝马x1没有问题。哪像现在,自己出来真怕死。 就说这些。我转行了。一把眼泪。有人问我,是不是工资太少了。拿着别人要饭的钱,都是吊丝。想想你农村的父母和还有孩子吧。好好想点更快的路子。做硬件工程师,是做产品的第一步。因为你要面对很多销售沙雕,他们很有钱,但是天花乱坠的需求,这个时候,你只有学会硬件才能制造硬件方案。然后找软件工程师一起协作做项目。我以前的兼职项目就死在这里了。(小编注:其实楼主的工资不算低) 而且FPGA工程师,也必须熟悉硬件。连原理图都看不懂,你还做啥这么没前途的东西。 还有一个ZYNQ平台,fpga 工程师要学会arm的裸跑系统。因为我被傻x害惨了。

FPGA及verilog经典语法总结

2011-10-12 论坛笔记整理 第一部分vhdl程序中的基本问题总结 (1) 1.关于端口 (1) 2.信号和变量 (1) 3.位(矢量)与逻辑(矢量) (2) 4.关于进程 (3) (一). 多余时钟的引入 (3) (二). 输出多驱动 (4) 5.关于VHDL学习中的几点说明................................................................................................5 第二部分FPGA设计学习经验 (6) 1.FPGA学习的一些误区 (6) 2.设计方法经验 (9) 3.fpga设计的精髓—时序设计 (10) (一)总体设计方案和逻辑详细设计方案 (10) (二)如何提高电路工作频率(加约束,流水、切割状态) (11) (三)做逻辑的难点在于系统结构设计和仿真验证 (12) 4.设计规范很重要 (13) (一)设计必须文档化 (14) (二)代码规范 (14) (三)ALTERA参考设计准则 (16) 第三部分项目经验小结.....................................................................................................................17 经验 一...........................................................................................................................................17 经验 二 (18)

FPGA经验谈

寒假学习经验谈 今年的寒假时间相比往年少了很多天,但是相比去年而言,今年显得尤为重要,自己很重视这次的留校,尽自己的努力学习。 寒假的学习分为两个阶段,第一个阶段:全面的对单片机做一个总结,用了将近十天的时间,单片机是以后学习的基础,要想走的远,基础要打好,单片机的外设模块一个一个的走了一遍,具体的就不多说了; 第二个阶段:对EDA的入门学习,选择学习EDA是经过我的深思熟虑才做出的决定,总的说来,EDA的学习有十三天左右,因为是入门阶段,学的东西比较基础,有些知识很容易理解但却很容易遗忘,同样有些知识就不能理解,模模糊糊的。初学EDA ,先要学习的是Verilog 语言,Verilog语言是对硬件的描述语言,在很多地方与C语言不同,存在着很大的差异性,例如在写代码的时候,要在开头定义所有的输入量和输出量,还应该定义位宽,在一个.V文件中只能有一个模板module—endmodule ;我自己感觉,在用V语言写代码的时候,应用比较多的还是always语句、case语句、if-else语句,说实话,也就这些个语句能够明白,其他的语句可能是用的比较少,知道其用法的像assign顺序执行语句、fork-join 并行块,task-endtask任务语句,不过在使用fork-join语句的时候一直出现错误,错误显示fork-join语句不可综合,但是资料上和听学长讲,fork-join语句是可以综合的。在V语言中,若使用数据类型的时候没有定义位宽,系统会有默认值,如INT数据在未定义时,位宽是32位,reg存储型数据位宽默认值也是32位,还有一点就是在使用assign语句的时候,若为定义,系统默认为连线型数据wire。 Verilog编写代码时出现的错误和警告: Error (10112): Ignored design unit "bingxing" at bingxing.v(1) due to previous errors :严重错误多是头文件的问题; Error (10170): Verilog HDL syntax error at paobiao.v(26) near text "always"; expecting "@", or "end", or an identifier ("always" is a reserved keyword ), or a system task, or "{", or a sequential statement :错误原因:看起来无从下手,其实是在写代码的时候,begin end缺失或者是在结束处未加;等; Warning (10034): Output port "cnt4" at Verilog1.v(3) has no driver :定义了cnt4,但是没有使用; Warning (10230): Verilog HDL assignment warning at jishu.v(19): truncated value with size 32 to match size of target (4) :使用数据的时候没有定义位宽如:cnt<=cnt+1 (1’b1) 在写V代码的时候会遇到很多的警告,有些警告如共多少个管脚、未使用管脚没有接地、未配置管脚、未配置EPPROM等这些警告是可以忽略和消除的,还有一些警告如某管脚没有逻辑功能等就要重视了; EDA的学习是一项长期的事情,不能够追求进度的快慢,要打好基础,一步一步的走。总结起来EDA的学习一定要坚持。

【精品】FPGA面试经历

FPGA面试经验谈 对于一个面试过数十家公司之多的非211女生来说,此刻正在忐忑的等待一家公司的录用通 知,那种百感交集的感觉,想必找过工作的人儿都应该深有体会。在这忐忑不安的时刻,就 索性写一下自己身经百战的面经吧。 1、503所的子公司,航天中为和航天恒星算是面试的第一家。当时有三个面试官跟我 面对面坐,三个面试官很随和,没有一点架子。首先是千篇一律的自我介绍,完了之后就开 始讲项目,然后就开始问都做过什么约束,回答自然是周期约束、offset_in_before,offset_out_after约束偏移约束等等;其次是有没有考虑过跨时钟域的问题,答曰通过异步 FIFO或者握手信号可以同步异步信号,其他记不太清了。最终自然没有要我。 2、第二家是航天时代光电公司,对于非211的女生来说,能够在航天专场的招聘会上 拿到面试通知,自然是幸运。面试时一对一的,面我的那个人很和善。这个没有让做自我介绍,上来就看着简历上的项目问。简历上写的研究方向是高速信号处理,上来就问什么是高 速信号,挠挠头很尴尬的说我忘了,好在面试官比较随和。接着问简历上项目内容,以及这 些所谓的项目经验是否是真的接的项目,还是就是自己实现一下功能就完事。这个项目经验大家一定要好好想清楚,如果是真的接的公司或者研究所的项目,那自然是极好的;如果只是自己实现了一个什么功能,这样的项目经验一定要想清楚了怎么回答。其他好像就没什么了,完了面试官很温和的说保持手机畅通,如果有消息会电话通知。自然是最后没有任何 消息了。 3第三家公司仿佛是北京网康科技公司,当时笔试特别简单,就是计算机二级C语言的水平,稀里糊涂就被通知面试了,虽然我简历上全是FPGA的内容,跟这家主要做软件的 公司毫不相干。这家居然没有问一个技术问题,首先是自我介绍,负责软件研发的面试官上 来就问,个子挺高的,家是哪里的,家人都是干嘛的,兄弟姐妹几个,自己在人群中与别人 不一样的地反格式什么,自己的优点是什么,缺点是什么,自己做的最有成就的一件事是什么,十年之后自己的状态是什么样的,总之网上可查到的HR可能问到的问题全给问了一遍。 完了之后说觉得我做软件研发可能不会做太精,毕竟我的项目经验跟他们不相干。觉得我挺适合做技术支持的。然后就把那个技术支持面试官说,让技术支持面我。这个技术支持一开 始很严肃,但是也抵不过我的笑,最后也被逗的微笑了。又是问了千篇一律的问题,不细说。最后问我有什么问题要问他,我就比较白痴的问了一句,我表现的这么一般,你还会收我吗。他回答说他自己做不了决定,得回去商量一下。结果依然没收我。 4、第四家就是威盛电子了,话说威盛电子共有三面,两轮技术面,最后一轮hr面。第一面是个和善的姐姐,给我一张纸,一支笔,上来就说把自己的项目画个框图讲一下。讲完之后就根据简历问一下她不明白的地方。然后就说出去休息会,一会给通知。没等几分钟, 就通知去二面,二面据说是部门的技术总监,自然是问的特别专业特别难。毕竟威盛没有笔试,面试时自然问的就多了。问题如下: 1)用常用的逻辑门搭一个3位宽的计数器;2)FIR滤波器和IIR滤波器的区别,以及 各自应用场合;3)处理器结构;4)串口线最长能传输多少米;5)如何同步时钟相位;6)双绞线远距离传输有毛刺怎么办;7)做一个序列检测器,用两种方法;8)画一个十字路口红绿灯信号等;9)用场效应管搭一个逻辑电路如y=ab+cd;9)跨时钟域时如何处理跨时钟;10)DCM相位;11)IBUFG的作用。就这样被问死了,让出去休息一下,然后几分钟之后 就有一个妹子说今天面试结束了,自然是被拒了。其实很基础,就是自己底子太差了。 5、北京凌云光子技术。 笔试都是网上下载的FPGA面试宝典的内容,由笔试题就可以看出这家公司很懒。答 的自然是很好。理所当然的收到了面试通知。 面试先讲项目,完了之后问我项目他不懂的地方。让我回家等通知,我很愤怒,问他是不是

FPGA的快速入门经验谈(part1)

FPGA的快速入门经验谈(part1) 有很多年轻人,被割裂了历史,被荒废了未来,迷茫,迷茫到几乎绝望,不过,他们还年轻,青春尚存,还有创造力,还有奋斗的资本,其中不乏不甘心被抛弃,被覆盖之人。他们还在努力,希望把自己未来的主动权更多地掌握在自己手上学习和创造是一条和平的成功之路,但是,学什么,怎么学,怎么用,何处用?有一个领域,很多人,特别是曾学习过单片机的年轻人很感兴趣这就是FPGA芯片的开发应用,但面对FPGA技术所涉及的繁杂技术,大家普遍又感觉到学起来很难,无从下手,无从突破,前景不明,缺乏信心,本帖针对FPGA或单片机的快速入门学习,介绍了一种方法:柏氏7步FPGA 快速入门学习法,供大家参考。 柏氏学习法要达到两个主要目的:1.让初学者轻松、快速地入门2.与学习者探讨FPGA 相关的应用和市场前景为实现第一个目的,我们将采用打穿插的学习技巧,为实现第二个目的,我们与学习者漫谈又哪些可以抢先占领的行业制高点。 柏氏7步FPGA快速入门学习法共分7部分第一到第四部分为穿插式入门学习部分,是为了让初学者以最短的时间实现知识、概念和心理的快速入门。这4个部分,对于FPGA和单片机的学习都适用。第五部分至第七部分是沙盘谈兵式的介绍,告诉学员FPGA的特有技术优势、实现技巧和市场前景。这七个部分分别是:第一部分:了解下载线和JTAG第二部分:制作最简易的开发板第三部分:最偷懒的编程第四部分:检验入门成果第五部分:SOPC及实现技巧第六部分:专业产品的开发第七部分:个人奋斗特定IP的开发(上部:入门篇)FPGA入门学习网络讲座:柏氏7步FPGA快速入门学习法第一部分:了解下载线与JTAG很多人觉着学习FPGA或单片机很困难,为什么?内容太多,头绪太乱!我们第一步的任务就是:分解和简化问题。无论是FPGA还是单片机的开发,都要涉及到三个部分组成:开发平台(计算机),下载线,开发板(学习板)其中1.开发平台在开发初期并不需要下载线和开发板的支持就能立运行。2.下载线只是在目标代码下载或运行调试时才用到3.开发板在下载完毕后自己能够独立运行根据以上特点,我们采用各个击破的策略去学习和分析这几个部分。首先是最简单的下载线部分。每个厂家的开发模式都是

Vivado工程经验与各种时序约束技巧分享

Vivado工程经验与各种时序约束技巧分享 FPGA毕竟不是ASIC,对时序收敛的要求更加严格,本文主要介绍本人在工程中学习到的各种时序约束技巧。 首先强烈推荐阅读官方文档UG903和UG949,这是最重要的参考资料,没有之一。它提倡要在设计的早期阶段就要排除问题,越到后期时序的改善就越困难。其中HLS层次对性能的影响是最大的。 本文将从代码风格,时序修正,工程设置等几个方面介绍本人的实践经验,希望让各位初学者快速提高,也希望FPGAer能给出宝贵建议。 1. 代码风格推荐使用Xilinx language templates的代码块,这里的代码能够综合出正确且结构简洁的电路,包括移位寄存器,乘法,复数乘法,FIR滤波器等,凡是涉及到的模块尽量使用官方写法。 合理的设计代码框架。IO相关的代码、时钟管理单元尽量放在顶层,后者有助于以共享资源从而提高性能降低功耗。模块的输出最好是使用寄存器输出,有助于降低路径延时帮助时序收敛。 复位也是非常重要的问题。和ASIC不同,Xilinx FPGA的寄存器是高电平复位,支持异步复位和同步复位,但是DSP和BRAM内部的寄存器不支持异步复位。因此,官方更推荐设计采用高电平同步复位,可以降低资源的使用和功耗,有助于时序收敛。由于FPGA 的初始状态是确定的(可以在定义说明中指定),为了更快地时序收敛,官方文档认为,能不用复位是最好的,尤其数据路径和移位寄存器的设计中。不过使用同步复位仍需要注意控制集不能太多的问题。关于这方面的内容,UG949第三章Control Signals and Control Sets给了详细的说明。 数学运算使用DSP单元速度会更快一些,根据DSP的结构重组数学运算,充分利用FPGA 的DSP、BRAM资源。并且能做到对代码映射的硬件资源心里有数。 如果并不需要优先级,尽量将If语句转化为case语句。 尽量不要使用Dont Touch这类语句。如今Vivado综合工具已经很完善了,除非代码有问

读特权同学《深入浅出玩转FPGA》有感

读特权同学《深入浅出玩转FPGA》有感 看了特权同学的这本书,感悟颇多,最终使我重新确立了目标。只是思路有些杂乱,我得慢慢道来: 初识特权同学实在END网站上,因为他的FPGA助学活动,在得到他的35集FPGA教学视频后,得知他已经和北京航空航天大学出版社合作出板了《深入浅出玩转FPGA》一书。对于国内格式呆板、内容互抄的教科书,我是一直没有任何兴趣的,但是对于这样一个搞过FPGA项目的工程师写出的经验之谈,而且是以随笔的形式写出的书,我是没有任何理由放过的。也许我最需要的不是一份说教的知识,而是一个可以在我最困难的时候让陪我聊天、给我动力的‘人’,而这个‘人’就隐藏在这本书点点滴滴、洋洋洒洒的文字之间,等着我去感悟。由于我个人是习惯在当当网买书的,于是当下就去当当网搜索了一下,果然有这本书,售价是31.9元,但由于最近经济的原因我始终没有点下购买的按钮,于是自己买到这本书的计划便搁浅了。  也就是昨天我和一帮兄弟们去吉大的时候,偶然在兄弟那边看到了这本书,于是很爱不释手,当时便决定从兄弟手中‘横刀夺爱’了。呵呵,于是,这本书便随我来到了理工,被我带到了实验室。对于这样一本不同于现代呆板教材的书,我是很欣赏的,于是我开始用心去读这本书,去尽量感悟这本书的精髓,破开表面的知识去追求作者要给我们表达的深层次的意义。 很有幸的,我最后的结论是我没有选错书,在这本书中我感悟了很多,虽然我只读了第一个晚上,但这本书给我带来的感悟要比其他书籍在几周甚至几个月给我带来的感悟远远多得多...我感悟了很多,依靠串行触发是解决不了的,于是,我得用并行触发的方式来表达我的思路,首先得解释一下什么是并行触发:并行是指可以在同一时间进行响应,而没有顺序的问题。于是,在这部分,我拿并行的概念套用一下,下面的这些感悟没有刻意的进行先后排序,既没有重要程度的高低和内容高低的划分,因为我认为:每一点思考都可以带来进步。下面我就开始慢慢道来: 1:它纠正了我对FPGA的认识 说实话,我的兄弟在去年寒假就给我买好了FPGA开发板,我们分配的任务是我在理工主要攻FPGA方向,很惭愧的是当我用原来单片机的方式去学习FPGA时遇到了很大的障碍,这段学习的路进展很缓慢,于是不知不觉已经推迟到了今年暑假。暑假正式开始之前,在我打算自己的暑假生活的时候,FPGA这个小东西又很活跃的跳了出来,想到了自己的这半年在这方面基本没有任何进展,相当惭愧。于是决定暑假集中攻克FPGA,当然我也知道,FPGA这个东西和单片机、嵌入式一样,要的是长时间的点点滴滴的实践的积累,但是我可以加快我的进度,用自己最快的速度去学习FPGA,争取在本科毕业前自己主管一个FPGA的项目,尽管这个目标很难、很遥远、很不可企及。但我从不害怕,我会用自己的学习方法来换取效率,用高速可靠的效率来换时间! 接下来对比一下我原来和现在对于FPGA的认识:原来从单片机转型到FPGA时,并没有摸清这趟河水的深浅,而在不知深浅的情况下,我已经开始下水了。当时我认为FPGA和单片机一样,它是由一个超级经典的硬核架构起来的IC,通过编写程序来实现FPGA对外围的控制。但是现在想来,当初的想法是大错特错了,现在想来我的上半年FPGA学习进度基本为零也就是意料之中的事情了。我重新对FPGA的认识是这样的:首先,FPGA是纯硬件,现在我所写的‘程序’也就不能称之为程序,如果

AD9739使用经验分享

AD9739使用经验分享 --张亢 AD9739是一款14位的射频D/A转换器,采样时钟速率最高可以达到2.5G,是目前A DI公司高速DA产品中转换速率最高的一款芯片,作者使用这款芯片已经有1年多的时 间,现在和大家分享自己总结的经验,并且讨论目前存在的问题。 一芯片功能简介 图1 AD9739功能框图 图1为AD9739的功能框图,主要分为3个部分: (1)配置部分:A D9739内部有多达54个寄存器,用来控制芯片的数据接收,多芯片同步,Mu clock工作,输出电流等功能,并且有部分寄存器是指示寄存器(只读),用户 可以通过读出这些指示寄存器的值来确认芯片目前的工作状态。 (2)时钟部分:A D9739芯片所有时钟全部为差分时钟,共5对,分别为: DACCLK_P/N:DA芯片的时钟输入 DCO_P/N:数据输出时钟,传输给MC U。 DCI_P/N:数据输入时钟,MCU收到DC O_P/N信号后,将产生数据和DCI_P/N信号,并且保证DCI_P/N的采样沿可以采到数据的有效部分,保证数据传输的正确性。 SYNC_OUT_P/N和S YNC_IN_P/N为多芯片同步时钟,这里不予讨论 (3)数据部分:芯片使用了双端口DB0[13:0]和DB1[13:0]同时传输数据,这样可以将数据的传输速率降为芯片时钟的一半,可以提高数据传输的正确性,然后在芯片内部将

从两端口收到的数据组合成一组。A D9739采集数据使用的是DDR模式,即用DCI_P/N的上升沿和下降沿同时采集数据,这样数据时钟的频率是芯片时钟的1/4,是数据传输速率的1/2。降低时钟的传输频率就意味着可以提高时钟的质量,这也可以提高高速传输中数据的正确率。 二芯片布局布线 在介绍AD9739芯片前首先简单介绍一下PCB,PCB共12层,其中第1、3、5、7、10、12为信号层,第2、4、6、8、9、11为电源和底层。 AD9739芯片是RFDA转换器,布线时需要考虑的问题较多,作者在布线时结合AD9739的开发板和自己的经验,考虑到的问题如下: (1)布线:AD9739有两组数据端口,有3种布线方案: a.两组数据端口都走微带线。 b.一组数据端口走微带线,一组数据端口走带状线。 c.两组数据端口都走带状线。 方案a的缺点在于A D9739是BGA封装,2组数据端口呈14行4列排列,这样就不可能将所有的数据线和时钟线都布为微带线(表层走线)。 方案b的缺点是A D9739芯片将在DCI_P/N的上升沿(下降沿)同时采集DB0和DB1的数据,在布线时就要保证DB0和DB1两组数据线的传输条件相同,这样一组数据走微带线一组走带状线也因为微带线和带状线的传输延时不同和一组的传输路径有过孔另外一组没有而舍弃。 过孔带来的问题主要有2个:第一个为传输路径的阻抗不连续,方案c中在每对数据线和时钟线中都引入了一对过孔,让两组共28对数据线和2对时钟线的传输情况相同。第二个问题是如果信号的传输路径只使用了通孔的一小段,那么通孔未被使用的部分将对信号的完整性造成一定的影响。在板卡设计中DB0通过FAN OUT和盲孔走线走在第3层,DB1通过FANO UT和通孔走在第10层,尽可能消除或者减小未使用的那段过孔对信号完整性造成的影响(见图2左侧两列为DB1和通孔,右侧两列为DB0和盲孔)。 图2 (2)阻抗匹配:A D9739与MCU(板卡中使用的是Alte ra公司的EP3SL150)的数据和时钟接口全部为LVDS电平,所以在高速传输中差分信号线的差分特征阻抗必须是100 欧姆,带状线特征阻抗的计算公式见公式(1): 由公式(1)知可以通过改变线宽W和线与参考平面距离H来改变特征阻抗。也可以通过阻抗计算软件或者咨询PCB制版公司来确保传输线的差分阻抗为100欧姆。(3)数据线和时钟线等长:因为FPGA芯片在接收到AD9739给的DCO_P/N信号后采用源同步传输方式,同时传输DC I_P/N和DB0、DB1信号,此时DCI_P/N信号确保可以正确采样DB0和DB1中的数据。在保证MCU和AD9739芯片之间的数据线和时钟线长度等长后,就可以保证在AD9739的时钟接收端DCI_P/N仍然可以正确采样DB0 和DB1中的数据。

相关文档
相关文档 最新文档