写在前面:在差不多2年前,提起京微雅格绝大多数人没听说过,现如今呢,可能听说过他的人第一标签就是FPGA。虽然这已经是了不起的进步了,但是依然还有些遗漏,因为我们不仅仅提供FPGA,我们还提供基于FPGA技术的可编程SoC。与前一篇文章末尾备注,以金山系列产品为例,我们不光有纯的P系列,还有整合了SRAM的R系列和整合了SRAM+MCU的C系列。

所以,既然表明了姿态要学习,那么第一章就从M5的可编程逻辑模块(PLB)开始。

CME的FPGA架构由5块组成,分别是PLB(可编程逻辑模块,Programmable Logic Block)、IOB(输入/输出模块)、EMB(嵌入式存储器模块)、DSP和PLL(锁相回路或锁相环,Phase Locked Loop),其中PLB是FPGA技术的基本逻辑块,由LE和Xbar组成。其结构如下图示。一个LE包括4个互联的LP(Logic Parcel,逻辑包),LE的逻辑资源用于实现时序和组合逻辑功能,Xbar可路由和传递各基本模块之间的信号。LE包含4个LP 和跳级进位电路以及寄存器控制电路从而实现众多复杂的功能,例如级联,进位和跳级进位,寄存器移位。

PLB 结构示意图
PLB 结构示意图

PLB在FPGA的开发中按照行R和列C的方式进行排序。数字后的字母“C”表示某列中的每个PLB
位置,从左至右递增。数字后的字母“R”表示某行中的每个PLB位置,从底部开始递增。

PLB排序方式
PLB排序方式

如上介绍,LP又是组成PLB的最基础单元,每个LP由3个4输入LUT(Look-Up Table,查找表)功能发生器lut0,lut40 和 lut41、2个寄存器reg0 和 reg1组成和进位,级联和算术逻辑组成。

LP原理图
LP原理图

由布尔代数理论可知,对于一个N输入的逻辑运算,不管是与或非还是异或等运算,最多只可能存在2N种结果。所以事先将可能的结果存放与存储单元之中就相当于实现了与非门电路的功能。FPGA的原理就是如此,他通过预先烧写文件去配置查找表内容,从而在相同的电路情况下实现不同的逻辑功能。

LUT的本质就是一个RAM,目前FPGA中多使用4输入LUT,所以每一个LUT可以被看做是有4条地址线的RAM。当用户通过原理图或者HDL语言描述一个逻辑电路后,FPGA开发软件会自动计算逻辑电路的所有可能结果,并把真值表(结果)事先写入RAM中。这样每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容并输出即可。

下面图标给出了一个4与门电路的例子来说明LUT实现逻辑功能的原理。

从该图可以看出,LUT可以实现和逻辑电路相同的功能。实际上,LUT可以实现更快的运算速率和更多的运算规模。

所以,综上所示,LUT的实现的功能由输入决定而不是电路复杂度,LUT结果的生成会有一定的寻址延迟。

LP中的3个LUT都包含4个逻辑输入(f0-f3)和一个单输出(d)。一个LUT可执行任意四变量的逻辑操作。如需执行多个输入功能,可级联某个或邻近LUT的LP。

寄存器是一种可编程的D型触发器。在寄存器的D输入端口有两级复用器。第一级复用器用于选择LUT组合输出或旁路信号byp[x]。第二级复用器用于选择第一级复用器的输出信号byp[x] 或移位信号。移位信号来自相邻相关的上/下寄存器的输出qx。寄存器输出qx有三种可能的通路:

  • 直接驱动互连线
  • 反馈至LUT输入
  • 级联至相邻相关的上/下寄存器的移位信号

进位链是垂直链路,从下到上以LP为单位依次进位。进位链与专用算术逻辑电路支持快速和有效的数学运算,例如:加法器,计数器,乘法器,宽逻辑运算等相关功能。软件综合工具能够自动利用这些进位链和逻辑电路实现算术运算,同时进位链和逻辑电路也可实现通用逻辑像简单布尔运算。


级联电路可分为垂直和水平两个级联路径,。垂直方向上相邻下方的LP的级联输入到LUT0,LUT0与
LUT40输出级联信号到上方的LP,多个LP可左右或上下依次级联实现多于4输入的逻辑功能。

后记:学到这里就会发现,其实各家FPGA厂商的硬件构架都比较雷同。如赛灵思FPGA是基本逻辑模块称为CLB,大致内容也大差不差。