打印

以Spartan3E开讲Xilinx FPGA 内部结构(10.5更新,位于88楼)

[复制链接]
楼主: GoldSunMonkey
手机看帖
扫描二维码
随时随地手机跟帖
21
spartan6的IO口增加不少功能,特别是以往主要高端器件才有的功能,spartan6也集成一些。另外,下一代的7系列,所有架构统一。这段时间一直在读selectIO和clock部分,感觉spartan6和3系列差别很大,这种差别,不仅仅是在工艺和容量上。譬如3系列实现ddr2,非常复杂,而在6系列非常容易,他在时钟方面改进很多,譬如pll、bufio、bufpll,一些时钟这多高速IO口,另外,低端系列集成了ioserdes,这使6系列对于高速IO的通信非常便利。
   有条件的话,我也准备建立一个群,高手们可以自由华山论剑

使用特权

评论回复
22
atua| | 2011-6-2 08:51 | 只看该作者
spartan6的IO口增加不少功能,特别是以往主要高端器件才有的功能,spartan6也集成一些。另外,下一代的7系列,所有架构统一。这段时间一直在读selectIO和clock部分,感觉spartan6和3系列差别很大,这种差别,不仅仅 ...
钻研的鱼 发表于 2011-6-2 08:21


支持!
如果感兴趣,可以把Virtex、Strtix、Arria、ECP3都了解、对比一下,这样基本对整个FPGA业界技术就有了一定的把握了

使用特权

评论回复
23
GoldSunMonkey|  楼主 | 2011-6-2 10:53 | 只看该作者
本帖最后由 GoldSunMonkey 于 2011-6-2 22:34 编辑

“级联”重定时特性——提高DDR的性能


在IDDR2和ODDR2的典型实现中,存在一个问题....

以IDDR2为例,
我们可以发现,在经典实现中,输出的两路数据分别与时钟的两个边沿对齐。
但是,强调一下,后端的系统中往往只有一个时钟,工作在上升沿。
那么对于下降沿对齐输出的数据,从下降沿开始到上升沿被采样,只有半个时钟的余量来稳定输出并满足setup。
由于FPGA系统比较复杂从IOB出来的数据要进入到下一个存储单元可能会经历非常漫长的逻辑和路由延迟。
要在半个时钟内完成,有很大的挑战性,尤其是在高速系统中,往往有很大的困难。

Spartan3E的解决办法是,利用相邻从属IOB的存储单元,对下降沿输出的数据马上做一次上升沿抽样。
由于两个IOB相邻,不存在复杂的逻辑和路由延迟,因此虽然余量也是半个时钟,但一般情况下甚至高速系统下也可以成功实现。
这样数据就回到了上升沿时钟域。
到了上升沿时钟域,则数据有一个时钟的时间余量,处理起来就和普通的情况一样了。

以上是关于IDDR2的讨论,对于ODDR2有着类似的情况,大家可以自己理解一下。参考图即可。

想到一个资源守恒的公理,就是自然界普遍存在的trade off 现象。
如果添加一个寄存器抽样,则系统负担降低;反之如果想少使用资源,不使用这个抽样寄存器,则全系统的负担会提高。
这个例子告诉我们两个道理
1. trade off 普遍存在
2. 四两可以拨千斤

2011-06-02_110338.jpg (12.9 KB )

2011-06-02_110338.jpg

2011-06-02_110338.jpg (14.89 KB )

2011-06-02_110338.jpg

2011-06-02_110338.jpg (38.42 KB )

2011-06-02_110338.jpg

2011-06-02_110338.jpg (37.14 KB )

2011-06-02_110338.jpg

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
星星之火红 + 1
24
and| | 2011-6-2 14:47 | 只看该作者
深入浅出,这样的**好看!

使用特权

评论回复
25
jennyzheng| | 2011-6-2 15:05 | 只看该作者
是篇好** 大家讨论也很激烈~

使用特权

评论回复
26
GoldSunMonkey|  楼主 | 2011-6-3 13:09 | 只看该作者
本帖最后由 GoldSunMonkey 于 2011-6-5 17:14 编辑

SelectIO 信号标准
S3E可以支持很多接口信号标准,比如最常见的 LVTTL、LVCMOS系列、PCI系列。
此外,还支持差分信号标准,典型的比如LVDS系列。

