本文主要以Xilinx Virtex Ⅱ系列为例,对FPGA内部结构作简要介绍,其内容主要来自Xilinx Virtex Ⅱ datasheet、user guide、以及其它来自Xilinx网站上的资料。
内部结构概述
FPGA内部比较复杂,根据Datasheet上的分类,主要包括以下几个部分:
l 输入/输出模块 Input/Output Blocks (IOB)
l 可配置逻辑单元 Configurable Logic Blocks (CLB)
l Bram Block SelectRAM
l 18 x 18 乘法器 (18-Bit x 18-Bit Multipliers)
l 全局时钟网络 (Global Clock Mux)
l 数字时钟管理模块 (DCM)
l 布线资源 Routing Resources
图表 1 FPGA内部结构
输入/输出模块 Input/Output Blocks (IOB)
IOB 模块两个一组或者4个一组分布在芯片的周边部分,如图表 1所示。
每一个IOB模块都可以用作输入或者输出;两个IOB可以组成一组差分信号(Differential Pair);IOB同交换矩阵(Switch Matrix)相连。
图表 2 IOB 和Switch Matrix
IOB支持的I/O标准
IOB能够支持多种I/O标准,包括:
l LVTTL, LVCMOS (3.3V, 2.5V, 1.8V, and 1.5V)
l PCI-X compatible (133 MHz and 66 MHz) at 3.3V
l PCI compliant (66 MHz and 33 MHz) at 3.3V
l CardBus compliant (33 MHz) at 3.3V
l GTL and GTLP
l HSTL (Class I, II, III, and IV)
l SSTL (3.3V and 2.5V, Class I and II)
l AGP-2X
IOB还能够支持差分信号I/O标准:
l LVDS
l BLVDS (Bus LVDS)
l ULVDS
l LDT
l LVPECL
如图表3所示,在FPGA中,所有的IOB分成8组(Bank),每一边有两组。
一些I/O标准需要外部的参考电压VCCO或者VREF,这些外部电压必须同FPGA引脚相连。每个组(Bank)中都有多个VCCO引脚,在相同的Bank中所有VCCO引脚必须与相同电压连接。电压大小由使用的I/O标准决定。在一个组内部,如果所有I/O标准都使用相同的VCCO,则它们可以兼容。
每一组IOB中,能够使用的时钟网络只有两个,也就是说在每一组中,至多可以同时使用两组不同时钟的输入输出。
图表 3 I/O 组(I/O Bank)
IOB中的逻辑资源
图表 4 IOB模块的逻辑资源
如图表4所示IOB模块中包括6个存储单元(Reg),每个单元即可以配置成为边沿触发的D寄存器(flip-flop,FF),也可以配置能电平触发的锁存器(latch)。
IOB中,每条路径上都有两个寄存器用来进行DDR(double data rate)数据传送,两个寄存器的时钟需要保持反相,可以通过DCM来达到这一点。
图表 5 DDR寄存器
可配置逻辑单元 Configurable Logic Blocks (CLB)
CLB是FPGA中的基本逻辑单元,其结构比较复杂。在Xilinx Virtex Ⅱ系列FPGA中,一个CLB单元由,四个结构类似的Slice模块组成。在FPGA内部,所有CLB单元排列成阵列,并于交换矩阵(Switch Matrix)相连,如图表6所示:
图表 6 Virtex-II 中的CLB 单元
图中,“X1Y1”、“X1Y0”、“X0Y1”、“X0Y0”是Slice在FPGA中的位置编号,在FPGA中每一个Slice都会根据自己的横纵坐标有一个独一无二的编号。
每一个Slice模块中包含2个4输入LUT(Look Up Table,查找表)和2个1bit的存储单元。其中,LUT能够根据设计需要配置成为:组合逻辑、单口RAM、双口RAM、ROM、移位寄存器和多路选通器;存储单元可以配置成为边沿触发的寄存器或者电平触发的锁存器。
图表 7 Slice 的配置方式
LUT
LUT本质上讲就是一个16bit的SRAM(静态随机存储器),4个输入实际上就是SRAM的地址。对于一个4输入得组合逻辑来说,他的结果最多只可能有16种,那么,我们完全可以把所有的16种结果事前全部计算出来,存放在一块16bit的区域中,再将组合逻辑的输入作为SRAM的读取地址,这样我们就可以通过LUT的方式实现了任意4输入的组合逻辑功能。而且,使用这样的实现方法,电路延迟同组合逻辑无关,只取决于SRAM的读写速度。
Distributed SelectRAM Memory
既然LUT本质上就是一小块RAM,那么在实际的设计过程中,我们也可以把LUT配置成为RAM来使用。LUT作为RAM来使用的时候也有两种配置方式:单口RAM和双口RAM。一个LUT配置成为一块16bit x 1的RAM,而双口RAM要多占用一倍的资源,既需要两个LUT才能配置成一块16bit x 1的RAM。图8所示配置成RAM所占用资源的情况,其中“S”代表单口RAM;“D”代表双口RAM。
无论是LUT配置成的单口RAM还是双口RAM都可以通过并联或者串联来增加RAM的数据位宽度和地址位深度(容量)。
图表 8 LUT配置成RAM占用资源情况
通RAM类似,LUT还能够配置能ROM。图表9所示为LUT配置成ROM的情况。
图表 9 配置能ROM的情况
移位寄存器
LUT还有一种非常重要的配置方式是移位寄存器。LUT的输入A[3:0]用来选择移位寄存器输出长度,对于单个LUT构成的移位寄存器来说,最大程度为16bit。移位寄存器即可以配置成固定长度的、静态移位寄存器,也可以配置成动态的移位寄存器。
在每个时钟(CLK)的上升沿,移位寄存器从D(BY)读取一位数据。信号Output作为移位寄存器的输出,输出的位置由A[3:0]的值决定。
移位寄存器有两种工作模式:静态模式和动态模式。
静态模式中,地址A[3:0]都是定值(static value),移位寄存器的长度的范围为1bit到16bit。可以由以下公式确定:
Length = (8*A3) +(4*A2) + (2*A1) + A0 +1
如果输入全部为零,则移位寄存器的长度为1;如果输入全部为1,则移位寄存器长度为16。
在动态模式中,移位寄存器的长度可以根据A[3:0]变化,计算公式同静态模式中相同。
需要注意的是,尽管我们可以动态的配置移位寄存器的长度,但是对于一个LUT来说,它本质上讲还是一个16bit的移位寄存器,一位寄存器的长度仅仅是指出了数据出口的位置。例如,当我们将移位寄存器的长度从12改为8的时候,输出的是第8个数据,但移位寄存器并没有将后面的数据丢掉,如果我们这个时候再把长度设为10还是能够得到正确的数据。
图表 10 为移位寄存器的结构,这里需要指出的是在上面的讨论中都是没有寄存器的情况下,如果移位寄存器包含了寄存器,既输出为Registered Output,则在静态模式下移位寄存器的长度要加1,动态模式下的情况比较复杂,请读者自己分析。
图表 10 移位寄存器
移位寄存器,还可以级联以进行扩展。在FPGA内部,有一条专用联线,用于移位寄存器的级联扩展,既图表6种的“SHIFT”,它将前级移位寄存器的输出同后级移位寄存器的输入相连。在一个CLB单元中至多可以构成一个256bit的移位寄存器。
寄存器/锁存器 (Register/Latch)
Slice中的存储单元即可以配置成边沿触发的寄存器,也可以配置成电平触发锁存器。
寄存器的输入即可以使LUT的输出,也可以是来自交换矩阵(Switch Matrix)的数据。
可以通过设置属性的方式设置寄存器的初值和清零方式,INIT1表示初值为1;INIT0表示初值为0。设定SRHIGH时,在“SR”有效时寄存器值为“1”;设定SRLOW时,在“SR”有效时寄存器值为“0”。
在默认情况下,设定SRHIGH即表示了INIT1;设定SRLOW即表示了INIT0;当然,这两组属性也可以分别独立设置。
每个Slice都可以配置成同步清零或者异步清零。
在图11种,CLK为时钟信号;SR为清零信号;CE为时钟有效信号(Clock Enable);DY、BY、DX、BX都是寄存器的输入。
可以看出,在同一个Slice中的CLK、SR、CE信号都是共用的。
图表 11 寄存器
多路选通器 (Multiplexers)
在图表7中,有两个选通器:MUXF5和MUXFx。其中,MUXF5在每一个slice中都是完全一样的,MUXFx则略有区别,分别对应于MUXF6、MUXF7和MUXF8。区别主要是连线结构不同,如图12所示。
图表 12 MUXF5 和 MUXFx
在每一个Slice中都有一个MUXF5,每一个CLB中有两个MUXF6、一个MUXF7和一个MUXF8,其连接结构如图11。
任何一个LUT都可以构成一个2:1的选通器;
在一个Slice中,可以构成一个4:1的选通器;
在两个Slice中,可以构成一个81的选通器;
在一个CLB中,可以构成一个16:1的选通器;
在两个CLB中,可以构成一个32:1的选通器;
快速进位逻辑(Fast Lookahead Carry Logic)
FPGA内部有专用的进位逻辑,可以对加减法运算速率进行优化,每个CLB单元中有两条独立的进位链。每个Slice中的进位链宽度为2bit。专用进位链和专用的选通器MUXCY还可以用于串联LUT,以实现更复杂的逻辑。
图表 13 快速进位链与算术逻辑
算数逻辑 (Arithmetic Logic)
Slice内部有异或门(XOR)可以实现两位全加器。还有一个专用的与门,可以提高选通器的实现效率。
加法是最常用的逻辑结构,FPGA内部之所以有算数逻辑结构主要是为了对加法的速率和实现进行优化。
三态缓存器 (3-State Buffers)
每一个Slice中都有2个三态缓存器。即图6中的TBUF。
图表 14 利用三态门构建片内总线
如图14所示,可以利用三态缓存器构建片内的总线,实现同一条连线上的双向通信。
BRAM (18 Kbit Block SelectRAM Resources)
Xilinx Virtex Ⅱ中集成了大量18 Kbit Block SelectRAM Resources(以下简称BRAM)。每一块BRAM都是物理上的双口RAM,它有两个独立的时钟和两组独立的控制端口。
每一组端口都包括以下输入:时钟(CLK)、时钟有效(CE,Clock Enable)、写有效(WE,Write Enable)、复位(SSR,Set/Reset)、地址(ADDR,Address),以及数据通路DI(Data In)和DO(Data Out)。
BRAM的工作时同寄存器类似,控制信号,地址信号以及数据输入信号必须要在时钟边沿(一般是上升沿,可以根据需要配置)的建立时间(Set-up Time)内保持有效,BRAM会在这个时钟周期输出结果(读操作)或者写入数据(写操作)。
BRAM的地址位/数据位的配置方式
BRAM支持多种配置方式,可以根据设计需要灵活的改变地址位长度和数据为宽度。
图表 15 BRAM 的配置方式
从图15中可以看出,BRAM可以配置成18Kbit的RAM:2Kx9bit,1Kx18bit和512x36bit;也可以配置成16Kbit的RAM:16Kx1bit,8Kx2bit和4Kx4bit;
之所以支持9bit、18bit、36bit的数据为宽度,是因为,可以使用户在数据中加入校验位(Parity),具体实现校验位的逻辑需要用户在BRAM以外自行构建。
BRAM配置成单口模式
BRAM配置成单口RAM的情况比较简单,所有的信号都是同步信号。图16中的“DIP”、“DOP”分别为数据输入校验位和输出校验位。
图表 16 单口BRAM
BRAM配置成双口模式
BRAM的两组端口可以分别配置,也就是说两组端口可以使用不同的地址位/数据位配置方式。如图17所示:
图表 17 双口BRAM 的配置方式
每一块BRAM都是完全同步的RAM。两组端口和时钟都是完全独立的。
图表 18 双口 BRAM
BRAM的读写操作
BRAM的所有操作都是完全同步的,在时钟的上升沿(或者下降沿,取决于设置)的过程中,如果EN有效,WE信号无效,则输出端口输出地址线上地址所在的数据,这个称作读操作;如果EN信号有效,WE信号也有效则将输入端口的数据写入地址线地址中,这个称作写操作。
在读写操作过程中,根据输出端口输入的不同,可以将BRAM的工作模式分为3种:“WRITE_FIRST”、 “READ_FIRST”和“NO_CHANGE”。
在“WRITE_FIRST” 模式中,写操作的时候,输出端口会将新写入RAM的数据输出。
在“READ_FIRST” 模式中,写操作的时候,输出端口会将原来保存在目标地址的数据输出。
在“NO_CHANGE”模式中,写操作的时候,输出端口会保留原来的输出不变。只有在读操作的过程中输出端口才会变化,换句话说,在这个模式下如果想读取数据,WE信号必须无效。
18 x 18 乘法器 (18-Bit x 18-Bit Multipliers)
FPGA中,为了对定点数乘法进行优化,内置了许多乘法器硬核。
图19中可以看到,乘法器同交换矩阵、BRAM相连。这里需要指出的是,乘法器同BRAM在物理上是紧挨着的,而且两者共用了某些连线,他们可以连在一起共同使用,也可以分别独立使用。如果是分别使用那么BRAM必须配置成数据位宽为18bit的模式,否则将导致错误。这样做的目的是为了对“乘加”运算进行优化。可以提高运行速度和减少使用的资源。
图表 19 乘法器同交换矩阵、BRAM相连
乘法器是一个异步器件,他接受两个18bit的有符号定点数作为输入,输出一个36bit有符号定点数。
图表 20 乘法器模块
全局时钟网络 (Global Clock Mux)
由于FPGA内部大部分器件都是同步器件,所以在FPGA开发过程中不可避免的要使用很多共用时钟的同步器件。当频率较高时,信号在芯片内部的传输时间不能忽略,如果时钟信号到达每个同步器件的时间不同,那么会导致灾难性后果。
为了解决这个问题,FPGA内部有专用的时钟树。时钟信号源连接在树的根部,同步器件连接在树的“树叶”上,这样,通过特定的结构,使同一时钟信号到达所有器件的延时全部一样。
时钟网络可以和专用的时钟输入引脚(也可以用作一般用户自定义引脚)相连,可以和DCM的输出相连,也可以和来自交换局针的其他信号相连。
图表 21 时钟选择器
还有就是千万不要将两个时钟通过一个与门或者或门,这样很可能会产生毛刺,影响系统稳定性,如果要对时钟进行操作,例如切换时钟等,请使用FPGA内部的专用器件“BUFGMUX”。
DCM(Digital Clock Management)
DCM是FPGA内部处理时钟的重要器件,他的左右主要有三个:消除时钟偏斜(Clock De-skew)、频率合成(Frequency Synthesis)和相位调整(Phase Shifting)。
图表 22 DCM
图22中:
l CLKIN DCM的输入时钟信号,可以来自IBUFG、IBUF或者BUFGMUX。
l CLKFB DCM接受到的反馈时钟(原则上必须连接),该反馈信号必须源于CLK0或者CLK2X,并通过IBUFG、IBUF或者BUFGMUX相连。
l RST DCM的复位信号,控制DCM的初始化。
l DSSEN 已经不再使用,请不要在设计中连接。
l PSINCDEC DCM的控制信号,控制输出时钟的相位动态调整方向。当CLKOUT_PHASE_SHIFT=VARIABLE时,该信号有效,否则,该信号接地。
l PSEN 为DCM控制信号,该信号是输出时钟相位调整的使能信号。当CLKOUT_PHASE_SHIFT=VARIABLE时,该信号有效,否则,该信号接地。
l PSCLK DCM的参考时钟信号,该信号是输出时钟动态调整的参考时钟。当CLKOUT_PHASE_SHIFT=VARIABLE时,该信号有效,否则,该信号接地。
l CLK0 DCM的输出时钟信号,与CLKIN无相位偏移。
l CLK90 DCM输出时钟信号,与CLKIN有90°的相差。在high-frequency模式下此信号无效。
l CLK180 DCM输出时钟信号,与CLKIN有180°的相差。
l CLK270 DCM输出时钟信号,与CLKIN有270°的相差。在high-frequency模式下此信号无效。
l CLK2X DCM输出信号,使CLKIN的两倍频信号。在high-frequency模式下此信号无效。
l CLK2X180 DCM输出时钟信号,该时钟信号与CLK2X有180°的相差。
l CLKDV DCM的输出时钟信号,是CLKIN的分频时钟信号。其分频系数由CLKDV_DIVIDE设定。
l CLKFX DCM的输出时钟信号,是CLKIN经过频率综合后的时钟信号。其中CLKFX=M/D*CLKIN,M由CLKFX_MULTIPLY设定,D由CLKFX_DIVIDE设定。
l CLKFX180 DCM输出时钟信号,该时钟信号与CLKFX有180°的相差。
l LOCKED DCM状态信号,用于显示DCM时候锁定CLKIN。DCM的输出时钟信号只有在LOCKED为高时有效。
l STATUS DCM的状态信号,用于显示DCM的工作状态。
l PSDONE DCM的状态信号,用于显示输出时钟相位动态调整是否正常
消除时钟抖动
DCM的核心器件是数字锁相环(DLL,Delay Locked Loop)。它是由一串固定时延的延时器组成,根据网上的相关资料,每一个延时器的时延为30ps,也就是说,DCM所进行的倍频、分频、调相的精度为30ps。
图表 23 DCM反馈连接方法
上文提到过,由于FPGA芯片中信号传输时间不能够忽略,所以在全局时钟缓存中也存在一定时延。根据图23种所示的连接方法,DCM接受BUFG出口的时钟信号作为反馈,通过调整内部串联延时器的个数,当延时器延时时间加上BUFG延时时间等于工作频率整数倍时,DCM就可以保证CLKIN的相位同BUFG出口处的相位完全保持一致,这样就做到了抖动消除。
但需要注意的是,DCM可以消除时钟上升沿位置的抖动,但同时会造成时钟边沿的斜率变小(时钟偏斜),时钟信号变化变得平坦。所以,请尽量避免一个时钟通过多个DCM。
频率综合
DCM具有强大的频率综合能力,可以方便的进行频率转换。
CLK2X输出的是CLKIN的2倍频;CLKDV输出的是CLKIN的分频时钟信号。其分频系数由CLKDV_DIVIDE设定;CLKFX是CLKIN经过频率综合后的时钟信号。其中CLKFX=M/D*CLKIN,M由CLKFX_MULTIPLY设定,D由CLKFX_DIVIDE设定。
其他具体细节信息请参考User Guide。使用时请注意在每种频率下的输入时钟和输出时钟的范围。
相位调整
DCM调相功能也十分强大。
器件本身自带了一些端口可以输出固定相差,1/4、1/2和3/4个周期的相位差。
还可以通过设定属性的方式更为精确的设定相位调整的值,在VARIABLE模式下,甚至可以通过PSINCDEC、PSCLK、PSEN在程序运行中动态的调整相位。
图表 24 使用DCM 调整相位
如果通过设置属性改变相位,将会影响到DCM所有的输出。
调相的精度由输入、输出的时钟频率、DLL时延的最小精度等多方面因素决定。
其他具体细节信息请参考User Guide。
布线资源
布线资源连通FPGA内部所有单元,连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。布线资源的划分:
1)全局性的专用布线资源:以完成器件内部的全局时钟和全局复位/置位的布线;
2)长线资源:用以完成器件Bank间的一些高速信号和时钟信号的布线;
3)短线资源:用来完成基本逻辑单元间的逻辑互连与布线;
4)其他:在逻辑单元内部还有着各种布线资源和专用时钟、复位等控制信号线。
这里的连线其实是位于半导体上方的金属线(我不清楚上面提到的所有连线是不是都是金属线,尤其是短线资源很可能直接是半导体内部的直接互连,但绝大多数连线,尤其是长距离的连接都是金属线)。
图表 25 金属线的互连方式
金属线通过图25的方式进行互连,这样所有的不线资源构成一个庞大的交换矩阵(switch matrix)。能够将片内所有资源连接起来。
当FPGA中设计比较复杂、使用逻辑资源比较多的时候,往往布线资源变成为瓶颈,导致设计难以布局布线(Place and Route,PAR)