从底层结构开始学习FPGA(2)----LUT查找表

article/2025/9/16 23:54:23

文章目录

        系列目录与传送门

        一、概述

        二、实现原理


系列目录与传送门

        《从底层结构开始学习FPGA》目录与传送门


一、概述

        记得刚接触FPGA的时候,总能看见类似这样的一句话----FPGA是基于查找表LUT的可编程逻辑器件。FPGA常常被人比作“数字积木”,就是因为底层资源的丰富和灵活,要做任何“玩具”(项目要实现的功能,也可以说是电路),只需要设计好“图纸”(RTL),即可使用积木(FPGA丰富的底层逻辑资源,如LUT、FF、MUX等等)来实现。

        在最底层,可配置逻辑模块有着两种最基本的部件:触发器和查找表(LUT)。这很重要,因为各种FPGA家族之所以各不相同,就是因为触发器和查找表组合的方式不同。LUT查找表可以算其中相当重要的一个底层资源,通常用来实现所需的组合逻辑功能。而FF触发器则一般用来实现时序逻辑功能。

        在7系列器件之前的器件多使用LUT4,即4输入LUT;而7系列后则多使用LUT6,即6输入LUT。

二、实现原理

        LUT(look up table),即查找表,其原理其实也就是一个一个查找表,根据输入去找到相应位置的信号,然后做输出。说白了就好像一个小容量的ROM,把输入当作地址信号,对LUT里面预存的内容进行寻址。

        7系列的FPGA的LUT有6个输入端口(I0~I5),然后有两个输出端口(O5,O6),如下所示:

        6个输入端口一共有2^6 = 64种输入,所以可以将一个LUT6视为一个容量为64的ROM,其中存储的是64种不同的逻辑运算的结果,而不同的输入则组成了ROM的地址线。所以逻辑运算的实现实际上就是对LUT6的一个译码过程。

        假设有这样一个逻辑: y = a0 & a1 & a2 & a3 & a4 & a5。

        这个例子比较简单,其只在所有输入均为1的情况下输出才为1,其他情况输出均为0。将其写成Verilog的形式:

module test(input	a0,input	a1,input	a2,input	a3,input	a4,input	a5,output 	y
);assign y = a0 & a1 & a2 & a3 & a4 & a5;endmodule

        用Vivado analysis一下,看看分析出来的门级电路是什么样子的:

        很显然,就是5个与门实现6输入相与的功能。如果FPGA中没有LUT这种结构,而是由不同的逻辑门组成,那么实现上述逻辑功能则最终会映射到5个与门。可是随着设计的复杂化,仅仅使用与门显然是无法满足设计需求的,我们还需要其他逻辑门,如或门、非门、异或门等。当然这些逻辑门都可以由数个与非门或者或非门实现,但是这无疑需要进行一个译码过程以及会造成资源的浪费。

        而LUT将所有可能的逻辑值均存起来,用的时候再查表就方便多了。我们不需要知道这个电路会映射成什么样的、多少个逻辑门,我们只需要根据输入直接查表找对应的输出就行了。这大大提高了灵活性以及资源的利用效率。

        此外,采用传统逻辑门电路实现逻辑关系的方法也存在一些严重的缺点:

  • 输入变量从通过逻辑电路到输出变量,存在一定的延迟,该延迟的大小和逻辑电路的复杂程度密切相关。逻辑电路越复杂,延迟越大,因此,延迟是不确定的;
  • 延时的倒数是频率,频率和时序电路的工作速率密切相关。因为延迟不确定,所以频率也不确定,这将严重影响整个电路的工作性能;
  • 逻辑电路的复杂程度和输入逻辑变量的个数、逻辑门的个数有关。因此输入逻辑变量越多,逻辑电路就越复杂。

        说回正题,我们把上述代码再综合(synthesis)一下,看看最终的电路实现是什么样子的:

        和料想的一样,就是综合出来一个LUT6。

        下图是LUT6的源语形式(也可以说是网表形式),其中的INIT例化的值即是载入的64个输入的对应值。

        我们把上述代码的网表文件导出来看看(我只截取了LUT6部分):

        注意INIT的值,64bit中只有最高位为1,其他63位为0。也就是说,只有当6输入均为1时输出才为1,其他输入情况下输出均为0。与料想的逻辑值一致,也就是说INIT载入的是要查表的值,也就是要写入LUT这个小ROM的初始值。

        再把上述代码再实现(implementation)一下,看看映射到FPGA芯片的具体实现是什么样子:

        很简单,就是6个输入+1个输出+1个LUT6,LUT6的结构与理论一致。注意:LUT6中的O5输出并没有使用。


       

        再看下LUT6的结构:

        其实1个LUT6是由2个LUT5 + 1个MUX组成的。2个LUT5共用5个输入,其中一个LUT5的输出直接连接到O5;同时该输出也连接到MUX,另一个LUT5的输出也连接到MUX,而输入I5则作为MUX的选择控制信号。

  • 当LUT6作为6输入查找表使用时,则其中一个LUT5存放I5为1时的结果,而另一个LUT5则存放I5为0时的结果,此时O5输出不使用。而O6输出则通过I5的控制来实现6输入的查找结果
  • 当LUT6作为2个5输入查找表使用时,则将I5固定为1,则其中一个LUT5实现逻辑功能y1,并固定通过MUX到O6输出,而另一个LU5则实现逻辑功能y2,并直接通过O5输出

        

        举例如下:

                逻辑 y1 = a0 & a1 & a2 & a3 & a4;

                逻辑 y2 = a0 | a1 | a2 | a3 | a4;

        Verilog如下:

