【FPGA】LUT如何实现组合逻辑、时序逻辑

FPGA是如何利用LUT实现组合逻辑功能的-电子工程专辑

FPGA的基本可编程逻辑单元一般都采用了基于SRAM的查找表结构,查找表(LUT,Look Up Table)一般为四输入,用于完成组合逻辑功能

小容量的ROM?把输入当做地址信号,对LUT里面预存的内容进行寻址

本质上就是一个RAM。它把数据事先(很重要,由分析综合工具完成)写入RAM后,每当输入一个信号就等于输入一个地址进行查表,找出地址对应的内容,然后输出。

输入的信号 <====> 输入的地址 ===> 输出结果

下图是四输入查找表的基本结构,核心元件是二选一多路选择器,四个输入通过控制二选一多路选择器的状态实现所需结果的输出

例如

实现A&B&C&D

(1)求解真值表

|----|----|----|----|----|
| AB | 00 | 01 | 10 | 11 |
| CD | 00 | 01 | 10 | 11 |
| 00 | 0 | 0 | 0 | 0 |
| 01 | 0 | 0 | 0 | 0 |
| 10 | 0 | 0 | 0 | 0 |
| 11 | 0 | 0 | 0 | 1 |

(2)数据下载

在代码下载的过程中,真值表中的数据会下载至LUT对应的SRAM中

(3)数据输出

在代码运行的过程中,四个输入通过控制二选一多路选择器的选通状态来输出不同的数据

4输入查找表,包含4个输入端口I[3:0],包含一个输出端口O,还包含存储初始值的16个DFF触发器

四个输入信号I(4级选择器),构成的输入值一共有16种情况。每个输入值对应一个DFF,提前把值对应的输出值初始化在DFF内,这就构建了一张16*1的表格。根据输入值,选择某个DFF输出到O端,从而实现相应的逻辑功能

举例:I[3:0]=4'b0101

复制代码
LUT4 #(
.INIT(16'h0000)
)LUT4_inst(
.O(O),
.I0(I0),
.I1(I1),
.I2(I2),
.I3(I3)
);

O=I[3]&I[2]&I[1]&I[0];

复制代码
LUT4 #(
.INIT(16'h8000)
)LUT4_inst(
.O(O),
.I0(I0),
.I1(I1),
.I2(I2),
.I3(I3)
);

6输入查找表内部结构

LUT是如何实现千万种逻辑结构的_lut电路-CSDN博客

C=A+B

该电路实现了两个1位输入A和B的加法功能(C = A + B)。输出Q是一个2位二进制数,表示加法的和(即Q的十进制值等于A + B)。电路使用两个查找表(LUT):

  • LUT1 初始化为4'h6(二进制4'b0110),地址输入由{B, A}组成(B为高位,A为低位)。

  • LUT2 初始化为4'h8(二进制4'b1000),地址输入由{A, B}组成(A为高位,B为低位)。

    输出Q定义为:Q[1] = LUT2的输出,Q[0] = LUT1的输出。

| 输入 B | 输出 Q (二进制) | 输出 Q (十进制) | 解释 (A + B) |
|------|------------|------------|------------|-----------|
| 0 | 0 | 00 | 0 | 0 + 0 = 0 |
| 0 | 1 | 01 | 1 | 0 + 1 = 1 |
| 1 | 0 | 01 | 1 | 1 + 0 = 1 |
| 1 | 1 | 10 | 2 | 1 + 1 = 2 |

  • 当 A=0, B=0:LUT1 地址={B,A}=00=0,输出位0=0(4'h6=0110,位0=0);LUT2 地址={A,B}=00=0,输出位0=0(4'h8=1000,位0=0)。因此 Q = {LUT2输出, LUT1输出} = {0, 0} = 00。

  • 当 A=0, B=1:LUT1 地址={B,A}=10=2,输出位2=1(4'h6=0110,位2=1);LUT2 地址={A,B}=01=1,输出位1=0(4'h8=1000,位1=0)。因此 Q = {0, 1} = 01。

  • 当 A=1, B=0:LUT1 地址={B,A}=01=1,输出位1=1(4'h6=0110,位1=1);LUT2 地址={A,B}=10=2,输出位2=0(4'h8=1000,位2=0)。因此 Q = {0, 1} = 01。

  • 当 A=1, B=1:LUT1 地址={B,A}=11=3,输出位3=0(4'h6=0110,位3=0);LUT2 地址={A,B}=11=3,输出位3=1(4'h8=1000,位3=1)。因此 Q = {1, 0} = 10。