要实现指定的信号标准有两个必要条件:
1. 内在设置:在UCF文件中对指定pin设置IOSTANDARD属性,这样FPGA会自动切换指定IOB的信号标准;
2. 外在设置:每个信号标准都要求指定的Vcco(有些还要求指定的Vref),因此要在PCB板上提供相应的Vcco支持。

再来说说差分信号,他的优点是差分信号固有的噪声消除特性来提高数据的可靠性,从而提高单路数据的传输速率。
差分信号的命名有套规则,比如:
IO_L43P_3和IO_L43N_3就表示 Bank3里面第43对差分线的正负两根线。

使用特权

评论回复
27
星星之火红| | 2011-6-3 13:37 | 只看该作者
不错,学习了

使用特权

评论回复
28
星星之火红| | 2011-6-5 16:27 | 只看该作者
本帖最后由 星星之火红 于 2011-6-5 16:29 编辑

更新了?

使用特权

评论回复
29
GoldSunMonkey|  楼主 | 2011-6-5 17:07 | 只看该作者
本帖最后由 GoldSunMonkey 于 2011-6-6 23:00 编辑

差分信号的termination  差分信号一般传输速率较高,因此对信号的完整性有严格要求。方法之一就是使用termination来防止信号反射。为了减少用户的外部负担,S3E实现了内部的差分termination。使用方法就是在UCF中加入下列语句。  INST <I/O_BUFFER_INSTANTIATION_NAME>
DIFF_TERM = "<TRUE/FALSE>";

具体实现见图一

上拉下拉电阻
pullup、pulldown的主要目的就是将悬空的管脚引导到确定的状态,避免未知的干扰。
所以在悬空的管脚,确定输入的管脚以及三态管脚上用的比较多。
要修改管脚的pullup、pulldown、float 属性,可以在BitGen的时候从Generate Programming File的属性中选择。

可能很多工程师对UCF的语法了解不多,我就多说两句吧
FPGA设计中的约束文件有3类:用户设计文件(.UCF文件)、网表约束文件(.NCF文件)以及物理约束文件(.PCF文件),可以完成时序约束、管脚约束以及区域约束。3类约束文件的关系为:用户在设计输入阶段编写UCF文件,然后UCF文件和设计综合后生成NCF文件,最后再经过实现后生成PCF 文件。
UCF文件是ASC 2码文件,描述了逻辑设计的约束,可以用文本编辑器和Xilinx约束文件编辑器进行编辑。NCF约束文件的语法和UCF文件相同,二者的区别在于: UCF文件由用户输入,NCF文件由综合工具自动生成,当二者发生冲突时,以UCF文件为准,这是因为UCF的优先级最高。PCF文件可以分为两个部分:一部分是映射产生的物理约束,另一部分是用户输入的约束,同样用户约束输入的优先级最高。一般情况下,用户约束都应在UCF文件中完成,不建议直接修改 NCF文件和PCF文件。
第一种方法:新建一个源文件,在代码类型中选取“Implementation Constrains File”,在“File Name”中输入“one2two_ucf”。单击“Next”按键进入模块选择对话框,选择模块“one2two”,然后单击“Next”进入下一页,再单击“Finish”按键完成约束文件的创建。具体实现见图二
第二种方法:在工程管理区中,将“Source for”设置为“Synthesis/Implementation”。“Constrains Editor”是一个专用的约束文件编辑器,双击过程管理区中“User Constrains”下的“Create Timing Constrains”就可以打开“Constrains Editor”,其界面如图所示:具体实现见图三
在“Ports”选项卡中可以看到,所有的端口都已经罗列出来了,如果要修改端口和FPGA管脚的对应关系,只需要在每个端口的“Location”列中填入管脚的编号即可。例如在UCF文件中描述管脚分配的语法为:
        NET “端口名称” LOC = 引脚编号;
需要注意的是,UCF文件是大小敏感的,端口名称必须和源代码中的名字一致,且端口名字不能和关键字一样。但是关键字NET是不区分大小写的。

其他关于UCF的另外再写帖子和大家一起学习了~

2011-06-02_110338.jpg (54.55 KB )

termination

termination

2011-06-05_172635.jpg (51.37 KB )

ucf

ucf

2011-06-02_110338.jpg (48.68 KB )

2011-06-02_110338.jpg

使用特权

评论回复
评分
参与人数 2威望 +3 收起 理由
星星之火红 + 1
lpf336 + 2
30
星星之火红| | 2011-6-6 22:44 | 只看该作者
讲的太好了。~~喜欢~

使用特权