module test(input	a0,input	a1,input	a2,input	a3,input	a4,output 	y1,output 	y2);assign y1 = a0 & a1 & a2 & a3 & a4 ;assign y2 = a0 | a1 | a2 | a3 | a4 ;endmodule

        vivado综合的电路:

        结果是2个LUT5,但是我们知道7系列的FPGA是没有独立的LUT5这玩意儿的,所以最终映射到具体芯片上还不是这样子。

        最后来看看vivado实现的电路(映射到FPGA芯片的具体实现):

        和预想的一样,就是一个2输出的LUT6。

        其他位数输入的逻辑实现就可以采用多个LUT6级联来实现,当输入位数过多,即组合逻辑复杂时,则会造成级联的LUT6过多,即逻辑级数多大,其结果是通常会造成组合逻辑延时多大,导致时序紧张,一般采用插入FF的方法来切割组合逻辑,使得每一段的逻辑级数都不过于长,从而优化时序。

        一句话总结:LUT的逻辑实现是通过将期望结果存入SRAM中,通过不同的输入等于不同地址这一索引方式,来实现对逻辑真值表的查找。


http://chatgpt.dhexx.cn/article/ZkuTTrrg.shtml

相关文章

码,主码,主属性,非主属性,平凡函数依赖,完全依赖等词解释

码:代表数目的符号 主码 我们在建立数据库的时候,需要为每张表指定一个主码,主码也叫主键。 所谓主码就是在实体集中区分不同实体的候选码。 一个实体集中只能有一个主码,但可以有多个候选码。 必须注意两点: 1.主…

SpringBoot项目打jar后执行jar包提示:xx没有主属性清单 解决

SpringBoot项目打jar包后执行jar包提示:xx没有主属性清单 解决 今天在练习SpringBoot项目打jar包部署的时间遇见了一个问题:jar中没有主属性清单,对此也是比较疑惑,在百度之后找到了解决方式 主属性清单是jar包中MANIFEST.MF文件中…

【图示化】SQL Server概念:超键(码)、候选键(候选码)、主键(主码)、主属性与非主属性、外键

关系模型概念 字段属性名,每一行就是一条记录一个元组,每个单元格就是一个分量, 主键,外键 主码主键主关键字 超键(码),候选键 码超键 超键 (唯一的,可多余) …

候选码、主码、全码、外码、主属性、主键、主关键字、非主属性

一、讲解 首先说明 键字码字,所以 主键主码主关键字,候选键候选码候选关键字… 所谓关系键,指的是一个表中的一个(或一组)属性,用来标识该表的每一行或与另一个表产生联系。 话不多说,上图&a…

软考系列之候选码,主码,主属性,非主属性详讲

候选码,主码,主属性,非主属性详讲 文章目录 目录 文章目录 前言 一、候选码,主码,属性,非主属性的定义 二、具体题目 三、补充 前言 软考刷题,遇到这系列的题目,对我来讲&#xff0…

数据库中主键、主码、主属性、关键字、候选关键字、码的区别

码是数据库系统中的基本概念,所谓码就是能唯一标识实体的属性,它是整个实体集的性质,而不是单个实体的性质。它包括超码、候选码和主码。 (1)超码是一个或多个属性的集合,这些属性可以让我们在一个实体集中…

函数依赖 主码 主属性 非主属性 候选键 超键 详解

