FPGA 系列文章
- 如果你想学习有关FPGA的专业术语,可以参考这一篇:FPGA专业术语介绍
一、LUT(查找表)是什么
一句话概括,通过将函数的真值表存放在少量内存单元中来实现组合逻辑电路功能的模块称为LUT。
这里以简单的一个3-LUT(3输入查找表)为例,以下给出其示意图的简化描述:
输入1 ----┐
输入2 ----┼---- 3-LUT ----> 输出
输入3 ----┘
以下是 3-LUT 的真值表:
输入1 | 输入2 | 输入3 | 输出 |
---|---|---|---|
0 | 0 | 0 | INIT |
0 | 0 | 1 | INIT |
0 | 1 | 0 | INIT |
1 | 0 | 0 | INIT |
1 | 1 | 0 | INIT |
1 | 0 | 1 | INIT |
0 | 1 | 1 | INIT |
1 | 1 | 1 | INIT |
即使是再复杂的3位以内输入,1位输出的门电路,都会存在一张真值表,通过修改 3-LUT 的INIT值,3-LUT的真值表可以包含所有3位以内输入,1位输出的门电路的真值表。依此类推,通过修改 X-LUT的INIT值,X-LUT可以表示所有X位以内输入,1位输出的门电路,二者实现的功能是相同的。在 FPGA中,只要逻辑表达式是6位以内输入1位输出,综合后的结果通常都会是一个6-LUT。对于更多位的输入,FPGA会采用级联6-LUT的方式实现,具体方法会在后文叙述。
为什么FPGA会选择使用LUT代替传统门电路实现?
这主要是由于传统门电路存在的一些缺点:
-
传统门电路的复杂度与输入逻辑变量的个数有关。输入逻辑变量的个数越多,逻辑函数的组合和变化就会更多,这会增加电路的复杂度。
-
逻辑门的延迟与传输线的延迟不可避免。复杂的门电路通常包含更多的逻辑门和信号路径,因而延迟较大。将延迟不相同的逻辑电路直接拼接在一起可能会导致电路的时钟频率下降,并引起时序相关问题。
使用LUT不会存在上述的问题,因为LUT本质上是一个RAM。它将输入数据作为RAM的地址,然后通过该地址找到对应的值,将该值作为结果输出。当输入变量为0、0,1时,就会将LUT中地址为0、0,1的存储单元中设定的INIT值输出,依此类推,每一次查找的延迟都是固定的。
除此之外,统一使用LUT的方式还使得FPGA具有灵活性和可重构性等优势。因此,FPGA会选择使用LUT代替传统门电路实现。
为什么大部分的FPGA会选择使用 6-LUT 而非其他LUT?
在决定逻辑块的结构时,除了查找表的输入大小之外,评测所用的面积模型,延迟,制程也是重要的考量因素。20世纪90年代初曾有研究表明,对查找表的输入数量进行架构探索,4输入查找表最为高效。在之前的商用FPGA中,Xilinx公司的Virtex 4和Altera公司的Stratix也都一直使用4输入查找表。
但在2004年,出现了基于CMOS 0.18 μm 1.8V 制程的新的评测结果(这里是论文链接)。论文的评测过程为:先进行晶体管级别的全定制设计,再通过SPICE仿真计算延迟。对 28 种基准电路布局布线后所得的平均数据表明,查找表输入等于5或6时面积和速度方面的性能最好。对于低功耗或资源受限的嵌入式应用,5-LUT是一种合适的选择,但由于 6-LUT 具备更高的逻辑密度,最近的商用 FPGA 都倾向于采用 6-LUT。
这里以论文给出的表格为例,其能形象表明查找表的输入数与面积与延迟的关系:
LUT的其他用途:存储器
上文提到,LUT本质上是一个RAM。当逻辑块实现组合逻辑电路时,查找表中存储的真值表就可以作为小规模的存储器。通常来说,FPGA不可能将所有的查找表都用来实现组合逻辑电路。因此,利用查找表为用户电路实现存储器,既能实现芯片内部的存储功能,又能提高硬件资源使用率。
在Xilinx的FPGA架构中,只有SLICEM的逻辑块里的查找表才能被用作存储器,由查找表构成的存储器称为分布式RAM。分布式RAM能够实现异步访问,但如果使用分布式RAM实现大规模存储器,那么实现逻辑的查找表就会变少。因此,建议仅在需要小规模存储器时使用这种实现方法。
二、MUX(多路选择器)是什么
一句话概括,MUX 是一种从多个输入信号中选择单个输出信号的组合逻辑电路。
在FPGA内部,MUX的实现方式主要有两种,一种是使用LUT实现,另一种是直接使用MUX基本逻辑单元实现,以下是使用6-LUT实现MUX4:1(4输入多路选择器)的方式,它将6个输入分为两组,4个输入(C0,C1,C2,C3)作为输入信号,另外两个输入(S1,S2)作为输入地址:
以下是它的真值表:
输入1(C1) | 输入2(C2) | 输入3(C3) | 输入4(C4) | 地址1(S1) | 地址2(S2) | 输出(z) |
---|---|---|---|---|---|---|
X1 | X2 | X3 | X4 | 0 | 0 | X1 |
X1 | X2 | X3 | X4 | 0 | 1 | X2 |
X1 | X2 | X3 | X4 | 1 | 0 | X3 |
X1 | X2 | X3 | X4 | 1 | 1 | X4 |
当输入信号大于4时,一个6-LUT就不够用了,这时候会用到FPGA内部的MUX基本逻辑单元,具体方法会在后文叙述。
既然MUX可以由LUT表示,那为什么在fpga中保留MUX这个基本逻辑单元呢?
这主要是由于成本问题。MUX在数字电路中的使用频率很高,且MUX基本逻辑单元相较于6-LUT晶体管较少,所以MUX在这方面有着巨大的优势。
在SLICEL中,LUT与MUX的资源分布大概长这样:
这种资源分布所带来的的一大好处就是可以使得整体的结构具有对称性。对称性保证了各个模块之间走线的延迟趋于一致,从而能够避免很多时序上的问题。
三、有关LUT和MUX的一些逻辑电路
6-LUT
6-LUT 是由两个5-LUT和一个MUX2:1构成的,以下是该电路的具体结构,当输出的信号数量为1时,一般会使用O6作为输出信号:
这里由于真值表太大就不贴出来了,但通过修改两个5-LUT的INIT值,最终该电路能实现6-LUT的功能。依此类推,可以通过多个6-LUT与MUX的级联实现X-LUT(X>7),这种级联结构在 FPGA 架构中是很常见的。
有趣的一点是,假设将上面电路的A6置为1,那么该电路和下面的电路等效:
因此, 6-LUT实际上可以实现两个功能:
-
表示所有6位以内输入,1位输出的门电路
-
表示所有5位以内输入,2位输出的门电路
由于第二个功能的存在,在 FPGA中,对逻辑表达式是5位以内输入2位输出的电路进行综合,结果也有可能会是一个6-LUT。
MUX16:1
MUX16:1可以由4个6-LUT和3个MUX2:1构成,以下是该电路的具体结构:
在该电路中,不使用6-LUT代替MUX的原因有二,除了上文提到的成本问题,还有一个原因就是这样做会产生延迟,以下是不使用6-LUT代替MUX(红色)和使用6-LUT代替MUX(蓝色)的走线示意图:
可以看到,使用6-LUT代替MUX后的走线明显要长,这会带来时序问题。实际上,FPGA这样布局的原因也是为了鼓励开发者使用LUT与MUX组合的方式实现高位数的多路选择器。
专用进位逻辑
为了提高算术运算电路的性能,商用FPGA的逻辑块中含有专用的进位电路。虽然只用查找表也可以实现算数运算,但采用专用进位逻辑可以获得更高的集成度和运算速度。
这里以Xilinx公司 FPGA 的专用进位逻辑为例,Xilinx 使用了LUT和MUX组合的方式来实现加法。全加器的加法运算(Sum)使用两个 2 输入 EXOR 组成,而进位输出(Cout)电路由1个EXOR 和MUX组成。之前提到,X-LUT可以表示所有X位以内输入,1位输出的门电路,因此Xilinx公司将前一级的EXOR用查找表代替,并使用后专用电路实现后一级的EXOR和MUX 。依次类推,可以扩展实现多位加法器。
以下是Xilinx公司FPGA进位逻辑的电路图:
以下为电路的真值表:
输入1(ln0) | 输入2(ln1) | 进位(Cin) | 高位输出(Cout) | 低位输出(Sum) |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 0 | 1 |
1 | 0 | 0 | 0 | 1 |
1 | 1 | 0 | 1 | 0 |
1 | 0 | 1 | 1 | 0 |
0 | 1 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 1 |
参考文档
FPGA从入门到精通(2) - LUT
FPGA基础之LUT详解
FPGA从入门到精通(4) - MUX文章来源:https://www.toymoban.com/news/detail-756161.html
《FPGA原理和结构》,天野英晴著文章来源地址https://www.toymoban.com/news/detail-756161.html
到了这里,关于FPGA结构:LUT(查找表)和 MUX(多路选择器)介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!