评论回复
31
GoldSunMonkey|  楼主 | 2011-6-6 22:50 | 只看该作者
本帖最后由 GoldSunMonkey 于 2011-6-14 18:01 编辑

有朋友给我留言说说说UCF语法,简单这说两句:)
UCF文件的语法说明
1.语法
        UCF文件的语法为:
{NET|INST|PIN} "signal_name" Attribute;
其中,“signal_name”是指所约束对象的名字,包含了对象所在层次的描述;“Attribute”为约束的具体描述;语句必须以分号“;”结束。可以用“#”或“/* */”添加注释。需要注意的是:UCF文件是大小写敏感的,信号名必须和设计中保持大小写一致,但约束的关键字可以是大写、小写甚至大小写混合。例如:
NET "CLK" LOC = P30;
“CLK”就是所约束信号名,LOC = P30;是约束具体的含义,将CLK信号分配到FPGA的P30管脚上。
对于所有的约束文件,使用与约束关键字或设计环境保留字相同的信号名会产生错误信息,除非将其用" "括起来,因此在输入约束文件时,最好用" "将所有的信号名括起来。
2.通配符
在UCF文件中,通配符指的是“*”和“?”。“*”可以代表任何字符串以及空,“?”则代表一个字符。在编辑约束文件时,使用通配符可以快速选择一组信号,当然这些信号都要包含部分共有的字符串。例如:
NET "*CLK?" FAST;
将包含“CLK”字符并以一个字符结尾的所有信号,并提高了其速率。
在位置约束中,可以在行号和列号中使用通配符。例如:
INST "/CLK_logic/*" LOC = CLB_r*c7;
把CLK_logic层次中所有的实例放在第7列的CLB中。
3.定义设计层次
       在UCF文件中,通过通配符*可以指定信号的设计层次。其语法规则为:
* 遍历所有层次
Level1/* 遍历level1及以下层次中的模块
Level1/*/ 遍历level1种的模块,但不遍历更低层的模块
例图所示的结构,使用通配符遍历表所要求的各个模块。


图 层次模块示意图
表 要求遍历的符号列表

管脚和区域约束语法
LOC约束是FPGA设计中最基本的布局约束和综合约束,能够定义基本设计单元在FPGA芯片中的位置,可实现绝对定位、范围定位以及区域定位。此外, LOC还能将一组基本单元约束在特定区域之中。LOC语句既可以书写在约束文件中,也可以直接添加到设计文件中。换句话说,ISE中的FPGA底层工具编辑器(FPGA Editor)、布局规划器(Floorplanner)和引脚和区域约束编辑器的主要功能都可以通过LOC语句完成。
LOC语句语法
INST "instance_name " LOC = location;
其中“location”可以是FPGA芯片中任一或多个合法位置。如果为多个定位,需要用逗号“,”隔开,如下所示:
LOC = location1,location2,...,locationx;

目前,还不支持将多个逻辑置于同一位置以及将多个逻辑至于多个位置上。需要说明的是,多位置约束并不是将设计定位到所有的位置上,而是在布局布线过程中,布局器任意挑选其中的一个作为最终的布局位置。
范围定位的语法为:
INST “instance_name” LOC=location:location [SOFT];
常用的LOC定位语句如表4-4所列。
表 常用的LOC定位语句

使用LOC完成端口定义时,其语法如下:
NET "Top_Module_PORT" LOC = "Chip_Port";
其中,“Top_Module_PORT”为用户设计中顶层模块的信号端口,“Chip_Port”为FPGA芯片的管脚名。
LOC语句中是存在优先级的,当同时指定LOC端口和其端口连线时,对其连线约束的优先级是最高的。例如,在图4-76中,LOC=11的优先级高于LOC=38。

图 LOC优先级示意图
2.LOC属性说明
LOC语句通过加载不同的属性可以约束管脚位置、CLB、Slice、TBUF、块RAM、硬核乘法器、全局时钟、数字锁相环(DLL)以及DCM模块等资源,基本涵盖了FPGA芯片中所有类型的资源。由此可见,LOC语句功能十分强大,表4-5列出了LOC的常用属性。
表 LOC语句常用属性列表

~~~~~~~~~~~~~~~~~~华丽的分割线~~~~~~~~~~~~~~~~~~~~

使用特权

评论回复
32
GoldSunMonkey|  楼主 | 2011-6-7 17:44 | 只看该作者
这个更新主要是对ucf的讨论,可能比较烦。大家还是耐着性子看一看~