最近做项目要搞数据库看到范式那一节头脑发晕,概念都忘了,于是从网上搜罗并整理一下; 函数依赖部分参考:https://blog.csdn.net/jsj13263690918/article/details/79796275 主码:主关键字(主键,…

c语言memset详解

目录 1 函数声明1.1功能1.2 例子 2 常见错误2.1 搞反了 ch 和 n 的位置.2.2 过度使用memset2.3 3 特殊例子 1 函数声明 void *memset(void *s, char ch, unsigned n);1.1功能 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值。块的大小由第三个参数指定,作…

【Java基础知识 9】序列化与反序列化

🍅 Java学习路线:搬砖工逆袭Java架构师 🍅 简介:Java领域优质创作者🏆、CSDN哪吒公众号作者✌ 、Java架构师奋斗者💪 🍅 扫描主页左侧二维码,加入群聊,一起学习、一起进步 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 面试官:兄弟,说说你对transient的理解和感悟 …

详解序列化与反序列化

一、什么是序列化与反序列化 序列化时将对象状态转换为可保持或传输的形式的过程。序列化的补集是反序列化,反序列化是将流转换为对象。两个过程一起保证能够存储和传输数据。 .NET具有以下三种序列化技术: 1.二进制序列化 保持类型保真,这…

为什么要序列化?序列化你知道哪些?

凡事都要问为什么,在讲解序列化概念和原理前,我们先来了解一下为什么需要序列化。 为什么要序列化? 如果光看定义我想你很难一下子理解序列化的意义,那么我们可以从另一个角度来感受一下什么是序列化。 都玩过游戏么&#xff1…

说说什么是序列化,如何实现序列化

分析&回答 序列化机制 序列化机制(包括序列化和反序列化)的本质是用流将对象读到内存和写入外存。序列化机制的意义就是将对象脱离程序运行独立存在。通过网路或跨平台传输对象,传递的参数与返回值都实现序列化机制。实现序列化需要实现…

java序列化详解

一、序列化与反序列化 序列化:指堆内存中的java对象数据,通过某种方式把对存储到磁盘文件中,或者传递给其他网络节点(网络传输)。这个过程称为序列化,通常是指将数据结构或对象转化成二进制的过程。 即将对…

序列化和反序列化的底层实现原理是什么?

序列化和反序列化作为Java里一个较为基础的知识点,大家心里也有那么几句要说的,但我相信很多小伙伴掌握的也就是那么几句而已,如果再深究问一下Java如何实现序列化和反序列化的,就可能不知所措了!遥记当年也被问了这一…

序列化和反序列化

我以前确实对序列化,乃至现在也是不是很熟悉,有时候查找资料,但依旧懵懵懂懂,不过还好遇到一个博主,确定写的挺好的,链接会放再底部 废话不多说,先看官网定义: 序列化 (Serializat…

我把序列化玩成了这样,吊锤了一波面试官

我们都知道,新建一个对象的时候实现 Serializeable 接口,但为什么要这么做?什么时候这样子做?这样子做会不会出现幺蛾子?阿粉一个三连差点把自己都问懵逼了…… 那接下来,大家就和阿粉一起简单了解一下这个…

什么是序列化? 如何实现(反)序列化 序列化的应用

1. 什么是序列化与反序列化,什么情况需要序列化1.1 序列化序列化是什么序列化的目的什么情况需要序列化 1.2 反序列化反序列化是什么反序列化的目的 2. Java中的序列化与反序列化2.1 如何实现序列化Java序列化的规定序列化的API实现(反)序列化的示例对象在硬盘上的存…

1.传输线驻波比

Transmission Line & Active Voltage Standing Wave Ratio 1.1 信号完整性概述 数字电路的出现极大地提高了电子产品的抗干扰能力,随着电路的工作频率不断提高,这种抗干扰能力逐渐显得有些“力不从心”。特别是在高速电路的范畴,“理想互…

驻波比,功率计原理,短波机驻波测量

文章内容转载自http://bbs.cqcqcq.com/thread-1627-1-1.html 衡量功率反射大小的量称为「反射系数」,常用Γ (音 gamma) 或ρ (音 rho) 表示。为了讨论简单起见,我们假设负载阻抗为纯阻性的。反射系数定义为: ρ (反射电压波) / (入射电压波)…

入射波反射波和驻波的特性推导

入射波反射波和驻波的基本推导 学习雷达过程中,发现阻抗匹配是一道迈不过去的坎,而阻抗匹配、能量传输与电压驻波比又有千丝万缕的联系,而电压驻波比则与反射波、入射波等相关的特性有关,于是写下此文章记录一下推导过程。 懒得正…