FPGA中的基础逻辑单元--Altera
Altera FPGA的组成部分
Altera公司的FPGA基础组成部分有这些:
- Logic Array Block (LAB)逻辑阵列方块
- Adaptive Logic Module (ALM)可编程逻辑单元
- Digital Signal Processing (DSP)数字信号处理器
- 嵌入式硬核
- Routing布线
- 时钟系统
- I/O接口
- Embedded Memory Blocks嵌入式存储模块
如果打开Quartus的chip planner,可以看到FPGA内部的资源分布,深 {MOD}表示该资源被使用,颜 {MOD}越深利用率越高。中间大部分蓝 {MOD}是LAB,绿 {MOD}是BRAM,深棕 {MOD}是DSP,中间黑 {MOD}是内嵌的ARM处理器Cortex A9,左右黑 {MOD}中的浅棕 {MOD}是PLL和IO接口。
我以Arria 10系列为例子来介绍,和其他系列可能有一些出入,对于其他系列,可以对照着看相应的handbook手册
参考链接:
Arria 10 handbook.
Logic Array Block (LAB)逻辑阵列方块
LAB是其他更基础模块的集合,对应是Xilinx公司FPGA里的Configurable Logic Block (CLB)可编程逻辑块。一个LAB包括控制驱动器和10个ALM可编程逻辑单元的集合,另外有大约四分之一的LAB可以被设置成memory LAB(MLAB)存储型逻辑阵列方块,根据具体型号不同,有可能会有更高比例。
MLAB
每个MLAB可支持做多10×26=640bits的RAM,它把原本用作储存6输入LUT结果的寄存器作为存储器来用。相对于块存储器BRAM,MLAB更浅而宽,而且在FPGA内部分布广,更适合用来存储一些量不大的数据,比如配置用的参数,或者用来作为小型的shift register移位寄存器。
但是MLAB的宽度和深度是有一定限制的,宽×深可以是16×32,18×32,20×32,8×64,9×64或者10×64。就算你只调用了其中一点,也相当于调用了一整个MLAB。当然对于小型project无所谓,但做大型project时候就要注意利用率了。我计算过MLAB用来替代深度4以上的shift register移位寄存器时比起普通的register寄存器利用率高了很多
ALM可编程逻辑单元
也有把这部分叫做Logic Elements (LE)逻辑单元的,这个名称一般出现在比较老的型号里。这个单元包括1组look-up table (LUT)查找表,2个D register寄存器,2个adder加法器和一些其他布线,是A家FPGA的最重要组成部分。处理了几乎所有与或非位移逻辑,普通加减法和普通乘除法(普通的意思是不用DSP)
详情可以参考这个链接:
ALM architecture.
下面的图片很好的显示了ALM的基本组成
LUT查找表
查找表顾名思义就是根据k个二进制输入,利用2选1多路复用器MUX来查找相应的2k个结果中相应的那一个来输出,因此LUT中一般都有个小的RAM存储单元来存着这2k个输出项(k不会太大),这样查找表就可以实现所有的k输入逻辑。下面是一张4输入LUT的内部结构示意图
扩展一下,5输入的LUT就相当于两个4输入LUT并在一起后面加个2选1MUX,6输入的LUT就相当于两个5输入LUT并在一起。在实际实现中很适合集成在一起。实现方式就像下面这张图
在ALM中的LUT可以当作一个6输入来用,也可以当作2个4输入,或者是一个3输入加一个5输入来用。实际上还有些比较奇怪的用法,比如一个5输入加一个4输入,其中一个输入是共享的,或者2个5输入,其中两个输入是共享的。具体可以看上面链接里的第2页。
这么一来有一个问题,那就是5输入比4输入多了一个MUX,而6输入比4输入多两个MUX,延迟比小LUT要高。另外,6输入LUT用了4个LUT,如果把6输入LUT拆成2个4输入LUT来用(只有8个外界输入接口),就相当于浪费了另外2个4输入LUT。在利用率和延时两方面做了一些平衡后,Altera的处理方案是,以6输入LUT为主,在需要的时候拆分成小LUT用。
可以说FPGA的可编程性基本来源于这里。看起来眼花缭乱,但大多数不需要你自己手动配置,编译器会帮你自动配置相应的模式。
Adder加法器
回到这张图可以看到,可配置的8位输入到LUT中会有2位输出,分别可以进入两个1位全加器,当然也可以绕过加法器,直接进入之后的寄存器或者直接出去。
加法器的carry链可以让多个ALM中的加法器连接形成一个完整的n位加法器。然而和DSP不同,这条数据链可能会因为一个LAB内的ALM被分配完而布线跑到比较远的地方去,这样对于时钟问题很不利,因此在时钟比较高,而且加法位数高的时候宁可把DSP当作加法器用,也不要用普通加号。
Register寄存器
ALM中有两个D型寄存器,就是在时钟的上升沿时将输入的信号锁定在其中。
还是上面的那张图,可以看出寄存器的输入可以来自加法器或LUT,第一个寄存器的输入可以来自其他ALM,第二个寄存器的输入可以来自第一个寄存器;寄存器的输出可以是2位输出,第一个寄存器可以输出到第二个寄存器,第二个寄存器可以输出到下一个ALM。
寄存器是阻塞式命令的实现方式,这种布线也方便了shift register移位寄存器的实现。
Embedded Memory Blocks嵌入式存储模块
在我介绍的Arria 10系列中有两种嵌入式存储模块,M20K和MLAB。MLAB在之前已经有所介绍,M20K顾名思义有20kb的存储空间,又被称为BRAM,是FPGA中的存储主担当,比起MLAB的640bit显然高了很多。
以GX 160为例,有440个M20K,共8800kb的空间,1680个MLAB,共1050kb的空间,由此可见M20K数目不如MLAB多,窄而深,适合存储大量不常用数据。
另外M20K的控制信号比MLAB多,可以有双输入输出模式和校验位之类的。
两者都适合用作RAM随机存储器,ROM只读存储器,FIFO先入先出队列和shift register移位寄存器
Digital Signal Processing (DSP)数字信号处理器
虽说ALM可编程逻辑模块可以处理所有的数字逻辑,包括加法和乘法,但对于高位加法来说会有低效和低时钟的问题,乘法更是要浪费大量的LUT查找表,因此内嵌的DSP模块就承担了这部分任务
下面这张图是Altera内嵌DSP的基本结构
除了输入输出之外,它包含输入缓冲寄存器,内置参数存储器,两个pre-adder前加法器,两个multiplier乘法器,1个post-adder后加法器,1个accumulator累加器和一个输出缓冲寄存器。
缓冲寄存器有利于改善时钟布线条件,提高时钟频率,前加法器、乘法器、后加法器和累加器可以实现一系列运算,如
R=X0×(Y0+Z0)+X1×(Y1+Z1)+R.
Altera的DSP对于复数运算做了优化,如此实部和虚部的运算相加相减可以在同一个DSP内完成,但它最大的优势也是其最大的劣势。在不需要复数运算的时候,尤其是建立多通道滤波器的时候,两个乘法器并列的设计让它缺乏灵活性,导致设计复杂度增加。
Clock Network时钟系统
时钟是数字逻辑的心脏,没有时钟什么都做不了,FPGA提供了多种途径获取时钟,有High-Speed Serial Interface (HSSI)高速差分接口的时钟输入,普通单输入时钟,普通查分输入时钟,并在内部提供Phase-Locked Loop (PLL)锁相环用来调节时钟频率,和Delay-Locked Loop (DLL)锁相环用来调节时钟相位。其中fPLL用来处理来自HSSI的时钟,I/O PLL用来处理普通输入端口的时钟,两种针对不同的时钟环境。
PLL和DLL的概念就不介绍了,不然整个篇幅太大,简单说数字逻辑无法调节相位和提高始终频率,以及非整数倍降低频率,因此对时钟的操控只能借助analog模拟电路。
PLL可以级联,不过只能级联2个,不然时钟的质量会太差。
时钟网络包含global clock (GCLK)全局时钟、regional clock (RCLK)局域时钟、periphery clock (PCLK)外围时钟等,覆盖不同的领域。例如全局时钟覆盖了整个芯片,来保证所有逻辑处于同一时域中,而局域时钟顾名思义只在特定区域统一。
I/O接口
不同的I/O接口对应不同的电压和速度,常见的有Low Voltage Complementary Metal Oxide Semiconductor (LVCMOS),Stub Series Terminated Logic (SSTL),High-Speed Transceiver Logic (HSTL)高速收发逻辑,Low-Voltage Differential Signaling (LVDS)低压差分信号等,在这里不做详细的介绍了,有机会开一篇专门的吧
Routing布线
Altera内部布线如下所示,基本上是这类井字形的布线,在交汇处有开关连接,而中间的LAB可以从这些布线交换数据