使用特权

评论回复
33
wahahaabc| | 2011-6-8 09:33 | 只看该作者
8# GoldSunMonkey
“实现相差180度,有两种方法。
一种是通过DCM直接产生这两个信号。
另外的方法是同一时钟,但是连入寄存器的时钟端口时,一路取反。”

小弟现在使用SPARTAN-6(XC6SLX45T-3)做一个DVB-ASI(270Mbps)的接收模块,ASI信号一般使用过采样来实现接收,要用到IDDR2,如果使用IDDR2同一时钟,连入寄存器的时钟端口时,一路取反。那么,时序分析报告该时钟最多可以跑到100MHZ左右,但是,如果使用DCM产生两个时钟信号,相位差180度,则时序分析报告该时钟最多可以跑到280MHZ左右。

像这种时钟信号取反接入IDDR2,是否会严重影响性能?

如果使用ODDR2输出一个随路时钟信号,也使用时钟取反这种方式接入ODDR2,是否同样会影响性能?郁闷,项目中的XC6SLX45T-3的所有DCM已经用完,已经不能再使用一个DCM产生相位差180度的时钟给ODDR2了。产生随路时钟信号是否还有其他方法?
我们公司同事使用ALTERA的EP2C系列,直接将时钟信号引出到IO脚上,个人感觉不可取。

使用特权

评论回复
34
edacsoft| | 2011-6-8 13:51 | 只看该作者
本帖最后由 edacsoft 于 2011-6-8 13:53 编辑
“级联”重定时特性——提高DDR的性能


在IDDR2和ODDR2的典型实现中,存在一个问题....

以IDDR2为例,
我们可以发现,在经典实现中,输出的两路数据分别与时钟的两个边沿对齐。
但是,强调一下,后端的系统中往往 ...
GoldSunMonkey 发表于 2011-6-2 10:53

lz辛苦了翻译的不错!
一事不明:“从属IOB:slave IOB”是啥意思?

使用特权

评论回复
35
GoldSunMonkey|  楼主 | 2011-6-8 17:09 | 只看该作者
34# edacsoft
1.  这是说DDR实际是一个IOB有效,
     但是为了使用DDR,那么旁边另外一个IOB需要起作用。
     因此上,一个称为主IOB,一个为从IOB
2   兄弟,我真不是翻译。我只是觉得很多人对xilinx的不了解,需要让大家了解。
     我只是希望大家能够选择Xilinx 使用Xilinx

使用特权

评论回复
36
GoldSunMonkey|  楼主 | 2011-6-8 17:11 | 只看该作者
33# wahahaabc
你的说法是对的,肯定DCM的时钟质量更好。速度更高。

如果直接接时钟也是没有问题,但是这个时候对晶振的要求很高,否则如果时钟频率很高,必然出现很多错误。但是这种晶振很贵。我记得是3000美金。

使用特权

评论回复
37
shui_gang| | 2011-6-10 17:05 | 只看该作者
:)看帖顶贴~

使用特权

评论回复
38
GoldSunMonkey|  楼主 | 2011-6-14 18:01 | 只看该作者
本帖最后由 GoldSunMonkey 于 2011-6-14 18:03 编辑

保持电路

三态信号在没有驱动的时候悬空,为了防止悬空,有一个保持电路可以帮助信号保持在前一逻辑状态。
具体使用方法
- 使用 KEEPER 属性
- 使用 KEEPER 库原语

注意,如果使用了上下拉电阻,则该属性被重置,因为实现的功能是类似的。差异是上下拉将悬空信号拉回确定值,而KEEPER是保持回前一逻辑值。

电平转换速率 SlewRate

SlewRate用于设置IOB输出电平的切换速率。
速率太低则很多接口时序得不到保障,因此有时候需要使用高速的切换速率。
实现的方法就是加大驱动电流,从2mA到16mA,每2mA有一个选择。
电流越大,当然驱动能力越强,相应的电平切换速率也更快。
但是高速的切换会导致PCB电路的传输线效应,所以只要能满足应用,尽量采用低速的SlewRate。




觉得好的朋友,帮忙加点分呗,否则每天写来写去的,没什么动力了~~谢谢啦~~

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
cbas + 1
39
cbas| | 2011-6-15 11:37 | 只看该作者
我对spartan6系列 很感兴趣

使用特权

评论回复
40
cbas| | 2011-6-15 11:38 | 只看该作者
谢谢楼主分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则