FPGA由6部分组成,分别为可编程输入/输出单元、基本可编程逻辑单元、嵌入式块RAM、丰富的布线资源、底层嵌入功能单元和内嵌专用硬核等。
FPGA的基本结构
每个单元简介如下:
1.可编程输入/输出单元(I/O单元)
目前大多数FPGA的I/O单元被设计为可编程模式,即通过软件的灵活配置,可适应不同的电器标准与I/O物理特性;可以调整匹配阻抗特性,上下拉电阻;可以调整输出驱动电流的大小等。
2.基本可编程逻辑单元
FPGA的基本可编程逻辑单元是由查找表(LUT)和寄存器(Register)组成的,查找表完成纯组合逻辑功能。FPGA内部寄存器可配置为带同步/异步复位和置位、时钟使能的触发器,也可以配置成为锁存器。FPGA一般依赖寄存器完成同步时序逻辑设计。一般来说,比较经典的基本可编程单元的配置是一个寄存器加一个查找表,但不同厂商的寄存器和查找表的内部结构有一定的差异,而且寄存器和查找表的组合模式也不同。
学习底层配置单元的LUT和Register比率的一个重要意义在于器件选型和规模估算。由于FPGA内部除了基本可编程逻辑单元外,还有嵌入式的RAM、PLL或者是DLL,专用的Hard IP Core等,这些模块也能等效出一定规模的系统门,所以简单科学的方法是用器件的Register或LUT的数量衡量。
3.嵌入式块RAM
目前大多数FPGA都有内嵌的块RAM。嵌入式块RAM可以配置为单端口RAM、双端口RAM、伪双端口RAM、CAM、FIFO等存储结构。
CAM,即为内容地址存储器。写入CAM的数据会和其内部存储的每一个数据进行比较,并返回与端口数据相同的所有内部数据的地址。简单的说,RAM是一种写地址,读数据的存储单元;CAM与RAM恰恰相反。
除了块RAM,Xilinx和Lattice的FPGA还可以灵活地将LUT配置成RAM、ROM、FIFO等存储结构。
4.丰富的布线资源
布线资源连通FPGA内部所有单元,连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。布线资源的划分:
1)全局性的专用布线资源:以完成器件内部的全局时钟和全局复位/置位的布线;
2)长线资源:用以完成器件Bank间的一些高速信号和一些第二全局时钟信号的布线(这里不懂什么是“第二全局时钟信号”);
3)短线资源:用来完成基本逻辑单元间的逻辑互连与布线;
4)其他:在逻辑单元内部还有着各种布线资源和专用时钟、复位等控制信号线。
由于在设计过程中,往往由布局布线器自动根据输入的逻辑网表的拓扑结构和约束条件选择可用的布线资源连通所用的底层单元模块,所以常常忽略布线资源。其实布线资源的优化与使用和实现结果有直接关系。
5.底层嵌入功能单元
底层嵌入功能单元是指通用程度较高的嵌入式功能模块。如锁相环(Phase Locked Loop,PLL)、DLL(Delay Locked Loop)、DSP(Digital Signal Processing)和CPU等。
6.内嵌专用硬核
与“底层嵌入单元”是有区别的,这里指的硬核主要是那些通用性相对较弱,不是所有FPGA器件都包含硬核。
CycloneⅡ简介
CYCLONEⅡ系列FPGA器件由美国Altera公司出品,属于中端产品。采用了90nm的工艺,增加了片内逻辑单元数。为了方便说明,在此仅选用EP2C5进行分析讲解。
FPGA的命名规则
先了解一下FPGA的命名规则,这样就可以从芯片名字的角度来看这是怎么样性能的一款芯片了。
例如EP2C20F484C6,含义:
EP——工艺,
2C——cyclone2,
20——LE数量约为20K,
F——封装形式,
484——管脚数,
C——温度范围(确定其是工业级,军品级,还是商业级),
6——速度(数字越小速度越快)。
1.逻辑单元与逻辑阵列
逻辑单元(Logic Element,LE)在FPGA器件内部,用于完成用户逻辑的最小单元。一个逻辑阵列包含16个逻辑单元以及一些其他资源, 在一个逻辑阵列内部的16个逻辑单元有更为紧密的联系,可以实现特有的功能。
一个逻辑单元主要由以下部件组成:一个四输入的查询表(LookUp Table,LUT),一个可编程的寄存器,一条进位链,一条寄存器级连链。
查询表: 用于完成用户需要的逻辑功能,CYCLONEⅡ系列的查询表是4输入1输出的,可以完成任意4输入1输出的组合逻辑。
可编程寄存器:可以配置成D触发器,T触发器,JK触发器,SR触发器。每个寄存器包含4个输入信号,数据输入、时钟输入、时钟使能、复位输入。
一个逻辑单元包含3个输出,两个用于驱动行连接、列连接、直接连接,另外一个用于驱动本地互联。 这三个输出是相互独立的。输出信号可以来自于查询表也可以来自于寄存器。
本地互连通路是逻辑阵列的重要组成部分,芯片级设计思路上的考虑与节省我们就不讨论,从实际运用出发,直接看看这个互连通路是干什么用的。本地互连通路提供了一种逻辑阵列内部的连接方式, 逻辑阵列内部还包含一种对外的高速连接通路,称之为直接连接通路。
直接连接通路连接的是相邻的逻辑阵列,或者与逻辑阵列相邻的M4K存储器块、乘法器、锁相环等。
CYCLONEⅡ系列FPGA的逻辑单元有两种工作模式:普通模式和算数模式。
普通模式适合于一般的逻辑运算。算数模式适用于实现加法器、计数器、累加器、比较器等。
逻辑阵列的主体是16个逻辑单元,另外还有一些逻辑阵列内部的控制信号以及互连通路。前面所讲的互联通路和直接连接通路就是逻辑阵列中的部分。
逻辑阵列还包括一些控制信号:两个时钟信号,两个时钟使能信号,两个异步复位信号,一个同步复位信号,一个同步加载信号。
2.内部连接通路
在FPGA内部存在各种连接通路,连接不同的模块,比如逻辑单元之间、逻辑单元与存储器之间。FPGA内部资源是按照行列的形式排列的,所以连接通路也分为行列的。
行连接又分为R4连接、R24连接和直接连接。R4连接就是连接4个逻辑阵列,或者3个逻辑阵列和1个存储块, 或者3个逻辑阵列和1个乘法器。简单地说就是连接4个模块吧。R24就是24个模块。列连接是C4,C16,含义不用说了吧,是连接4个模块和16个模块。
3.时钟资源
CYCLONEⅡ系列FPGA有关时钟资源部分主要包括全局时钟树和锁相环两部分。
全局时钟树又称全局时钟网络,负责把时钟分配到器件内部的各个单元,控制器件内部所有资源。锁相环则可以完成分频、倍频、移项等相关时钟的基本操作。
全局时钟树是一种时钟网络结构,可以为FPGA内部的所有资源提供时钟信号,这些资源包括内部的寄存器、内部的存储器、输入输出管脚寄存器等。
CYCLONEⅡ系列FPGA中每条全局时钟树都对应一个时钟控制模块,时钟控制模块的作用是从多个时钟源种选择一个连接到全局时钟树,进而提供给片内的各种资源。这些时钟源包括锁相环的输出,专用时钟引脚的输入,两用时钟引脚的输入或者内部逻辑。
专用时钟引脚是为时钟输入专门设计的引脚,在有可能的情况下应该尽量将时钟信号连接到专用管脚上。EP2C5有8个专用时钟引脚(CLK),4个位于芯片左侧,4个位于芯片右侧。
两用时钟引脚(DPCLK)通常用于介入时钟或者异步控制信号,EP2C5有8个两用时钟引脚,芯片每一侧两个。CYCLONEⅡ系列FPGA允许对两用时钟引脚的输入延时进行设置,是我们更好地控制时序。
置于CYCLONEⅡ系列FPGA对全局时钟树的使用方式和限制,在此也不一一罗列开来,也要注意的是,时钟的链接也会受到这样或者那样的限制,如果在实际电路的过程中出现了问题,自然也会在编译过程中提示出来的,所以切记不要将所有警告都忽略掉,因为这些警告可能是程序设计中的漏洞,当某种状态浮现的时候会导致程序运行的不稳定。
锁相环在FPGA中除了分频、倍频操作外,还进场用于内部时钟和外部时钟保持沿同步,提供需要的外部时钟输出等。EP2C5包含两个锁相环(PLL1,PLL2)。
锁相环支持单端时钟输入和差分时钟输入。 当采用单端时钟输入的时候CLK0~3作为时钟源提供给锁相环,当采用差分时钟输入的时候,CLK0、CLK1提供给PLL1,CLK2、CLK3提供给PLL2。只有专用的时钟输入引脚的时钟信号才能驱动锁相环。
锁相环最主要的目的是产生一个和外部输入始终保持同步的时钟信号,包括频率同步和相位同步。将锁相环的特性和功能总结一下有:分频倍频、相移、设置占空比、片内外时钟输出、时钟切换、锁定指示、反馈模式、控制信号。
锁相环结构里有PFD,相频鉴别器(Phase Frequency Detector, PFD)。什么是PFD呢,其作用是比较反馈时钟信号同参考时钟信号的相位关系,然后给出控制信号用于调节压控振荡器的产生的时钟频率。锁相环结构里还有两个预分频器和三个后分频器(又称后比例计数器)。
锁定检测部分用于检测当前锁相环的状态,当参考时钟和反馈回来的时钟子信号同步的时候,锁相环进入锁定状态。
完成反馈是锁相环最核心部分,CYCLONEⅡ系列FPGA的锁相环有三种反馈模式。
普通模式:将全局时钟树的时钟信号反馈给相频鉴别器,从而保证内部寄存器的输入时钟与外部输入始终保持相位同步。
零延时模式:锁相环将专用的外部输出时钟引脚的输出时钟反馈给相频鉴别器,从而保证输出时钟引脚上的时钟信号和输入引脚上的时钟是沿对齐的。
无补偿模式:锁相环竟不会对全局时钟树作补偿,也不对外部时钟输出引脚作补偿。这样做的好处是可以简化反馈电路,改善时钟性能。
4.内部存储器
CYCLONEⅡ系列FPGA的内部存储器是以M4K存储器块的形式存在的,每一个存储器块的大小为4608bit。M4K块包括输入/输出寄存器,作用相信大家都知道。还拥有本地互联通路,作用前面讲过了哦。
好的。直接来看端口吧,从端口看作用,了解怎样去控制。
clock——输入——时钟信号
clock_en——输入——时钟使能信号
aclr——输入——异步复位信号
renwe——输入——读写使能信号
byteena——输入——字节使能信号
addressstall——输入——地址锁存信号
address——输入——地址
datain——输入——数据输入
dataout——输出——数据输出
看了这些端口以及端口说明,相信作用就不言而喻了吧,换而言之,当我们想使用内部存储模块的时候,控制好这些端口的数据流就能够使用好这部分的资源了,当然存储器的使用离不开时序的控制,如果没有得到自己想要的结果,极有可能是时序控制部分出了问题。
CYCLONEⅡ系列FPGA中的M4K存储器可以被配置成以下模式:
单口模式:存储器不能同时进行读写操作。
简单双口模式:支持同时对存储器进行读写操作,读端口和写端口可以位宽不同,如果对同一地址进行读写,则输出端数据为改地址更新前的数据。
完全双口模式:两个端口可以任意组合,同时为写端口,同时为读端口,或者一个为写端口一个为读端口。存储器位宽不能为32或36。潜在威胁,如果两端口同时向一个地址写入数据的时候,会导致该地址中的数据出现不可预知的状况。
移位寄存器模式:节约用逻辑单元中构建寄存器而消耗。利用时钟下降沿写入数据,时钟上升沿读出数据,配置好该模式后是自动完成的哦。
只读存储器模式:存储器的内容通过存储器初始化文件(.mif)指定。
FIFO模式:用于数据的缓冲、多路数据的对齐、变换时钟域等。
5.乘法器
在数字信号处理运算中,主要包括滤波、快速傅里叶变换、离散余弦变换等。在写运算常常会涉及到大量的乘法运算,所以在FPGA中设计了嵌入的乘法器,专门用在这方面的信号处理。如果使用逻辑单元来搭建乘法器,会消耗不少逻辑单元并且会抑制运算速度的提高。
嵌入的乘法器包含有可选的输入/输出寄存器。寄存器的使用会提高电路性能但是会产生延时。乘法模块还包括两个控制信号,signa和signb来控制乘数A和乘数B是否有符号。另外一个乘法器还可以拆开成两个并行的乘法器,例如EP2C5有1个18bit*18bit的乘法器,可以作为两个9bit*9bit的乘法器使用,但是需要注意的是,符号控制信号就一对,所以要求两个乘法器在相同位置的数据输入必须同时为符号数或者无符号数。
6.输入/输出引脚
在学习这一节之前我一直很迷惑,为什么FPGA会分成多个bank,每一个bank之间好像是独立的又好像有联系。看书之后才明白每一组bank都有单独的供电电源,所以我们在使用的时候可以根据要求,为不同的组提供不同的电压,从而实现在不同输入/输出组内使用不同的输入/输出标准。
在输入/输出引脚和FPGA内部逻辑单元之间存在输入/输出单元(IOE),每个输入输出单元包含1个输出缓冲和3个寄存器。3个寄存器分别用于锁存输入数据、输出数据、和输出数据使能信号。
由于FPGA常常会用于做信号的匹配,所以涉及到输入/输出单元的知识点也不少,在此也就简单罗列一下。
一个输入/输出组可以同时支持单端标准个差分标准,只要器需要的VCCIO相同。
若干个输入/输出单元构成一个输入/输出模块位于芯片的外围。输入/输出模块可以提供两组输出信号,io_datain0和io_datain1。输入/输出模块的输入信号由两部分构成:一部分有行引脚时钟或列引脚时钟提供,另一部分由逻辑阵列提供。
一个输入/输出单元有8个输入信号,这些信号从逻辑阵列以及行引脚时钟传送来的信号中产生。输入/输出单元中的3个寄存器被分为两组,数据输入寄存器为一组,数据输出寄存器和输出使能寄存器为另一组,有各自的时钟和时钟使能信号。
输入/输出单元中的输出缓冲支持调节引脚的驱动电流。可设置输出缓冲的电压转换速度。输出缓冲可设置为开漏输出模式。输入输出单元包含总线保持电路。包含一个可选的上拉电阻。
CYCLONEⅡ系列FPGA还有片内终端串接电阻,可以用来匹配传输线的特性阻抗。终端电阻的使用可以防止传输线上的信号反射,保持信号的完整性。在使用片内的终端串接电阻的时候,不能设置输入输出引脚的驱动电流。