-
Xilinx FPGA
内部结构深入分析
作者
:<
/p>
fpga001
。
论坛
:芯片动力(
< br>SocVista
)
。
网页地址
:
/bbs/?tid=3443&extra=page%3D2&page=7
发表时间
:
2009.12
IOB
的结构
请大家看到手册的第
1
页,这是
IO
B
的
review
部分。
IO block
是
高手的领地,一般接触
FPGA
第一年都不会太关心到这个部分
。
注意看,
IOB
有三个数据通道:输入、输出、三态控制。
每个通道都有一对存储器件,他们可以当做寄存器或者锁存起来使用,视乎你的设置。
输入通道有可编程的延迟模块,
可以确保
hold time
为零。
(这是在什么场合
使用?请达人补
充!
)
另外可以看到输入输出通道都有完备的
DDR
支持,
这个在后面可以看到。
所有图都请参考
PDF
原文,这里就不再粘贴了。
可编程输入延迟
< br>看到手册第
3
页,这个像两根鱼骨似的构造就是输入延迟
了。
输入延迟一共
16
节,每节
250ps
,所
以总共的延迟在
0~4ns
之间。
<
/p>
这个鱼骨的构造非常巧妙,前面
8
节直接
级联,只有一个输出。
这样
8
节以内的调整就跳过这根长鱼骨;
而超过
8<
/p>
节的调整就直接利用第一根鱼骨,
然后在
后面的
8
节中进行微调。
调整的输出分别供给
IOB
中的异步和同步单元,异步就是直接穿过
IOB
,同步则是经由存
储单元流出
IOB
。
异步单元精度较高,可以单节调整,所以精度为
250ps
;
同步单元精
度稍低,两个节为单位调整,所以精度只有
500ps
。
上述内容看图便知
可编程输入延迟的设置
输入延迟的设
置只能在
Image
配置的时候建立,在设备工作期间无法改变
。
我想有两种方法可以改变输入延迟的设置:
1.
通过延迟原语在代码中设置;
2.
通过
FPGA editor<
/p>
在
P&R
完成后在
ngc
文件中修改。
存储单元
存储单元可以配置为
D
触发器,就是我们常说的
FF
,
Xilinx
称之为<
/p>
FD
;
也可以
配置为锁存器,
Xilinx
称之为
L
D
。
输出
和三态通路各有一对寄存器外加一个
MUX
。
< br>
利用这种
2+1
的组合可以产
生
DDR
操作,
Xilinx
称之为
ODDR2
。
每个存储单元都有
6
个接口信号:
时钟
+
时钟时能,数据输入
+
输出,置位复位
+
翻转输入
除了这些信号,存储单元还有一些属性设置:
-
FF/Latch
可以用来配置存储单元的类型;
- Sync/Async
配置置位复位的方式;
-
SRHIGH/SRLOW
配置是置位
(1)
还是复位
(0)
;
INIT1/INIT0
配置置位复位的初始值,一般置位<
/p>
(1)
复位
(0)
;
DDR
支持
输入、输出、三态。这三个
IOB
通道都可以实现
DDR
支持。
输出和三态通道可以实现
ODDR2
原语,这个
原语的实现原理可以参考
p5
的图
3.
两个相差
180
度的时钟和两路信号进
入一对寄存器并通过
DDR
专用
MUX
输出,即可得到
DDR
数据输出。
p>
实现相差
180
度,有两种方法。
一种是通过
DCM
直接产生这两个信号。
另外的方法是
同一时钟,但是连入寄存器的时钟端口时,一路取反。
输入通道则实现
IDDR2
原语。
< br>如果输出、三态通路实现的是
DDR
的调制的话,这一路
其实就是
DDR
的解调,也就是
1
p>
分为
2
。
当然,这里需要提供两路相差
180
度的时钟
。
另外
O
DDR2
还有一个重要用途,就是用于产生随路时钟。
只要把两路数据固定为
1
和
< br>0
,这样产生的
DDR
数据其实
就是
0/1
交叉的时钟信号了,这
个一
想就明白了吧。
这样做的好处是:数据和时钟都经过
IOB
寄存器处理,具有相同的延迟特性,从而实现了
< br>所谓的
源同步
“
级联
”<
/p>
重定时特性
——
提高
DDR
的性能
在
IDDR2
和
ODDR2
的典
型实现(图
4
图
6
)中,存在一个问题
....
以
IDDR2
为例,
我们可以发现,在经典实现中,输出的两路数据分别与时钟的两个边沿对齐。
但是,强调一下,后端的系统中往往只有一个时钟,工作在上升沿。
那么对于下降沿对齐输出的数据,
从下降沿开始到上升沿
被采样,
只有半个时钟的余量来稳
定输出并满足
setup
。
由于
FPGA
系统比较复杂从
IOB
出来的数据要进入到下一个存储单元可能会经历非常漫长
的逻辑和路由延迟。<
/p>
要在半个时钟内完成,有很大的挑战性,尤其是在高速系统中,
往往有很大的困难。
Sparta
n3E
的解决办法是,
利用相邻从属
I
OB
的存储单元
,对下降沿输出的数据马上做一次
上升沿抽样。
由于两个
I
OB
相邻,不存在复杂的逻辑和路由延迟,因此虽然余量也是半个时钟,但一般
情况下甚至高速系统下也可以成功实现。
这样数据就回到了上升沿时钟域。
到
了上升沿时钟域,则数据有一个时钟的时间余量,处理起来就和普通的情况一样了。
以上是关于
IDDR2
的讨论,对于
ODDR2
有着类似的情况,大家可以
自己理解一下。参考
图
6
图
7
即可。
想到一个资源守恒的公理,就是自然界普遍存在的
trade
off
现象。
如果添加一个寄存器
抽样,
则系统负担降低;
反之如果想少使用资源,
不使用这个抽样寄存
器,则全系统的负担会提高。
这个例子告诉我们两个道理
1.
trade off
普遍存在
2.
四两可以拨千斤
SelectIO
信号标准
S3E
可以支持很多接口信号标准,比如最常见的
LVTTL<
/p>
、
LVCMOS
系列、
< br>PCI
系列。
此外,还支持差
分信号标准,典型的比如
LVDS
系列。
要实现指定的信号标准有两个必要条件:
1.
内在设置:在
UCF
文件中对指定
pin
设置
IOSTANDARD
属性,这样
FPGA
会自动切换
指定
IOB
的信号标准
;
2.
外在设置:每个信号标准都
要求指定的
Vcco
(有些还要求指定的
Vref
)
,因此要在
PCB
板上提供相应的
Vcco
支持。
再来说说差分信号,
他
的优点是差分信号固有的噪声消除特性来提高数据的可靠性,
从而提
高单路数据的传输速率。
差分信号的命名有套规则,比如:
I
O_L43P_3
和
IO_L43N_3
就表示
Bank3
里面第
43
对差分线的正负两根线。
差分信号的
termination
差分信号一般传输速率较高,因此对信号的完整性有严格要求。
方法之一就是使用
termination
来防止信号反射。
为了减少用户的外部负担,
S3E
实现了内部的差分
termination
。
使用方法就是在
< br>UCF
中加入下列语句。
INST
DIFF_TERM =
上拉下拉电阻
pullup
、
pulldown
的主要目的就是将悬空的管
脚引导到确定的状态,避免未知的干扰。
所以在悬空的管脚,
确定输入的管脚以及三态管脚上用的比较多。
要修改管脚的<
/p>
pullup
、
pulldown
、
float
属性,
可以在
BitGen
的时候从
Gen
erate Programming
File
的属性中选择
保持电路
三态信号在没有驱动的时候悬空,
为了防止悬空,
有一个保持电路可以帮助信号保持在前一
逻辑状态。
具体使用方法
-
使用
KEEPER
属性
-
使用
KEEPER
库原语
注
意,
如果使用了上下拉电阻,
则该属性被重置,
因为实现的功能是类似的。差异是上下拉
将悬空信号拉回确定值,而
KEEPER
是保持回前一逻辑值。
电平转换速率
SlewRate <
/p>
SlewRate
用于设置
IOB
输出电平的切换速率。
速率太低则很多接口
时序得不到保障,因此有时候需要使用高速的切换速率。
实现
的方法就是加大驱动电流,从
2mA
到
16mA
,每
2mA
有一个选择。
p>
电流越大,当然驱动能力越强,相应的电平切换速率也更快。
但是高速的切换会导致
PCB
电路的传输线效应,所以只要能满足应用,尽量采用低速的
SlewR
ate
Bank
内的
IOB
组织
S3E
的四边各有一个
IOB
的
BanK
。
每个
Bank
可以有自己独立的
Vcco
和
Vref
,所以一般的,每个
bank
可以有自己独立的电平
标准。
有些电平标准有相同的
< br>Vcco
,则在该
Bank
内可
以支持多个电平标准。
对于差分信
号,每个
Bank
都可以支持下面三个差分标准中的任意两个<
/p>
- LVDS_25
-
MINI_LVDS_25
- RSDS_25
但是不能做到同时支持这三个标准
Bank
内部电平标准的规则
Vcco
规则:
-
所有
Vcco
必须连接,即使不使用某个
bank
;
-
同属于某个
Bank
的所有
Vcco
必须设置为相同的电平
-
所有
Vcco
必须和指定的电平标准电压相符
-
如果某个
bank
没有指定电平标准,
则将其连接到任意电平,比如
2.5
或者
3.3V
Vref
规则:
(前提是该电平标准要求使用
Vref
)
p>
-
所有
Vre
f
必须连接,即使不使用某个
bank
;
-
同属于某个
< br>Bank
的所有
Vref
必须设
置为相同的电平
-
所有
Vref
必须和指定的电平标准电压相符
如果某个
bank
< br>对应的电平标准不需要
Vref
来偏置输入切换门限,<
/p>
则该
Vref
管脚可以用做用
户
IO
或者输入管脚。
专用的输入管脚
专用输入管脚一般用
IP_Lxxx_x
表示。
对于专用输入管脚,没有差分
termination
。
静电保护
在每个
IO
上都有静电保护,大家看文
档的图
1
就明白了。
在
pad-->Vcco
之间有
P-N
偏置保护。
在
pad-->GND
之间有
N-P
< br>偏置保护。
在静电过大的时候,通过这两个保护二极管
可以直接将电流泄洪到电源与地
IOB
的电源支持
Vcco
用于对驱动输出的支持。
Vccint
用于驱动内部逻辑。
<
/p>
Vccaux
是辅助电源,用于优化
FP
GA
性能(这个谁有补充?)
在上电、配置、用户模式下,
IO<
/p>
的行为分析
-
上电状态
首先,电源稳定。
Vcco
、
Vccint
、
Vc
caux
作为内部
“
上电复位电路<
/p>
”
的必要电源输入,必须达到稳定状态。
这些基本电源稳定了才能实现上电复位,芯片才能进入配置状态。
其次,
IO
高阻上拉,切断外部接口。
HSW
AP
管脚被施加一个低电平。注意,这个低电平会维持到配置结束。
< br>
这个低电平的作用是将用户
IO
全部上拉。
我想这样做的目的是令所有
IO
进入确定状态,避免对配置操作的干扰。
最后,全局复位,切断边缘存储通道。
FPGA
内部设置
“
全局置位复位<
/p>
”
,异步方式将所有
IOB
存储单元清零
-
配置阶段
首先,确定配置模式
。
INIT_B
高电平,并抽样
M0,
M1,M2
的值,据此确定配置模式。
然后,下载数据到
FPGA
。
注意,整个配置期间,
IO
继续保持高阻上拉状态。
最后,释放
GSR
。
< br>
释放全局
GSR
,
IOB
寄存器回到默认的
Low
< br>状态,
除非设计中改变了
SR
输入的极性,否则都是
Low
状态。<
/p>
- Design
Operation
阶段
首先,全局三态释放,打通外部接口。
GTS
释放,令所有
IO
都进入活跃
状态,未使用的
IO
则被弱下拉。
< br>通过在
BitGen
中设置属性,可以修改
GTS
释放后未使用
IO
的
状态设置,比如上拉、下拉、
悬空。
其次,
全局写使能,打通内部存储通道。
在
一个时钟后,
GWE
全局写使能被释放。
这样
RAM
和寄存器就都可以写入
了,也就是设计可以动作起来了。
注意,在该阶段
HSW
AP
释放,所以
他也可以被用作普通的
GPIO
。
<
/p>
【上面的这个内容是写到现在最重要的一部分,对于理解整个
FP
GA
的启动过程非常有帮助。
】
CLB
概览
CLB
是可配置逻辑块的简称。
p>
这是
FPGA
整个矩形配置结构中的基本单
元。
1CLB = 2X2 Slice
1Slice = 2 (LUT+FF) +
其他运算、
进位、
MUX
资源
< br>每个
CLB
都是相同的,所以知道一个就知道了全部。接
下来重点研究
CLB
。
Slice
上面讲到了一个
CLB
有
2*2<
/p>
个
Slice
。
这个
4
个
sl
ice
可以分成左右两对,我们来看他们的主要区别。
左边的是
SLICE-M
,带有存储增强功能
(分布式存储器,移位寄存器等)
。
右边的是
SLICE-L
,没有存储增强功能。
那么为什么左右不一样呢?
我认为,
提供
SLICE-M
的目的就是为了让通用
FPGA
能够对存储应用有更多支持。
那为什么右边的没有存储增强呢?
最
重要的原因是减小
CLB
右侧的面积,从而降低整个芯片的价格
成本。
同时,纯粹的
logic
p>
设计可以提供比混杂设计的
SLICE-M
更优的性能。
Logic Cell
的概念
p>
经常有人混淆
CLB
和
LC
的概念。这里就给大家澄清一下。
< br>CLB
就不用讲了,就是上面说到的
2*2
slice
阵列构成的可配置逻辑块。
LC
则比
C
LB
要小多了。如果给个公式就是:
Logic Cell = 1LUT + 1FF
(存储单元)
那么一个
Slice
等价于多少
p>
LC
呢?
看到后面的内容你会知道,一个
Slice
< br>里面有两个
LUT
和两个
FF<
/p>
,但是除此之外,还有一
些运算增强单元。
所以
Xilinx
给出的
S3E
的
slice
等
价
LC
个数为:
2.25
Slice
结构概览
终于讲到
Slice
了。
这个是研究
FPGA
的重中之重。
p>
接下来要分成若干小点分别讲述,如果要观察全部结构则最好参考
14
页的图
12.
< br>这个图是
Slice-M
的结构图,注意里面的虚线部分
是
SliceM
专有结构,在
slic
e-L
中并不存
在。
通过比较,
SliceL
的结构也就非常清晰了。
p>
逻辑通路与
bypass
通路
< br>一个
slice
可以简单分成上下两部分,两部分的结构
基本一致,有着近乎相同的元素。
下半部分一般冠以前缀或者
后缀
“F”
,上半部分则冠以前缀或者后缀
“G”
。
现在以
F
为例,来研究一下主要的数据通路。参考的图片主要还是
14
页的图
12
,这个图太
经典了。
先来说
明一下逻辑路径,这个路径必然经过
LUT
,否则就不能成为逻
辑路径,而只能成为
旁路路径。
总结
一下,主要的逻辑路径是
5
个:
1.
从
LUT
输出后,再通过
X
口,离开
CLB
2.
从
LUT
输出后再经过
XOR
运算(加法或乘法应用)
,再通过
X
口,离开
CLB
3.
从
LUT
输出后再经过
F5MUX
(等价于
L
UT-5
扩展)
,在通过
X
口或者
F5
,离开
CLB
4.
上述三种情况中,不从
X
口输出,而是经由
FF
输出,通过
XQ
,离开
CLB
5.
从
LUT
输出后再经过
CYMUX
,参与到加法运算的进位链中
大家有兴趣的话,可以自己用笔标示一下这些通路,非常清晰。
如果要记忆的话,其实也很简单,
一是逻辑运算后的直接输出和寄存器输出;
二是加法、乘法的直接输出和寄存器输出;
< br>三是
LUT4
到
LUT5
甚至更多级的运算扩展输出。
资料中还提到了旁路
bypass
通路,这个通路
的特点是必然不经过
LUT
,所以称为旁路。
< br>
旁路的应用比较多,但是为了集中精力,这里不再展开,大家自己研究吧。
p>
LUT
查找表
LUT
就是
lookup
table
的简称,可以称为查找表。
因为一个逻辑运算的与非门实现和
ROM
形式的查找表实现是
完全等价的,
这个在数电知识
里学过的。
在
FPGA
中,逻辑电路的实现,
主要就是依靠
LUT
。
当然在
SliceM
中,
LUT
的能力更强,可以被配置成为
Distributed
RAM
或者
16
位
移位寄
存器。
此外,在
Spartan3E
中,所有的
< br>LUT
都是
LUT-4
也就是<
/p>
4
输入的,但是他们可以扩展为
LUT-
5/6/7/8
,方法就是我们接下来要介绍的
wide
MUX
Wide Multip
lexers
——
构造高阶
LUTi<
/p>
的神兵利器
有了
LUT4
,如何实现
LUT5
?
p>
这个问题的答案其实很简答。
对于
4
位输
入的逻辑可以用
LUT
实现,那么对于一个
5
位输入的实现,就可以这样来做。
首先假设第
5
比特为
0
,在这个前提下,
5
位逻辑就变成了
4
位逻辑,用一个
LUT4
(
F
)实
现。
然后假设第
5
比特为
< br>1
,在这个前提下,
5
位逻辑也
变成了
4
位逻辑,用另一个
LUT4<
/p>
(
G
)
实现。<
/p>
最后,我们把这两个
LUT4
的输出值用一个
MUX
连接,当第
5
比特为
0
,我们就选通<
/p>
F
,
为
1
则选通
G
。
这样通过整合两个
LUT4
和一个
MUX
,另外用第
5
比特
作为选通信号,我们得到了一个等
价的
LUT5
。
循环使用上述方法,我们可以进一步得到
LUT-6/7/8....