Xilinx FPGA 内部结构深入分析
作者 :fpga001。
论坛 :芯片动力(SocVista)。
网页地址 :http://socvista.com/bbs/viewthread.php?tid=3443&extra=page=2&page=7 发表时间 :2009.12
IOB的结构
请大家看到手册的第1页,这是IOB的review部分。
IO block 是高手的领地,一般接触FPGA第一年都不会太关心到这个部分。
注意看,IOB有三个数据通道:输入、输出、三态控制。
每个通道都有一对存储器件,他们可以当做寄存器或者锁存起来使用,视乎你的设置。 输入通道有可编程的延迟模块,可以确保hold time为零。(这是在什么场合使用?请达人补充!)
另外可以看到输入输出通道都有完备的DDR支持,这个在后面可以看到。 所有图都请参考PDF原文,这里就不再粘贴了。
可编程输入延迟
看到手册第3页,这个像两根鱼骨似的构造就是输入延迟了。
输入延迟一共16节,每节250ps,所以总共的延迟在0~4ns之间。 这个鱼骨的构造非常巧妙,前面8节直接级联,只有一个输出。 这样8节以内的调整就跳过这根长鱼骨;而超过8节的调整就直接利用第一根鱼骨,然后在后面的8节中进行微调。
调整的输出分别供给IOB中的异步和同步单元,异步就是直接穿过IOB,同步则是经由存储单元流出IOB。
异步单元精度较高,可以单节调整,所以精度为250ps;
同步单元精度稍低,两个节为单位调整,所以精度只有500ps。 上述内容看图便知
可编程输入延迟的设置
输入延迟的设置只能在Image配置的时候建立,在设备工作期间无法改变。 我想有两种方法可以改变输入延迟的设置: 1. 通过延迟原语在代码中设置;
2. 通过FPGA editor在P&R完成后在ngc文件中修改。
存储单元
存储单元可以配置为D触发器,就是我们常说的FF,Xilinx称之为FD; 也可以配置为锁存器,Xilinx称之为LD。
输出和三态通路各有一对寄存器外加一个MUX。
利用这种2+1的组合可以产生DDR操作,Xilinx称之为ODDR2。
每个存储单元都有6个接口信号:
时钟+时钟时能,数据输入+输出,置位复位+翻转输入
除了这些信号,存储单元还有一些属性设置: - FF/Latch可以用来配置存储单元的类型; - Sync/Async 配置置位复位的方式;
- SRHIGH/SRLOW 配置是置位(1)还是复位(0);
INIT1/INIT0 配置置位复位的初始值,一般置位(1)复位(0);
DDR支持
输入、输出、三态。这三个IOB通道都可以实现DDR支持。
输出和三态通道可以实现ODDR2原语,这个原语的实现原理可以参考p5的图3.
两个相差180度的时钟和两路信号进入一对寄存器并通过DDR专用MUX输出,即可得到DDR数据输出。
实现相差180度,有两种方法。
一种是通过DCM直接产生这两个信号。
另外的方法是同一时钟,但是连入寄存器的时钟端口时,一路取反。
输入通道则实现 IDDR2原语。
如果输出、三态通路实现的是DDR的调制的话,这一路其实就是DDR的解调,也就是1分为2。
当然,这里需要提供两路相差180度的时钟。
另外ODDR2还有一个重要用途,就是用于产生随路时钟。
只要把两路数据固定为1和0,这样产生的DDR数据其实就是0/1交叉的时钟信号了,这个一想就明白了吧。
这样做的好处是:数据和时钟都经过IOB寄存器处理,具有相同的延迟特性,从而实现了所谓的源同步
“级联”重定时特性——提高DDR的性能
在IDDR2和ODDR2的典型实现(图4图6)中,存在一个问题....
以IDDR2为例,
我们可以发现,在经典实现中,输出的两路数据分别与时钟的两个边沿对齐。
但是,强调一下,后端的系统中往往只有一个时钟,工作在上升沿。 那么对于下降沿对齐输出的数据,从下降沿开始到上升沿被采样,只有半个时钟的余量来稳定输出并满足setup。
由于FPGA系统比较复杂从IOB出来的数据要进入到下一个存储单元可能会经历非常漫长的逻辑和路由延迟。
要在半个时钟内完成,有很大的挑战性,尤其是在高速系统中,往往有很大的困难。
Spartan3E的解决办法是,利用相邻从属IOB的存储单元,对下降沿输出的数据马上做一次上升沿抽样。
由于两个IOB相邻,不存在复杂的逻辑和路由延迟,因此虽然余量也是半个时钟,但一般情况下甚至高速系统下也可以成功实现。 这样数据就回到了上升沿时钟域。
到了上升沿时钟域,则数据有一个时钟的时间余量,处理起来就和普通的情况一样了。
以上是关于IDDR2的讨论,对于ODDR2有着类似的情况,大家可以自己理解一下。参考图6图7即可。
想到一个资源守恒的公理,就是自然界普遍存在的trade off 现象。
如果添加一个寄存器抽样,则系统负担降低;反之如果想少使用资源,不使用这个抽样寄存器,则全系统的负担会提高。 这个例子告诉我们两个道理 1. trade off 普遍存在 2. 四两可以拨千斤
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对差分线的正负两根线。
差分信号的termination
差分信号一般传输速率较高,因此对信号的完整性有严格要求。 方法之一就是使用termination来防止信号反射。
为了减少用户的外部负担,S3E实现了内部的差分termination。 使用方法就是在UCF中加入下列语句。
INST DIFF_TERM = \
上拉下拉电阻
pullup、pulldown的主要目的就是将悬空的管脚引导到确定的状态,避免未知的干扰。 所以在悬空的管脚,确定输入的管脚以及三态管脚上用的比较多。
要修改管脚的pullup、pulldown、float 属性,可以在BitGen的时候从Generate Programming File的属性中选择
保持电路
三态信号在没有驱动的时候悬空,为了防止悬空,有一个保持电路可以帮助信号保持在前一逻辑状态。 具体使用方法
- 使用 KEEPER 属性 - 使用 KEEPER 库原语
注意,如果使用了上下拉电阻,则该属性被重置,因为实现的功能是类似的。差异是上下拉将悬空信号拉回确定值,而KEEPER是保持回前一逻辑值。
电平转换速率 SlewRate
SlewRate用于设置IOB输出电平的切换速率。
速率太低则很多接口时序得不到保障,因此有时候需要使用高速的切换速率。 实现的方法就是加大驱动电流,从2mA到16mA,每2mA有一个选择。 电流越大,当然驱动能力越强,相应的电平切换速率也更快。
但是高速的切换会导致PCB电路的传输线效应,所以只要能满足应用,尽量采用低速的SlewRate
Bank内的IOB组织
S3E的四边各有一个IOB 的BanK。
每个Bank可以有自己独立的Vcco和Vref,所以一般的,每个bank可以有自己独立的电平标准。
有些电平标准有相同的Vcco,则在该Bank内可以支持多个电平标准。
对于差分信号,每个Bank都可以支持下面三个差分标准中的任意两个 - LVDS_25