DSP

FPGA中的基础逻辑单元--Altera

2019-07-13 18:14发布

FPGA中的基础逻辑单元--Altera

Altera FPGA的组成部分

Altera公司的FPGA基础组成部分有这些:
  1. Logic Array Block (LAB)逻辑阵列方块
  2. Adaptive Logic Module (ALM)可编程逻辑单元
  3. Digital Signal Processing (DSP)数字信号处理器
  4. 嵌入式硬核
  5. Routing布线
  6. 时钟系统
  7. I/O接口
  8. Embedded Memory Blocks嵌入式存储模块
chip planner
如果打开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的基本组成
ALM可编程逻辑单元

LUT查找表

查找表顾名思义就是根据k个二进制输入,利用2选1多路复用器MUX来查找相应的2k个结果中相应的那一个来输出,因此LUT中一般都有个小的RAM存储单元来存着这2k个输出项(k不会太大),这样查找表就可以实现所有的k输入逻辑。下面是一张4输入LUT的内部结构示意图 4输入LUT
扩展一下,5输入的LUT就相当于两个4输入LUT并在一起后面加个2选1MUX,6输入的LUT就相当于两个5输入LUT并在一起。在实际实现中很适合集成在一起。实现方式就像下面这张图
6输入LUT 在ALM中的LUT可以当作一个6输入来用,也可以当作2个4输入,或者是一个3输入加一个5输入来用。实际上还有些比较奇怪的用法,比如一个5输入加一个4输入,其中一个输入是共享的,或者2个5输入,其中两个输入是共享的。具体可以看上面链接里的第2页。
LUT选项 这么一来有一个问题,那就是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位全加器,当然也可以绕过加法器,直接进入之后的寄存器或者直接出去。
ALM可编程逻辑单元
加法器的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. R= X_0 imes(Y_0+Z_0)+X_1 imes(Y_1+Z_1)+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用来处理普通输入端口的时钟,两种针对不同的时钟环境。
fPLL PLL和DLL的概念就不介绍了,不然整个篇幅太大,简单说数字逻辑无法调节相位和提高始终频率,以及非整数倍降低频率,因此对时钟的操控只能借助analog模拟电路。 PLL可以级联,不过只能级联2个,不然时钟的质量会太差。 时钟网络包含global clock (GCLK)全局时钟、regional clock (RCLK)局域时钟、periphery clock (PCLK)外围时钟等,覆盖不同的领域。例如全局时钟覆盖了整个芯片,来保证所有逻辑处于同一时域中,而局域时钟顾名思义只在特定区域统一。
global clock

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可以从这些布线交换数据
Routing