查找表1被初始化为4'h6(3'b110),查找表2被初始化为4'h8(3'b1000)

A=0,B=0

2个查找表输入的地址都为0,因此第1个查找表输出4'h6(3'b110)第0位0,第2个查找表输出4'h8(3'b1000)第0位0,Q的值为2'b00;==> 0 + 0 = 0

A=1,B=0

第1个查找表输入的地址为1,第2个查找表输入的地址为2,因此第1个查找表输出4'h6(3'b110)第1位1,第二个查找表输出'h8(3'b1000)第2位0,因此Q的值为2'b01 = 1; ==> 1 + 0 = 1

A=0,B=1

第1个查找表输入的地址为2,第2个查找表输入的地址为1,因此第1个查找表输出4'h6(3'b110)第2位1,第二个查找表输出'h8(3'b1000)第1位0,因此Q的值为2'b01 = 1; ==> 0 + 1 = 1

A=1,B=1

两个查找表输入的地址都为3,两个因此第一个查找表输出4'h6(3'b0110)第3位0,第二个查找表输出'h8(3'b1000)第3位1,因此Q的值为2'b10 = 2。 ==> 1 + 1 = 2

CLB作为FPGA里的最小逻辑单元

CLB是由2个slice构成

7系列FPGA的slice包含4个部分:

(1)逻辑功能产生器,也就是咱们常说的查找表,1个slice里包含4个6输入的查找表。

(2)存储单元,也就是常说的触发器,1个slice里包含8个触发器。每4个触发器为一组,可配置成D触发器或锁存器。

(3)多路复用器,也就是1位宽的数据选择器,数量非常多,足够使用。

(4)进位逻辑,它与本列的上下slice的进位逻辑相连,实现数据运算时的进位操作。

相关推荐
思尔芯S2C13 小时前
Cost-Effective and Scalable: A Smarter Choice for RISC-V Development
fpga开发·risc-v·soc设计·prototyping
Runner.DUT16 小时前
RapidIO/SRIO 入门之什么是SRIO
fpga开发
xduryan19 小时前
1 - 视频处理IP核之Video In to AXI4-Stream
fpga开发·音视频
cjie22119 小时前
Tang Prime 20K板OV5640例程
fpga开发
嵌入式-老费20 小时前
再谈fpga开发(不能转成verilog的c语言特性)
fpga开发
Alaso_shuang1 天前
verilog的学习
学习·fpga开发·数字逻辑·数字电路
文火冰糖的硅基工坊2 天前
[硬件电路-124]:模拟电路 - 信号处理电路 - 测量系统的前端电路详解
前端·嵌入式硬件·fpga开发·架构·信号处理·电路
文火冰糖的硅基工坊2 天前
[硬件电路-112]:模拟电路 - 信号处理电路 - 二极管的应用 - 峰值检测电路与波形展示
嵌入式硬件·fpga开发·信号处理·电路
XMAIPC_Robot2 天前
基于STM32+FPGA工业打印机运动控制卡的核心解决方案
stm32·嵌入式硬件·fpga开发
ChipCamp3 天前
Chisel芯片开发入门系列 -- 14. CPU芯片开发和解释4(Load/Store指令再探)
arm开发·青少年编程·fpga开发·scala·dsp开发·risc-v·chisel