|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
FPGA重点知识13条,助你构建完整“逻辑观”之一1、查找表LUT和编程方式* Z* s, t' ^1 s# a8 n( C+ r
第一部分: 查找表LUT
4 x1 f- n) m" A/ q" Q7 S' P/ L# ?; lFPGA是在PAL、GAL、EPLD、cpld等可编程器件的基础上进一步发展的产物。它是作为ASIC领域中的一种半定制电路而出现的,即解决了定制电路的不足,又克服了原有可编程器件门电路有限的缺点。
9 K# k8 z( u3 N1 T# u( ^( N
3 ?" I3 C9 ?# s/ L由于FPGA需要被反复烧写,它实现组合逻辑的基本结构不可能像ASIC那样通过固定的与非门来完成,而只能采用一种易于反复配置的结构。查找表可以很好 地满足这一要求,目前主流FPGA都采用了基于SRAM工艺的查找表结构,也有一些军品和宇航级FPGA采用Flash或者熔丝与反熔丝工艺的查找表结 构。通过烧写文件改变查找表内容的方法来实现对FPGA的重复配置。
0 }' \4 z& K# g6 ]6 w( M- ~& o& \: z8 E" M1 o! O# f, e6 m- m
根据数字电路的基本知识可以知道,对于一个n输入的逻辑运算,不管是与或非运算还是异或运算等等,最多只可能存在2n种结果。所以如果事先将相应的结果存放于一个存贮单元,就相当于实现了与非门电路的功能。FPGA的原理也是如此,它通过烧写文件去配置查找表的内容,从而在相同的电路情况下实现了不同的逻辑功能。 / J' [6 ]3 R: X3 T4 ?
' h! {4 L5 A! P( L/ ~2 e" j) ?0 l
查找表(Look-Up-Table)简称为LUT,LUT本质上就是一个RAM。目前FPGA中多使用4输入的LUT,所以每一个LUT可以看成一个有 4位地址线的 的RAM。 当用户通过原理图或HDL语言描述了一个逻辑电路以后,PLD/FPGA开发软件会自动计算逻辑电路的所有可能结果,并把真值表(即结果)事先写入 RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。 ) l5 O9 L2 i' e# o: L* Z$ e
! _ v- y, N; y4 f" f+ {) j
下面给出一个4与门电路的例子来说明LUT实现逻辑功能的原理。' G. O1 |" `8 r, y6 b$ e
, a1 `4 H( `- e0 E( J0 w% C
9 b, @6 ^3 F/ b' S8 [例1-1:给出一个使用LUT实现4输入与门电路的真值表。 0 i9 J: U! f7 L0 |
0 ]# X# g: c7 j: V( Q& n B
从中可以看到,LUT具有和逻辑电路相同的功能。实际上,LUT具有更快的执行速度和更大的规模。 . Z9 s0 @0 Z5 G! {3 _- n
7 E7 c: y; b' b) S. v第二部分: 编程方式
- @" n1 G" G* y8 Q7 o+ }由于基于LUT的FPGA具有很高的集成度,其器件密度从数万门到数千万门不等,可以完成极其复杂的时序与逻辑组合逻辑电路功能,所以适用于高速、高密度 的高端数字逻辑电路设计领域。其组成部分主要有可编程输入/输出单元、基本可编程逻辑单元、内嵌SRAM、丰富的布线资源、底层嵌入功能单元、内嵌专用单 元等,主要设计和生产厂家有Xilinx、Altera、Lattice、Actel、Atmel和QuickLogic等公司,其中最大的是 Xilinx、Altera、Lattice三家。 ; ^" d# E+ I P) S/ Q
. K- W/ D5 K; c+ h5 f, n, HFPGA是由存放在片内的RAM来设置其工作状态的,因此工作时需要对片内RAM进行编程。用户可根据不同的配置模式,采用不同的编程方式。FPGA有如下几种配置模式:
0 Q, y: B+ a: H+ v% m1、并行模式:并行PROM、Flash配置FPGA;1 O* J4 u7 c/ n" K; K7 _+ L& \6 S
2、主从模式:一片PROM配置多片FPGA;
1 e3 L+ b& s0 u/ p) j3、串行模式:串行PROM配置FPGA; ! Q8 A) b- ~7 @: H: F% ~7 ?# Y) l
4、外设模式:将FPGA作为微处理器的外设,由微处理器对其编程。
; |5 }2 Q, h! E% R7 Z) T: w% Z) [8 t# @8 q7 Q: U1 `* {8 b# K# Y* P
目前,FPGA市场占有率最高的两大公司Xilinx和Altera生产的FPGA都是基于SRAM工艺的,需要在使用 时外接一个片外存储器以保存程序。上电时,FPGA将外部存储器中的数据读入片内RAM,完成配置后,进入工作状态;掉电后FPGA恢复为白片,内部逻辑 消失。这样FPGA不仅能反复使用,还无需专门的FPGA编程器,只需通用的EPROM、PROM编程器即可。Actel、QuickLogic等公司还 提供反熔丝技术的FPGA,只能下载一次,具有抗辐射、耐高低温、低功耗和速度快等优点,在军品和航空航天领域中应用较多,但这种FPGA不能重复擦写, 开发初期比较麻烦,费用也比较昂贵。Lattice是ISP技术的发明者,在小规模PLD应用上有一定的特色。早期的Xilinx产品一般不涉及军品和宇航级市场,但目前已经有Q Pro-R等多款产品进入该类领域。
8 f6 Y- [5 m/ b' n5 K/ Q
, X1 q$ @) s& B( u1 z& c2、FPGA芯片结构1 N) g9 O7 z" S
目前主流的FPGA仍是基于查找表技术的,已经远远超出了先前版本的基本性能,并且整合了常用功能(如RAM、时钟管理 和DSP)的硬核(ASIC型)模块。如图1-1所示(注:图1-1只是一个示意图,实际上每一个系列的FPGA都有其相应的内部结构),FPGA芯片主 要由6部分完成,分别为:可编程输入输出单元、基本可编程逻辑单元、完整的时钟管理、嵌入块式RAM、丰富的布线资源、内嵌的底层功能单元和内嵌专用硬件 模块。% r$ ?- M, U. l/ C- [4 `/ H% Z3 M7 Z- z
$ f* o9 V$ e |! [# E9 a
8 Q# z2 x4 @9 N2 r0 x, s+ A7 ~ M
6 I# x) m7 w% T0 y2 a" A每个模块的功能如下: ) ~+ I8 f4 z; D) l$ O$ @2 e
( _0 r; k3 F9 X& X1.可编程输入输出单元(IOB)
6 p8 h# O6 T4 v3 Q可编程输入/输出单元简称I/O单元,是芯片与外界电路的接口部分,完成不同电气特性下对输入/输出信号的驱动与匹配要求,其示意结构如图1-2所示。 FPGA内的I/O按组分类,每组都能够独立地支持不同的I/O标准。通过软件的灵活配置,可适配不同的电气标准与I/O物理特性,可以调整驱动电流的大 小,可以改变上、下拉电阻。目前,I/O口的频率也越来越高,一些高端的FPGA通过DDR寄存器技术可以支持高达2Gbps的数据速率。
" r+ B# E1 h7 [: j1 u5 C& p1 @& i Z$ g7 D
* }1 U% u% @* i/ g' l6 ]$ ? V7 h& }2 j
外部输入信号可以通过IOB模块的存储单元输入到FPGA的内部,也可以直接输入FPGA 内部。当外部输入信号经过IOB模块的存储单元输入到FPGA内部时,其保持时间(Hold Time)的要求可以降低,通常默认为0。
9 L4 r0 O' `% R0 Z1 l$ J" k: a: _: T8 U e
为了便于管理和适应多种电器标准,FPGA的IOB被划分为若干个组(bank),每个bank的接口标准由其接口电压VCCO决定,一个bank只能有 一种VCCO,但不同bank的VCCO可以不同。只有相同电气标准的端口才能连接在一起,VCCO电压相同是接口标准的基本条件。 f0 N8 W+ R; `4 |9 ?
, U4 u; i. ~( x& s& t( `
2. 可配置逻辑块(CLB) & H B; ?* b3 J, Z- H/ q/ g8 W& O
CLB是FPGA内的基本逻辑单元。CLB的实际数量和特性会依器件的不同而不同,但是每个CLB都包含一个可配置开关矩阵,此矩阵由4或6个输入、一些 选型电路(多路复用器等)和触发器组成。 开关矩阵是高度灵活的,可以对其进行配置以便处理组合逻辑、移位寄存器或RAM。在Xilinx公司的FPGA器件中,CLB由多个(一般为4个或2个) 相同的Slice和附加逻辑构成,如图1-3所示。每个CLB模块不仅可以用于实现组合逻辑、时序逻辑,还可以配置为分布式RAM和分布式ROM。. n" ^; \' [) n' {" {
- p% N: I. ~, |( I4 n/ I
' I4 e- {3 N9 `" Y' [7 y
3 V0 O+ ~, n% ]8 dSlice是Xilinx公司定义的基本逻辑单位,其内部结构如图1-4所示,一个Slice由两个4输入的函数、进位 逻辑、算术逻辑、存储逻辑和函数复用器组成。算术逻辑包括一个异或门(XORG)和一个专用与门(MULTAND),一个异或门可以使一个Slice实现 2bit全加操作,专用与门用于提高乘法器的效率;进位逻辑由专用进位信号和函数复用器(MUXC)组成,用于实现快速的算术加减法操作;4输入函数发生 器用于实现4输入LUT、分布式RAM或16比特移位寄存器(Virtex-5系列芯片的Slice中的两个输入函数为6输入,可以实现6输入LUT或 64比特移位寄存器);进位逻辑包括两条快速进位链,用于提高CLB模块的处理速度
3 Q/ ^/ h- c- v1 \9 _; s& o4 z: U$ G) Y. d+ a1 M q" w/ o( e
) Z4 T+ {8 a' X s2 g5 H$ g
# W" k" T# F: ?8 j+ I8 }3. 数字时钟管理模块(DCM) - _9 t" G8 `$ B1 G; H- J% S* {
业内大多数FPGA均提供数字时钟管理(Xilinx的全部FPGA均具有这种特性)。Xilinx推出最先进的FPGA提供数字时钟管理和相位环路锁定。相位环路锁定能够提供精确的时钟综合,且能够降低抖动,并实现过滤功能。 * z% Q0 l; h; | ?1 L
) E% A/ K* D' U0 R% C$ J/ ?4. 嵌入式块RAM(BRAM) " F, T& C" @" v {+ d! P
大多数FPGA都具有内嵌的块RAM,这大大拓展了FPGA的应用范围和灵活性。块RAM可被配置为单端口RAM、双端口RAM、内容地址存储器 (CAM)以及FIFO等常用存储结构。RAM、FIFO是比较普及的概念,在此就不冗述。CAM存储器在其内部的每个存储单元中都有一个比较逻辑,写入 CAM中的数据会和内部的每一个数据进行比较,并返回与端口数据相同的所有数据的地址,因而在路由的地址交换器中有广泛的应用。除了块RAM,还可以将 FPGA中的LUT灵活地配置成RAM、ROM和FIFO等结构。在实际应用中,芯片内部块RAM的数量也是选择芯片的一个重要因素。 $ P& F# o9 S2 Z& l7 Z' y+ i- Z1 N, S
5 q$ r) c" {! F8 R* E, w$ q例如:单片块RAM的容量为18k比特,即位宽为18比特、深度为1024,可以根据需要改变其位宽和深度,但要满足两个原则:首先,修改后的容量(位宽 深度)不能大于18k比特;其次,位宽最大不能超过36比特。当然,可以将多片块RAM级联起来形成更大的RAM,此时只受限于芯片内块RAM的数量,而 不再受上面两条原则约束% V: u* n% L3 ]8 \8 D* g8 @0 C. f/ C
0 G9 a; a8 d# u! a5 R
5. 丰富的布线资源 ) x, D5 X1 `3 [9 Z
布线资源连通FPGA内部的所有单元,而连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。6 c0 Q7 h0 V, p2 O
FPGA芯片内部有着丰富的布线资源,根据工艺、长 度、宽度和分布位置的不同而划分为4类不同的类别。第一类是全局布线资源,用于芯片内部全局时钟和全局复位/置位的布线;第二类是长线资源,用以完成芯片 Bank间的高速信号和第二全局时钟信号的布线;第三类是短线资源,用于完成基本逻辑单元之间的逻辑互连和布线;第四类是分布式的布线资源,用于专有时 钟、复位等控制信号线。
7 J: ~+ V1 c9 E0 G" |6 _0 ^5 A4 j" z; P, I5 ?0 A- S
在实际中设计者不需要直接选择布线资源,布局布线器可自动地根据输入逻辑网表的拓扑结构和约束条件选择布线资源来连通各个模块单元。从本质上讲,布线资源的使用方法和设计的结果有密切、直接的关系。 $ _9 K' \0 R5 l/ W
( m3 T! s* h( |' g9 d/ Y6. 底层内嵌功能单元
1 ]/ T I$ k2 k内嵌功能模块主要指DLL(Delay Locked Loop)、PLL(Phase Locked Loop)、DSP和CPU等软处理核(Soft Core)。现在越来越丰富的内嵌功能单元,使得单片FPGA成为了系统级的设计工具,使其具备了软硬件联合设计的能力,逐步向SOC平台过渡。- K1 {' T! ?/ f8 Y, H" F. ]& _5 c
% i& f y. F9 ^2 P& }
DLL和PLL具有类似的功能,可以完成时钟高精度、低抖动的倍频和分频,以及占空比调整和移相等功能。Xilinx公司生产的芯片上集成了 DLL,Altera公司的芯片集成了PLL,Lattice公司的新型芯片上同时集成了PLL和DLL。PLL 和DLL可以通过IP核生成的工具方便地进行管理和配置。DLL的结构如图1-5所示。
1 @# p0 Z; ]1 Y
" b1 H1 U$ F* z e ^% J- r- V, O7 C* v0 Y
0 D3 }, K' H* d- M2 K; c7. 内嵌专用硬核
z/ i8 t5 G& g9 t' ?8 D3 i内嵌专用硬核是相对底层嵌入的软核而言的,指FPGA处理能力强大的硬核(Hard Core),等效于ASIC电路。为了提高FPGA性能,芯片生产商在芯片内部集成了一些专用的硬核。例如:为了提高FPGA的乘法速度,主流的FPGA 中都集成了专用乘法器;为了适用通信总线与接口标准,很多高端的FPGA内部都集成了串并收发器(SERDES),可以达到数十Gbps的收发速度。 Xilinx公司的高端产品不仅集成了Power PC系列CPU,还内嵌了DSP Core模块,其相应的系统级设计工具是EDK和Platform Studio,并依此提出了片上系统(System on Chip)的概念。通过PowerPC、Miroblaze、Picoblaze等平台,能够开发标准的DSP处理器及其相关应用,达到SOC的开发目 的。
( Q8 x7 r* O0 p0 @2 p' J" q" S( g3 U6 y
(1) 软核 2 o$ p; R m! L3 ~: s
软核在EDA设计领域指的是综合之前的寄存器传输级(RTL)模型;具体在FPGA设计中指的是对电路的硬件语言描述,包括逻辑描述、网表和帮助文档等。 软核只经过功能仿真,需要经过综合以及布局布线才能使用。其优点是灵活性高、可移植性强,允许用户自配置;缺点是对模块的预测性较低,在后续设计中存在发 生错误的可能性,有一定的设计风险。软核是IP核应用最广泛的形式。 8 }4 G2 \3 Z: O; J S' C% G
8 w" k8 S; }1 x" e. M
(2)固核
: |& S; q% Z7 D) X8 g5 a# I固核在EDA设计领域指的是带有平面规划信息的网表;具体在FPGA设计中可以看做带有布局规划的软核,通常以RTL代码和对应具体工艺网表的混合形式提 供。将RTL描述结合具体标准单元库进行综合优化设计,形成门级网表,再通过布局布线工具即可使用。和软核相比,固核的设计灵活性稍差,但在可靠性上有较 大提高。目前,固核也是IP核的主流形式之一。
5 @5 C- N9 a3 E9 {* @
" o( H# }5 w$ D, q# W; o(3)硬核 8 |: V0 p8 _ G( {! W: X9 j F3 W
硬核在EDA设计领域指经过验证的设计版图;具体在FPGA设计中指布局和工艺固定、经过前端和后端验证的设计,设计人员不能对其修改。不能修改的原因有 两个:首先是系统设计对各个模块的时序要求很严格,不允许打乱已有的物理版图;其次是保护知识产权的要求,不允许设计人员对其有任何改动。IP硬核的不许 修改特点使其复用有一定的困难,因此只能用于某些特定应用,使用范围较窄。
/ j H& i7 W, R* f) E* ~: `& r% i$ L
0 |3 Y$ Z+ @/ n# W! O3 \1 |* P( G1 K; C0 B3 O& Y
x+ y3 b/ l7 B' n# m) G3、比较CPLD和FPGA 一.基于乘积项(Product-Term)的PLD结构$ G8 W" x( R7 t6 D
采用这种结构的PLD芯片有:Altera的MAX7000,MAX3000系列(EEPROM工艺),Xilinx的XC9500系列(Flash工艺)和Lattice,Cypress的大部分产品(EEPROM工艺)& N& M5 @- f3 O* K
/ t/ p' u2 I ~0 i" P, P* G8 h我们先看一下这种PLD的总体结构(以MAX7000为例,其他型号的结构与此都非常相似):
# d- B9 P' S: U( u( B; g. d) g/ ^1 m& p. q4 M* {1 _2 m2 t6 I$ X
6 K# u* U& d5 C# y
图1 基于乘积项的PLD内部结构 u" ~/ k) C8 z" V9 {7 S
* E# d2 R I0 A6 T- ?
这种PLD可分为三块结构:宏单元(Marocell),可编程连线 (PIA)和I/O控制块。 宏单元是PLD的基本结构,由它来实现基本的逻辑功能。图1中兰色部分是多个宏单元的集合(因为宏单元较多,没有一一画出)。可编程连线负责信号传递,连 接所有的宏单元。I/O控制块负责输入输出的电气特性控制,比如可以设定集电极开路输出,摆率控制,三态输出等。 图1 左上的INPUT/GCLK1,
5 W6 s/ x. o1 r7 Z1 L. B6 DINPUT/GCLRn,INPUT/OE1,INPUT/OE2 是全局时钟,清零和输出使能信号,这几个信号有专用连线与PLD中每个宏单元相连,信号到每个宏单元的延时相同并且延时最短。
; E+ t4 X- s$ O/ |, E# I宏单元的具体结构见下图:& l$ {8 N4 r* w8 @
# ]6 u+ r* }: s8 w7 q8 H9 r% z# K' ~1 t
图2 宏单元结构 3 [8 q; a: ~" f
7 W0 P6 A, @) n0 Z0 D
左侧是乘积项阵列,实际就是一个与或阵列,每一个交叉点都是一个可编程 熔丝,如果导通就是实现“与”逻辑。后面的乘积项选择矩阵是一个“或”阵列。两者一起完成组合逻辑。图右侧是一个可编程D触发器,它的时钟,清零输入都可 以编程选择,可以使用专用的全局清零和全局时钟,也可以使用内部逻辑(乘积项阵列)产生的时钟和清零。如果不需要触发器,也可以将此触发器旁路,信号直接 输给PIA或输出到I/O脚。3 r7 W! C& z9 ]3 u" e# i7 l
) N& O8 V$ c8 B( a/ h二.乘积项结构PLD的逻辑实现原理
. M2 y8 K' \, u5 T5 e* m# P下面我们以一个简单的电路为例,具体说明PLD是如何利用以上结构实现逻辑的,电路如下图:
, Y" T. U5 g5 {" ?3 B
6 _4 v* a8 E k
4 r/ |" e& @7 @" q图3 ( t3 G' B" d7 a
$ C% L( T5 X0 h2 d8 s
假设组合逻辑的输出(AND3的输出)为f,则f=(A+B)*C*(!D)=A*C*!D + B*C*!D ( 我们以!D表示D的“非”)
& M3 j" y! K* H: @7 _; [
1 w3 X9 K$ ?8 h0 xPLD将以下面的方式来实现组合逻辑f:; y7 ]7 ^ Q6 L( J) e, D
8 q$ O/ t% A/ O1 _/ e0 q& S
' |: G# Q$ V3 d9 G% f1 Z/ L图4 * i2 L* J; J! Y) j( L* {
* {4 |# U+ {0 t( o# RA,B,C,D由PLD芯片的管脚输入后进入可编程连线阵列 (PIA),在内部会产生A,A反,B,B反,C,C反,D,D反8个输出。图中每一个叉表示相连(可编程熔丝导通),所以得到:f= f1 + f2 = (A*C*!D) +
! N i8 z! M. r _' u" A(B*C*!D) 。这样组合逻辑就实现了。 图3电路中D触发器的实现比较简单,直接利用宏单元中的可编程D触发器来实现。时钟信号CLK由I/O脚输入后进入芯片内部的全局时钟专用通道,直接连接 到可编程触发器的时钟端。可编程触发器的输出与I/O脚相连,把结果输出到芯片管脚。这样PLD就完成了图3所示电路的功能。(以上这些步骤都是由软件自 动完成的,不需要人为干预)
2 u u$ m0 m' x& o% [. g* K: [3 b. [
: x6 Y1 ^$ q7 D4 @" A+ o3 Q图3的电路是一个很简单的例子,只需要一个宏单元就可以完成。但对于一个复杂的电路,一个宏单元是不能实现的,这时就需要通过并联扩展项和共享扩展项将多个宏单元相连,宏单元的输出也可以连接到可编程连线阵列,再做为另一个宏单元的输入。这样PLD就可以实现更复杂逻辑。
3 t/ C4 m- P5 w& U
+ ]9 U- W* K2 q/ w这种基于乘积项的PLD基本都是由EEPROM和Flash工艺制造的,一上电就可以工作,无需其他芯片配合。 o( p4 ?- Z% D" S! W5 z1 R
" C' ~ [$ A- n4 R# H( S6 C% B/ w% h! b
PGA的基本工作原理
, e: y0 z, ]# w" y8 JFPGA是在PAL、GAL、EPLD、CPLD等可编程器件的基础上进一步发展的产物。它是作为ASIC领域中的一种半定制电路而出现的,即解决了定制电路的不足,又克服了原有可编程器件门电路有限的缺点。: O9 h0 a7 d% ~, h: i9 M0 C3 M) X
& |3 L* ~- ]& @3 j/ _9 ^$ y
由于FPGA需要被反复烧写,它实现组合逻辑的基本结构不可能像ASIC那样通过固定的与非门来完成,而只能采用一种易于反复配置的结构。查找表可以很好地满足这一要求,目前主流FPGA都采用了基于SRAM工艺的查找表结构,也有一些军品和宇航级FPGA采用Flash或者熔丝与反熔丝工艺的查找表结构。通过烧写文件改变查找表内容的方法来实现对FPGA的重复配置。0 k6 @" B8 z9 G0 p$ {2 k
( s& ^2 i; Q% q. u1 _根据数字电路的基本知识可以知道,对于一个n输入的逻辑运算,不管是与或非运算还是异或运算等等,最多只可能存在2n种结果。所以如果事先将相应的结果存放于一个存贮单元,就相当于实现了与非门电路的功能。FPGA的原理也是如此,它通过烧写文件去配置查找表的内容,从而在相同的电路情况下实现了不同的逻辑功能。
4 k4 L) b E- t& s
1 `% |4 j# I2 n1 c6 V查找表的原理与结构
# z: s$ k1 {% A0 _) `5 j查找表(Look-Up-Table)简称为LUT,LUT本质上就是一个RAM。目前FPGA中多使用4输入的LUT,所以每一个LUT可以看成一个有4位地址线的的RAM。当用户通过原理图或HDL语言描述了一个逻辑电路以后,- {1 R, ]" v$ K7 s R3 c
PLD/FPGA开发软件会自动计算逻辑电路的所有可能结果,并把真值表(即结果)事先写入RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。5 g: Z [6 Z: E2 g5 N
( T9 s* k# D. a# b8 @$ P下面给出一个四输入与非门电路的例子来说明LUT实现逻辑功能的原理。
# r8 {, _: P' Z6 p, g5 R表给出一个使用LUT实现四输入与门电路的真值表。
% v I! o& x! k% o; e. y( G v7 ]4 v# v5 d
8 F; F) r7 J$ O5 s
表 输入与门的真值表
: C2 L4 ~5 w4 O3 h( ?; {% M1 q& n4 o! y; G' p e; x, } l4 _
从中可以看到,LUT具有和逻辑电路相同的功能。实际上,LUT具有更快的执行速度和更大的规模。, e; _& P+ O/ w7 P
# n! [/ ^* B" ]. O
3.1.2查找表结构的FPGA逻辑实现原理
8 U0 \4 P3 P `我们还是以这个电路的为例:- e | l8 {4 P6 ^ j9 u
# E2 \$ H: X" \
0 Z. k+ {5 G. ?- R5 I3 ^- ^& k# V* t- w. z( K3 a& m
图 四输入与门电路图 0 y2 B5 _' v0 d( X3 ]' \9 p( @
$ Z3 s, c8 B2 d# l0 UA,B,C,D由FPGA芯片的管脚输入后进入可编程连线,然后作为地址线连到到LUT,LUT中已经事先写入了所有可能的逻辑结果,通过地址查找到相应的数据然后输出,这样组合逻辑就实现了。该电路中D触发器是直接利用LUT后面D触发器来实现。时钟信号CLK由I/O脚输入后进入芯片内部的时钟专用通道,直接连接到触发器的时钟端。触发器的输出与I/O脚相连,把结果输出到芯片管脚。这样PLD就完成了图所示电路的功能。(以上这些步骤都是由软件自动完成的,不需要人为干预)5 \1 @, K5 B/ @) y
% x' ?9 K; S- l" _) W2 H9 v7 ]这个电路是一个很简单的例子,只需要一个LUT加上一个触发器就可以完成。对于一个LUT无法完成的的电路,就需要通过进位逻辑将多个单元相连,这样FPGA就可以实现复杂的逻辑。/ U+ c+ V. n3 O
3 ]! K5 W3 h# A$ i
因为基于LUT的FPGA具有很高的集成度,其器件密度从数万门到数千万门不等,可以完成极其复杂的时序与逻辑组合逻辑电路功能,所以适用于高速、高密度的高端数字逻辑电路设计领域。其组成部分主要有可编程输入/输出单元、基本可编程逻辑单元、内嵌SRAM、丰富的布线资源、底层嵌入功能单元、内嵌专用单元等,主要设计和生产厂家有Xilinx、Altera、Lattice、Actel、Atmel和QuickLogic等公司,其中最大的是Xilinx、Altera、Lattice三家。% L% L/ x* o4 d
/ X& m; z4 w* f
% _) j$ ~7 h' U; P5 s- ]4、比较Xilinx和Altera
' i1 Y# Y* G( ]. a( i7 E要比较Xilinx和Altera的FPGA,就要清楚两个大厂FPGA的结构,由于各自设计的不同,两家的FPGA结构各不相同,参数也各不相同,但可以统一到LUT(Look-Up-Table)查找表上。# X! G O3 L, I0 w$ `" y+ g2 n+ T
下图就是A家的Cyclone IV系列片子的参数:
* m! i1 S) Q4 w; E* s( G
! a8 j- w7 b `7 F- `# @" G) }' ]
, e$ {2 n0 ]/ y4 O
" w. I0 K4 u3 k1 P, |0 PAltera Cyclone IV 系列资源比较/ {; V; c- a& U( e" x6 X! k: _2 g
* z" |0 p: ]/ P4 i可以看到,A家的片子,用的是LE这个术语。5 V. ]4 H( z) F( Y( i$ ^
x: F5 n' x1 c1 `
而下图是X家的Spartan-6 片子资料:6 f! z1 p* j, G6 z" K
4 T! ?- i/ P8 c
t& P$ k, M: B- r( Y
3 J+ l$ m+ G/ y1 U8 b
Xilinx Spartan-6 系列资源比较5 @6 X0 w9 Q1 o# J: i5 t" |" \
+ K+ l. p; x+ f) v/ `4 L; D1 dX家用的是CLB这个术语作为基本单元。% j4 H4 l# X8 T4 a; m3 l
3 P8 S8 U3 `6 j' R1 W( E! ]; P
再看看两家的基本单元有何不同:
% D% S$ L" P% |1 Y+ A: i7 D% `( w" o4 x
A家的LE如下图:- F, a7 g/ @$ }6 m4 Z
. r4 I4 `9 v+ G) ^2 b8 p: U
3 r9 r$ j4 F. k8 k. O) o M9 g- x/ f. Z
7 h( d+ ~8 ~/ D i& t; bCyclone LE 结构
( N- K S; q5 n3 c% h8 C& z2 [- X
就是一个4输入LUT+FF构成2 C) Z! S: c; }2 h# F
- `* B6 I) T( {, g' D而X家的CLB如下:$ X0 W/ y9 `+ M& V- B) h
$ y, n6 l+ K# Q# [xilinx CLB 结构
* O2 Y% T9 f8 e3 \4 W" ]/ u: s! Y5 A1 n
5 d" s& D8 Z8 Y( N( T F; @
6 U V+ {, d- ]+ _4 T1 z: E一个CLB由2个SLICE构成,一个SLICE含有4个6输入LUT,所以LUT=8*CLB。
. H) l. i! |+ W" @: m
/ ]+ w& ~" h0 N7 oXilinx CLB 包含的 Slices LUT FF
. T# r$ P) H+ D4 w* G
! J7 Z' D% e F: j( c C4 K( ]# B( o: R4 e
8 ?" V0 R6 \# I5 b0 m
这样的话,可以较比一下。EP4CE6基本就和XC6SLX9一个级别。。。。当然A家的片子是4输入LUT远比不上X家的6输入LUT。而X家的S-6片子,一个Slice内部有4个lut,8个FF。简而言之,一个Slice=四个LE。要注意的是A家C5以下的片子是4输入LUT而X家的是6输入LUT,差别也较大。如果不考虑FF,那么一个X家的slice=4个A家的LE。例如XC6SLX16含有2278个slices=EP4CE10(9000LE)的样子。当然,S-6的FF多一倍,达到了18224个。
: G; w/ ` h) w0 @: _3 H
4 L9 ~8 j- o) n9 a2 P在Virtex-5中(我们的设计大部分是Virtex,V5V6V7),一个Slice包含了4个LUT和4个FF。所以单纯从逻辑资源来看,S-6一个Slice比V-5的Slice强。当然V5的GTPGTX等等还有IO数量是S-6赶不上的。当然,A家的Cyclone V系列的片子,内部和前几代完全不同,采用了从高端的Stratix系列下放的技术.3 m: D. D7 T& S" z% I
# c4 j Y. H8 l. b+ M; j0 y
; L/ Q* ?5 A9 Y7 [5、分布式RAM和Block ram4 ^: D; }2 p0 y% l1 A
以下分析基于xilinx 7系列
* a( M. [8 v& ^6 a9 |7 {1 ]* g/ d" d1 s
CLB是xilinx基本逻辑单元,每个CLB包含两个slices,每个slices由4个(A,B,C,D)6输入LUT和8个寄存器组成。, ~9 w; C" F9 F7 j/ u. p
& f, u' ^3 k5 ]9 Q7 g A( A! P
同一CLB中的两片slices没有直接的线路连接,分属于两个不同的列。每列拥有独立的快速进位链资源。
8 r7 Y: M& z0 ], h# k- p0 S% T1 c( `. f/ J) b, |
* r2 m4 _2 _6 v- [$ H' A6 w& M
. P# I& `$ h% z3 r9 X, w0 H9 T7 W9 Rslice分为两种类型 SLICEL, SLICEM . SLICEL可用于产生逻辑,算术,ROM。 SLICEM除以上作用外还可配置成分布式RAM或32位的移位寄存器。每个CLB可包含两个SLICEL或者一个SLICEL与一个SLICEM.
/ W7 v6 K+ I w0 \: J$ c* K* j$ |/ I3 m1 K1 O- Y. D7 H4 m
7系列的LUT包含6个输入 A1 -A6 , 两个输出 O5 , O6 .# f) u, ?5 k, V, ^# ?
可配置成6输入查找表,O6此时作为输出。或者两个5输入的查找表,A1-A5作为输入 A6拉高,O5,O6作为输出。
9 e. E) i% e7 ]: J
( ^* [1 ]; T0 l* }一个LUT包含6个输入,逻辑容量为2^6bit,为实现7输入逻辑需要2^7容量,对于更多输入也一样。每个SLICES有4个LUT,256bit容量能够实现最多8bit输入的逻辑。为了实现此功能,每个SLICES还包括3个MUX(多路选择器)
* w! X# V- k* F% @2 q6 u) d x3 m
- }3 P& V* Y/ v0 M7 NF7AMUX 用于产生7输入的逻辑功能,用于连接A,B两个LUT , H6 ]- y- ^4 e+ r1 d: U: F
( Q, z- j: A1 f5 `( N9 }1 X+ @F7BMUX 用于产生7输入的逻辑功能, 用于连接C,D两个LUT& k; K% J% j9 ~& j! M
6 P9 L U( A' F% p" p' Y
F8MUX 用于产生8输入的逻辑功能, 用于连接4个LUT8 e( X, x) p, V" a- T# r
0 {: k1 `5 Q8 n' A4 I: d! Z对于大于8输入的逻辑需要使用多个SLICES, 会增加逻辑实现的延时。! h) T/ x- t/ a" M" Y! o' \
- ~$ W7 N- p" n3 ]一个SLICES中的4个寄存器可以连接LUT或者MUX的输出,或者被直接旁路不连接任何逻辑资源。寄存器的置位/复位端为高电平有效。只有CLK端能被设置为两个极性,其他输入若要改变电平需要插入逻辑资源。例如低电平复位需要额外的逻辑资源将rst端输入取反。但设为上升/下降沿触发寄存器不会带来额外消耗。
4 W8 C$ H9 o' ?# B3 ^; j5 M7 }: U6 S9 O9 J
分布式RAM
+ R* a) F4 Y, g8 w2 X; o( P% Z; r7 u3 x1 f; O2 F$ Z* O5 K2 Y
SLICEM可以配置成分布式RAM,一个SLICEM可以配置成以下容量的RAM9 ~( ~2 k+ O! X1 P; `
& m$ D4 m% I9 ~2 j- h9 n4 v. ~
$ o0 I, [) y6 @
) N( q$ \& [1 h1 I; N
多bit的情况需要增加相应倍数的LUT进行并联。9 ?7 K0 k! `( i
8 I# L8 Z; V* |. T5 h) n k分布式RAM和 BLOCK RAM的选择遵循以下方法:
; B2 A0 i' w; T% z- U1. 小于或等于64bit容量的的都用分布式实现
, y$ |/ b: K2 F- i o6 C2. 深度在64~128之间的,若无额外的block可用分布式RAM。要求异步读取就使用分布式RAM。数据宽度大于16时用block ram。
2 A; Y9 n2 x* h4 b7 T' J$ ?3. 分布式RAM有比block ram更好的时序性能。 分布式RAM在逻辑资源CLB中。而BLOCK RAM则在专门的存储器列中,会产生较大的布线延迟,布局也受制约。
" r2 B7 k# s) v1 k9 ^* E& {3 L
* w! I: E7 k# @4 ^$ H移位寄存器(SLICEM) ) I5 y( k% ]& s, y9 y9 z7 d
SLICEM中的LUT能在不使用触发器的情况下设置成32bit的移位寄存器,4个LUT可级联成128bit的移位寄存器。并且能够进行SLICEM间的级联形成更大规模的移位寄存器。
' }$ h0 `0 h C6 ]6 A
# ]- b# v" M+ E2 a! u; J9 P, z5 Q$ T$ A
& D. T1 N+ @9 ] |0 u5 x2 d) f6 o' k( a7 {- G
MUX
3 ]( ~& x. F$ t) f5 C
( V B; v, ?6 ~7 { v4 h- t一个LUT可配置成4:1MUX.
) F% v. O) p8 W. r9 w9 i6 }, D: [1 s4 T
两个LUT可配置成最多8:1 MUX x/ e& @ g# b
( U, @! x! S) Q5 H* E f四个LUT可配置成16个MUX
4 Z. D+ g* c W0 m, G. q2 V% j# n3 U
: O5 y0 [' `! g9 f) N
0 U" e0 M4 O$ M, x' X- n
' z* K9 m) @5 ~. x# v' {3 w
同样可以通过连接多个SLICES达成更大规模设计,但是由于SLICE没有直接连线,需要使用布线资源,会增加较大延迟。: R, @, ?, z+ o L
0 A8 J' y, D/ J+ T进位链
( B: u( d) y6 d% L! ~' G每个SLICE有4bit的进位链。每bit都由一个进位MUX(MUXCY)和一个异或门组成,可在实现加法/减法器时生成进位逻辑。该MUXCY与XOR也可用于产生一般逻辑。
! H3 g2 u$ G3 W& P& r; F- H- T7 f: l+ B3 t2 J: B
% _+ ~ W8 G8 D- v: V
6、FPGA设计方法概论
5 r1 I$ P& a: y" D/ Y% yFPGA是可编程芯片,因此FPGA的设计方法包括硬件设计和软件设计两部分。硬件包括FPGA芯片电路、存储器、输入输出接口电路以及其他设备,软件即是相应的HDL程序以及最新才流行的嵌入式C程序。硬件设计是基础,但其方法比较固定,本书将在第4节对其进行详细介绍,本节主要介绍软件的设计方法。 ( `+ |- V: a- \, M' ?
/ E7 Q$ k! n* e9 w8 k% p2 s目前微电子技术已经发展到SOC阶段,即集成系统(Integrated System)阶段,相对于集成电路(IC)的设计思想有着革命性的变化。SOC是一个复杂的系统,它将一个完整产品的功能集成在一个芯片上,包括核心处理器、存储单元、硬件加速单元以及众多的外部设备接口等,具有设计周期长、实现成本高等特点,因此其设计方法必然是自顶向下的从系统级到功能模块的软、硬件协同设计,达到软、硬件的无缝结合。
. f% f- I$ R/ L1 e! }8 l7 \: A, {/ z3 J4 v6 [! g7 ~" Y
这么庞大的工作量显然超出了单个工程师的能力,因此需要按照层次化、结构化的设计方法来实施。首先由总设计师将整个软件开发任务划分为若干个可操作的模块,并对其接口和资源进行评估,编制出相应的行为或结构模型,再将其分配给下一层的设计师。这就允许多个设计者同时设计一个硬件系统中的不同模块,并为自己所设计的模块负责;然后由上层设计师对下层模块进行功能验证。
$ T! e& R7 h' D0 A) |- ?) @/ x9 x' w5 j% [4 ~" K7 Q. c. w9 r: b( J
自顶向下的设计流程从系统级设计开始,划分为若干个二级单元,然后再把各个二级单元划分为下一层次的基本单元,一直下去,直到能够使用基本模块或者IP核直接实现为止,如图1-6所示。流行的FPGA开发工具都提供了层次化管理,可以有效地梳理错综复杂的层次,能够方便地查看某一层次模块的源代码以修改错误。
/ r) J/ \3 O$ ?' g1 k. ^* V* [2 g2 \1 c" h0 a
0 q* t% q) M* p# ~图1-6 自顶向下的FPGA设计开发流程
, m- a! L, d9 G4 |% c' u0 D
8 {. ^! A: T- [( A: c在工程实践中,还存在软件编译时长的问题。由于大型设计包含多个复杂的功能模块,其时序收敛与仿真验证复杂度很高,为了满足时序指标的要求,往往需要反复修改源文件,再对所修改的新版本进行重新编译,直到满足要求为止。这里面存在两个问题:首先,软件编译一次需要长达数小时甚至数周的时间,这是开发所不能容忍的;其次,重新编译和布局布线后结果差异很大,会将已满足时序的电路破坏。因此必须提出一种有效提高设计性能,继承已有结果,便于团队化设计的软件工具。FPGA厂商意识到这类需求,由此开发出了相应的逻辑锁定和增量设计的软件工具。例如,Xilinx公司的解决方案就是PlanAhead。
; t* S) y4 u: T* s' {
) q. g# ^, S) DPlanahead 允许高层设计者为不同的模块划分相应FPGA芯片区域,并允许底层设计者在在所给定的区域内独立地进行设计、实现和优化,等各个模块都正确后,再进行设计整合。如果在设计整合中出现错误,单独修改即可,不会影响到其它模块。Planahead将结构化设计方法、团队化合作设计方法以及重用继承设计方法三者完美地结合在一起,有效地提高了设计效率,缩短了设计周期。
: Q3 P2 `( l' P* _6 F/ m! i: E3 k
不过从其描述可以看出,新型的设计方法对系统顶层设计师有很高的要求。在设计初期,他们不仅要评估每个子模块所消耗的资源,还需要给出相应的时序关系;在设计后期,需要根据底层模块的实现情况完成相应的修订。
) v9 c& R6 Q. l2 F l4 J# Q9 S4 V0 t- k0 \$ d
典型FPGA开发流程
3 Y6 E2 Y. U5 X* S# u& E, v* KFPGA的设计流程就是利用EDA开发软件和编程工具对FPGA芯片进行开发的过程。FPGA的开发流程一般如图1-7所示,包括电路设计、设计输入、功能仿真、综合优化、综合后仿真、实现、布线后仿真、板级仿真以及芯片编程与调试等主要步骤。 ]- {4 Y% l% W5 ?( u
. o. V; S' p4 p& w9 b& i6 d- o |3 _& K' m# e I5 }0 R4 o
图1-7 FPGA开发的一般流程 1 f2 D# P4 k4 z' d% R
/ w$ H- E+ _7 y; G: x$ H5 Q
1. 电路设计
/ K) j4 H8 {! I8 K在系统设计之前,首先要进行的是方案论证、系统设计和FPGA芯片选择等准备工作。系统工程师根据任务要求,如系统的指标和复杂度,对工作速度和芯片本身的各种资源、成本等方面进行权衡,选择合理的设计方案和合适的器件类型。一般都采用自顶向下的设计方法,把系统分成若干个基本单元,然后再把每个基本单元划分为下一层次的基本单元,一直这样做下去,直到可以直接使用EDA元件库为止。 ! {5 L, z4 V/ f
/ @! C: M" n7 P- ?/ D
2. 设计输入 ; i' J T8 G" p& o0 h* J2 C6 g
设计输入是将所设计的系统或电路以开发软件要求的某种形式表示出来,并输入给EDA工具的过程。常用的方法有硬件描述语言(HDL)和原理图输入方法等。原理图输入方式是一种最直接的描述方式,在可编程芯片发展的早期应用比较广泛,它将所需的器件从元件库中调出来,画出原理图。这种方法虽然直观并易于仿真,但效率很低,且不易维护,不利于模块构造和重用。更主要的缺点是可移植性差,当芯片升级后,所有的原理图都需要作一定的改动。目前,在实际开发中应用最广的就是HDL语言输入法,利用文本描述设计,可以分为普通HDL和行为HDL。普通HDL有ABEL、CUR等,支持逻辑方程、真值表和状态机等表达方式,主要用于简单的小型设计。而在中大型工程中,主要使用行为HDL,其主流语言是Verilog HDL和VHDL。这两种语言都是美国电气与电子工程师协会(IEEE)的标准,其共同的突出特点有:语言与芯片工艺无关,利于自顶向下设计,便于模块的划分与移植,可移植性好,具有很强的逻辑描述和仿真功能,而且输入效率很高。
' a8 w+ K1 [& o( {$ i5 [% k# ^: l+ V A$ J0 M6 R, W. E
3. 功能仿真 ) K( [, K' M; d" K3 g
功能仿真,也称为前仿真,是在编译之前对用户所设计的电路进行逻辑功能验证,此时的仿真没有延迟信息,仅对初步的功能进行检测。仿真前,要先利用波形编辑器和HDL等建立波形文件和测试向量(即将所关心的输入信号组合成序列),仿真结果将会生成报告文件和输出信号波形,从中便可以观察各个节点信号的变化。如果发现错误,则返回设计修改逻辑设计。常用的工具有Model Tech公司的ModelSim、Sysnopsys公司的VCS和cadence公司的NC-Verilog以及NC-VHDL等软件。
/ E9 S1 h# l1 D1 W$ J9 X$ p1 R" T/ s/ q( |9 T' Q
4. 综合优化 6 w) e2 a. A# g3 T S+ E
所谓综合就是将较高级抽象层次的描述转化成较低层次的描述。综合优化根据目标与要求优化所生成的逻辑连接,使层次设计平面化,供FPGA布局布线软件进行实现。就目前的层次来看,综合优化(Synthesis)是指将设计输入编译成由与门、或门、非门、RAM、触发器等基本逻辑单元组成的逻辑连接网表,而并非真实的门级电路。真实具体的门级电路需要利用FPGA制造商的布局布线功能,根据综合后生成的标准门级结构网表来产生。为了能转换成标准的门级结构网表,HDL程序的编写必须符合特定综合器所要求的风格。由于门级结构、RTL级的HDL程序的综合是很成熟的技术,所有的综合器都可以支持到这一级别的综合。常用的综合工具有Synplicity公司的Synplify/Synplify Pro软件以及各个FPGA厂家自己推出的综合开发工具。 , s' g l5 O" U: ?: u& x
: _3 n5 O" S; t8 E G6 [ r
5. 综合后仿真 # d, k$ z8 P; D5 B& `2 L
综合后仿真检查综合结果是否和原设计一致。在仿真时,把综合生成的标准延时文件反标注到综合仿真模型中去,可估计门延时带来的影响。但这一步骤不能估计线延时,因此和布线后的实际情况还有一定的差距,并不十分准确。目前的综合工具较为成熟,对于一般的设计可以省略这一步,但如果在布局布线后发现电路结构和设计意图不符,则需要回溯到综合后仿真来确认问题之所在。在功能仿真中介绍的软件工具一般都支持综合后仿真。
% n, g2 ]6 n4 q4 h5 u* D: L Q% E2 X' N/ v3 A
6. 实现与布局布线
* l9 V' Q. u. f实现是将综合生成的逻辑网表配置到具体的FPGA芯片上,布局布线是其中最重要的过程。布局将逻辑网表中的硬件原语和底层单元合理地配置到芯片内部的固有硬件结构上,并且往往需要在速度最优和面积最优之间作出选择。布线根据布局的拓扑结构,利用芯片内部的各种连线资源,合理正确地连接各个元件。目前,FPGA的结构非常复杂,特别是在有时序约束条件时,需要利用时序驱动的引擎进行布局布线。布线结束后,软件工具会自动生成报告,提供有关设计中各部分资源的使用情况。由于只有FPGA芯片生产商对芯片结构最为了解,所以布局布线必须选择芯片开发商提供的工具。 ! H$ E4 y* k3 H. D
; E# V$ c- y9 Q7. 实现与布局布线 # E, g, v, s& p* d8 Q
时序仿真,也称为后仿真,是指将布局布线的延时信息反标注到设计网表中来检测有无时序违规(即不满足时序约束条件或器件固有的时序规则,如建立时间、保持时间等)现象。时序仿真包含的延迟信息最全,也最精确,能较好地反映芯片的实际工作情况。由于不同芯片的内部延时不一样,不同的布局布线方案也给延时带来不同的影响。因此在布局布线后,通过对系统和各个模块进行时序仿真,分析其时序关系,估计系统性能,以及检查和消除竞争冒险是非常有必要的。在功能仿真中介绍的软件工具一般都支持综合后仿真。
: n* i3 x: X$ U& ~$ W6 j+ |7 \! j: X# Q$ K5 T" I M
8. 板级仿真与验证 0 K7 b' x# e, L
板级仿真主要应用于高速电路设计中,对高速系统的信号完整性、电磁干扰等特征进行分析,一般都以第三方工具进行仿真和验证。
( y4 |7 G- d. q7 D% v, m) @1 f g$ }9 B& x
9. 芯片编程与调试 . z( S% ^* Y0 x: V' J: X
设计的最后一步就是芯片编程与调试。芯片编程是指产生使用的数据文件(位数据流文件,Bitstream Generation),然后将编程数据下载到FPGA芯片中。其中,芯片编程需要满足一定的条件,如编程电压、编程时序和编程算法等方面。逻辑分析仪(Logic Analyzer,LA)是FPGA设计的主要调试工具,但需要引出大量的测试管脚,且LA价格昂贵。目前,主流的FPGA芯片生产商都提供了内嵌的在线逻辑分析仪(如Xilinx ISE中的ChipScope、Altera QuartusII中的SignalTapII以及SignalProb)来解决上述矛盾,它们只需要占用芯片少量的逻辑资源,具有很高的实用价值。
+ `" A( ?" u( Y2 K6 I: {
3 ~' q& C7 S* N) B: ^1 A! }% b5 I
! r3 z5 J0 w" S( s9 ~( ]1.3.3 基于FPGA的SOC设计方法
Q8 ?* H8 }& \ r' b基于FPGA的SOC设计理念将FPGA可编程的优点带到了SOC领域,其系统由嵌入式处理器内核、DSP单元、大容量处理器、吉比特收发器、混合逻辑、IP以及原有的设计部分组成。相应的FPGA规模大都在百万门以上,适合于许多领域,如电信、计算机等行业。
0 Q0 }6 c1 G+ R3 ?# R
0 v& W, a, Q/ q2 u2 }$ i% ?系统设计方法是SOC常用的方法学,其优势在于,可进行反复修改并对系统架构实现进行验证,??? 包括SOC集成硬件和软件组件之间的接口。不过,目前仍存在很多问题,最大的问题就是没有通用的系统描述语言和系统级综合工具。随着FPGA平台的融入,将 SOC逐步地推向了实用。SOC平台的核心部分是内嵌的处理内核,其硬件是固定的,软件则是可编程的;外围电路则由FPGA的逻辑资源组成,大都以IP 的形式提供,例如存储器接口、USB接口以及以太网MAC层接口等,用户根据自己需要在内核总线上添加,并能自己订制相应的接口IP和外围设备。
5 |" ^" F. }6 `9 P
( _" ^' @' |5 a% `基于FPGA的典型SOC开发流程为: - `1 U0 ^. U# j
1.芯片内的考虑 9 S M. [9 q5 R k! r8 e. p
从设计生成开始,设计人员需要从硬件/软件协同验证的思路入手,以找出只能在系统集成阶段才会被发现的软、硬件缺陷。然后选择合适的芯片以及开发工具,在综合过程得到优化,随后进行精确的实现,以满足实际需求。由于设计规模越来越大,工作频率也到了数百兆赫兹,布局布线的延迟将变得非常重要。为了确保满足时序,需要在布局布线后进行静态时序分析,对设计进行验证。 ! |; H2 X+ x; m4 a, R
' u& D% F( _$ `* D6 x
2.板级验证
5 ~- ~) F3 O9 ^7 _9 G在芯片设计完毕后,需要再进行板级验证,以便在印刷电路板(PCB)上保证与最初设计功能一致。因此,PCB布局以及信号完整性测试应被纳入设计流程。由于芯片内设计所做的任何改变都将反映在下游的设计流程中,各个过程之间的数据接口和管理也必须是无误的。预计SOC系统以及所必须的额外过程将使数据的大小成指数增长,因此,管理各种数据集本身是急剧挑战性的任务 ~$ M; z$ A) a8 V- ~
: K" A" h! b4 }5 @ ?2 X: p* T
- I" }: | g7 G$ Q0 K
7、DCM时钟管理单元
3 K& B# Y6 K) q$ B看Xilinx的Datasheet会注意到Xilinx的FPGA没有PLL,其实DCM就是时钟管理单元。
( N2 I, G+ L: m/ n! I/ J7 X3 j( z( |; u1 f
1、DCM概述
' v) k, R9 Q# t4 sDCM内部是DLL(Delay Lock Loop结构,对时钟偏移量的调节是通过长的延时线形成的。DCM的参数里有一个PHASESHIFT(相移),可以从0变到255。所以我们可以假设内部结构里从输入引脚clkin到输出引脚clk_1x之间应该有256根延时线(实际上,由于对不同频率的时钟都可以从0变到255,延时线的真正数目应该比这个大得多)。DCM总会把输入时钟clkin和反馈时钟CLKFB相比较,如果它们的延时差不等于所设置的PHASESHIFT,DCM就会改变在clkin和clk_1x之间的延时线数目,直到相等为止,输出和输入形成闭环,动态调整到设定值再退出。这个从不等到相等所花的时间,就是输出时钟锁定的时间,相等以后,lock_flag标识才会升高。
5 f7 r" m" w$ v5 ^7 o+ b$ _0 p' X* H: n/ B
当DCM发现clkin和clkfb位相差不等于PHASESHIFT的时候,就去调节clk_1x和clkin之间延时,所以如果clk_1x和clkfb不相关的话,那就永远也不能锁定了。# @2 X' q: n( J8 m- \. `, K
% t2 y+ T! y( h; l3 C
& d k+ y; T4 f4 E6 b9 m图一、DCM和BUFG配合使用示意图
. H+ S6 r0 ~5 k0 ^/ x+ X1 ]8 T4 l7 C
) C" }9 |; H( n5 f2、如何使用DCM1 L$ \) Q7 B& ^2 O0 m
DCM一般和BUFG配合使用,要加上BUFG,应该是为了增强时钟的驱动能力。DCM的一般使用方法是,将其输出clk_1x接在BUFG的输入引脚上,BUFG的输出引脚反馈回来接在DCM的反馈时钟脚CLKFB上。另外,在FPGA里,只有BUFG的输出引脚接在时钟网络上,所以一般来说你可以不使用DCM,但你一定会使用BUFG。有些兄弟总喜欢直接将外部输入的时钟驱动内部的寄存器,其实这个时候虽然你没有明显地例化BUFG,但工具会自动给你加上的。
& w: _) ]+ k8 k( q* B3 \9 h( T8 G: i* R* @4 R" E2 }
3、使用DCM可以消除时钟skew
6 a. w; f4 n1 r使用DCM可以消除时钟skew。这个东西一直是我以前所没有想清楚的,时钟从DCM输出开始走线到寄存器,这段skew的时间总是存在的,为什么用DCM就可以消除呢?直到有一天忽然豁然开朗,才明白其原委。对高手来说,也许是极为easy的事情,但也许有些朋友并不一定了解,所以写出来和大家共享。: E* B: X' V" G. q1 x9 |6 N0 @
& o/ o0 G1 l4 i2 Z& }: H( @为说明方便起见,我们将BUFG的输出引脚叫做clk_o,从clk_o走全局时钟布线到寄存器时叫做clk_o_reg,从clk_o走线到DCM的反馈引脚CLKFB上时叫clkfb,如图所示。实际上clk_o, clk_o_reg, clkfb全部是用导线连在一起的。- y" F6 @, j0 z% F$ o
9 p8 ]6 o( J4 J& l! d所谓时钟skew,指的就是clk_o到clk_o_reg之间的延时。如果打开FPGA_Editor看底层的结构,就可以发现虽然DCM和BUFG离得很近,但是从clk_o到clkfb却绕了很长一段才走回来,从而导致从clk_o到clk_o_reg和clkfb的延时大致相等。% K( A2 u+ M. Z* y% s5 O) ?! Q( e1 D
4 {1 B& Z6 g1 }3 P( D3 N2 Q. O
总之就是clk_o_reg和clkfb的相位应该相等。所以当DCM调节clkin和clkfb的相位相等时,实际上就调节了clkin和clk_o_reg相等。而至于clk_1x和clk_o的相位必然是超前于clkin, clkfb, clk_o_reg的,而clk_1x和clk_o之间的延时就很明显,就是经过那个BUFG的延迟时间。
! d0 y+ \/ V7 B, \5 o$ `4 R) P! c8 w
4、对时钟skew的进一步讨论
* q2 k1 c7 G5 r3 I- P* z最后,说一说时钟skew的概念。时钟skew实际上指的是时钟驱动不同的寄存器时,由于寄存器之间可能会隔得比较远,所以时钟到达不同的寄存器的时间可能会不一样,这个时间差称为时钟skew。这种时钟skew可以通过时钟树来解决,也就是使时钟布线形成一种树状结构,使得时钟到每一个寄存器的距离是一样的。很多FPGA芯片里就布了这样的时钟树结构。也就是说,在这种芯片里,时钟skew基本上是不存在的。4 m& r8 V: e9 Z7 d6 E
# P$ B: ]% y7 Y+ l
说到这里,似乎有了一个矛盾,既然时钟skew的问题用时钟树就解决了,那么为什么还需要DCM+BUFG来解决这个问题?另外,既然时钟skew指的是时钟驱动不同寄存器之间的延时,那么上面所说的clk_o到clk_o_reg岂非不能称为时钟skew?, [' ? Q5 u! z6 |8 {* m- }
, E- g) n6 z+ F先说后一个问题。在一块FPGA内部,时钟skew问题确实已经被FPGA的时钟方案树解决,在这个前提下clk_o到clk_o_reg充其量只能叫做时钟延时,而不能称之为时钟skew。可惜的是FPGA的设计不可能永远只在内部做事情,它必然和外部交换数据。例如从外部传过来一个32位的数据以及随路时钟,数据和随路时钟之间满足建立保持时间关系(Setup Hold time),你如何将这32位的数据接收进来?如果你不使用DCM,直接将clkin接在BUFG的输入引脚上,那么从你的clk_o_reg就必然和clkin之间有个延时,那么你的clk_o_reg还能保持和进来的数据之间的建立保持关系吗?显然不能。相反,如果你采用了DCM,接上反馈时钟,那么clk_o_reg和clkin同相,就可以利用它去锁存进来的数据。可见,DCM+BUFG的方案就是为了解决这个问题。而这个时候clk_o到clk_o_reg的延时,我们可以看到做内部寄存器和其他芯片传过来的数据之间的时钟skew。2 }# U A6 ^. T8 ^4 ^1 M y! A, f9 b/ b
0 S4 a, x0 z# s7 X; W9 k
由此,我们可以得出一个推论,从晶振出来的时钟作为FPGA的系统时钟时,我们可以不经过DCM,而直接接到BUFG上就可以,因为我们并不在意从clkin到clk_o_reg的这段延时。
6 x* o( P" O: K8 k- P3 n2 E' d7 Z g' r, o6 G+ [
0 N' i- z& O* [( j |
|