FPGA原理与结构(2)——查找表LUT(Look_Up_Table)

2023-12-14 13:10

本文主要是介绍FPGA原理与结构(2)——查找表LUT(Look_Up_Table),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列文章目录:FPGA原理与结构(0)——目录与传送门

目录

一、查找表(LUT)概述

二、LUT的性能权衡

1、面积效率

2、速度问题

3、权衡结果

 三、LUT的组成与应用

1、LUT的组成        

2、LUT的应用

3、LUT应用拓展

 本文参考xilinx官方手册ug474:ug474

一、查找表(LUT)概述

        LUT是CLB的重要组成部分,是FPGA中的重要资源,人们经常会说FPGA是基于查找表的可编程逻辑器件。其实所谓FPGA,也就是由最基本的三个要素构成的:(1)实现逻辑电路所需要的可编程逻辑要素(2)提供对外接口的可编程输入/输出要素(3)连接以上两种要素的可编程布线要素。然后在此基础上再嵌入其他硬件电路模块,如DSP,嵌入式内存,时钟所用的PLL/DLL,包括如今火热的嵌入式芯片构成soc等。LUT在FPGA中就是上述第一个要素(实现逻辑电路)的核心参与者。

        数电是学习FPGA的基础,数电又可以分成组合逻辑电路和时序逻辑电路。组合逻辑的前提是布尔逻辑,在电路上的体现就是逻辑门,理论上我们可以用逻辑门来实现任意的组合逻辑。而在FPGA中,我们就用LUT来取代了逻辑门的作用。我们把逻辑门构成的组合逻辑电路抽象成一个黑盒电路,现在我们知道了它所有的输入情况对应的输出(真值表),需要用一个器件来代替这个电路。对电路原件熟悉的人应该不难意识到,我们可以用一个存储器件来实现,把所有的输入作为存储器件的地址,把输出存储在对应的地址中,就完美取代了上述的电路功能。这就是我们的LUT,所以可以说LUT的本质就是一个RAM(可读可写,也有的是不可写的,相当于ROM)。

        但是我们为什么要进行这样的替换呢,使用逻辑门一样能实现相应的功能,也更加符合大家学习数电时最初的认知。设想一下如果FPGA里面不是LUT而是各式各样的门电路,那么即便我们在器件做了很多门,却有可能,导致最终的利用率十分的低下。因为在实际应用情况不确定的情况下,我们根本不可能知道用与门,或门,非门还是别的门单元,也不可能不知道会有多少位的输入,多少位的输出。最终将导致器件规模巨大,不具有灵活性。但是使用LUT就恰恰相反,LUT可以用来替代各种门,以及它们的结合,因此用LUT作为FPGA的基本单元可以确保更多的LUT可以用上,来达到提高利用率的目的。同时对于门级电路来说,彼此之间的连线也会使得EDA工具产生大的负担。可以说是LUT的应用,才使得FPGA有别于传统的可编程逻辑器件,逐渐成为如今时代的主流。

        我们在vivado中编写一个简单的组合逻辑来测试LUT的功能。

module logic((*IO_BUFFER_TYPE="NONE"*) input din1,(*IO_BUFFER_TYPE="NONE"*) input din2,(*IO_BUFFER_TYPE="NONE"*) input din3,(*IO_BUFFER_TYPE="NONE"*) input din4,(*IO_BUFFER_TYPE="NONE"*) input din5,(*IO_BUFFER_TYPE="NONE"*) input din6,(*IO_BUFFER_TYPE="NONE"*) output dout);assign dout = din1 & din2 & din3 & din4 & din5 & din6;endmodule

得到的综合结果如下:

        可以看到这里的综合结果就是使用了一个LUT6(6输入的LUT)来实现了我们的逻辑功能。LUT中对应的INIT值也就是我们的真值表对应的值,输出逻辑与我们的设计一致,下为真值表(不全)。

       也可以从LUT的verilog原语来理解,INIT就是对应的真值表的值,O为输出,其他信号为对应的输入:

   // LUT6: 6-input Look-Up Table with general output//       Artix-7// Xilinx HDL Language Template, version 2018.3LUT6 #(.INIT(64'h0000000000000000)  // Specify LUT Contents) LUT6_inst (.O(O),   // LUT general output.I0(I0), // LUT input.I1(I1), // LUT input.I2(I2), // LUT input.I3(I3), // LUT input.I4(I4), // LUT input.I5(I5)  // LUT input);// End of LUT6_inst instantiation

二、LUT的性能权衡

        在如今的主流FPGA中,基本采用的都是6输入的LUT,为什么不是7输入或者5输入(其实是可配置实现的)呢,这是由于性能权衡方面的考虑。这部分内容的学习对于我们FPGA应用者来说作用并不大,不感兴趣的读者可以直接跳过。

        在早期FPGA的逻辑块结构中有些只包含查找表,但是大部分的逻辑块的基本元素都包含BLE(Basic Logic Element,基本逻辑单元),如下图:

           BLE由实现组合逻辑的LUT,实现时序逻辑的触发器FF以及数据选择器构成。数据选择器在存储单元M0的控制下决定直接是输出查找表的值还是输出FF中存储的值。     

         在确定逻辑块的结构的时候,存在面积效率,速度等相关的权衡。

1、面积效率

        面积效率用来衡量FPGA上实现的电路是否充分利用了逻辑块资源。在考虑面积效率时,需要对以下两点进行权衡:

        (1)如果增加每个逻辑块的功能,就可以以更少的逻辑块实现电路。

        (2)但逻辑块自身的面积和输入/输出数量会变大,所以可重复逻辑模块的面积就增大了。 

        对于逻辑块的功能影响最大的就是LUT的大小了。因为k输入的查找表(k-LUT)可以实现任意k输入的函数,较大的LUT有利于减少逻辑块的使用,但是,k-LUT需要2^{k}个配置存储单元,因此逻辑块自身的面积就会增大。并且增加逻辑块的输入/输出引脚会导致布线面积增大,因此每个可重复逻辑模块的面积就增大。而FPGA的总面积是通过“逻辑块数*单位可重复逻辑模块面积”计算的,因此查找表的大小与面积效率之间存在权衡关系。简单说就是你不能期望一个模块既具有强大的功能又有着小巧的面积,必须在两者之间找到一个平衡。    

2、速度问题

        速度上也受到以下两个方面的影响:

        (1)如果增加每个逻辑块的功能,所实现的电路的逻辑深度(logic depth)就更小。

        (2)但同时也会增加逻辑块自身的内部延迟。

        逻辑深度是指通过关键路径的逻辑块数量,它在FPGA设计过程环节中的技术映射(technology mapping)过程中决定。降低逻辑深度可以有效减少布线,从而提高电路速度。但是,增加逻辑块功能的同时就会增加内部的延迟,那么降低逻辑深度的效果就会大大折扣。所以查找表的大小与速度也存在权衡关系。简单说就是你不能期望外部延迟小的情况下,内部延迟也小。

3、权衡结果

        对于性能测试来说,除了产品本身的性能情况以外,评测的标准不同也会导致结果的不同。20世纪90年代,曾有研究对查找表的输入数量进行架构探索,结论表明4输出查找表最为高效。事实上在商用FPGA中,xilinx公司的Virtex 4和Altera 公司的Stratix 之前一直都使用4-LUT。

        文献:E.Ahmed,J.Rose.The Effect of LUT and Cluster Size on Deep-Submicron FPGA Performance and Density.IEEE Trans.  Very Large Scale Integration(VLSI) Systems,2014,12(3)

基于CMOS 0.18um 1.8V制造对FPGA架构进行了评测。结果表明,查找表输入数等于5或者6时面积和速度方面的性能最好。因此,最近的商用FPGA倾向于采用6-LUT。

 三、LUT的组成与应用

1、LUT的组成        

        xilinx公司的7系类FPGA中使用的是6-LUT,每个LUT有六个独立的输入(A1-A6),两个独立的输出(O5-O6)。一个Slice中的四个LUT分别以A,B,C,D编号。从组成结构来说,一个6-LUT由两个5-LUT组成和一个数据选择器组成。

2、LUT的应用

这样的一个6-LUT可以被配置为:

        (1)一个任意6输入的布尔逻辑函数

        (2)两个任意5输入的布尔逻辑函数(需要这两个函数共享输入,即输入相同)

        (3)两个任意3或2或更少输入的布尔逻辑函数

        当具有6个输入时:使用I0-I5作为输入,使用O6作为输出(O5不使用)。

        当具有\leqslant5个输入时:使用I0-I4作为输入,使用O5,O6作为输出,I5拉高(强制O6代表上面一个5-LUT的结果)。

        通过LUT的传播延迟与所实现的函数无关。

3、LUT应用拓展

        单个的6-LUT有时候还是不能满足设计者的应用需求,所以LUT之间的拓展就至关重要:

        我们主要观察图中的MUXF7和MUXF8。除了基本的lut外,slice还包含三个多路选择器(F7AMUX、F7BMUX和F8MUX)。这些多路选择器用于组合4个函数生成器,以提供任何slice中7或8个输入的任何函数。

        F7AMUX: 用于从LUT A和B生成7个输入函数
        F7BMUX: 用于从LUT C和D生成7个输入函数
        F8MUX: 用于组合所有LUT生成8个输入函数。
        具有八个以上输入的函数可以使用多个slice来实现。在CLB中,slice之间没有直接连接以形成大于8个输入的函数生成器。 

         但是级联的LUT越多,潜在的组合逻辑时延就越严重,对于系统时延的要求就越苛刻,一般采用寄存器来同步后再将结果输出,以确保输出结果正确。

这篇关于FPGA原理与结构(2)——查找表LUT(Look_Up_Table)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/492644

相关文章

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

hdu4407容斥原理

题意: 有一个元素为 1~n 的数列{An},有2种操作(1000次): 1、求某段区间 [a,b] 中与 p 互质的数的和。 2、将数列中某个位置元素的值改变。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

hdu4059容斥原理

求1-n中与n互质的数的4次方之和 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWrit

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

Unity3D自带Mouse Look鼠标视角代码解析。

Unity3D自带Mouse Look鼠标视角代码解析。 代码块 代码块语法遵循标准markdown代码,例如: using UnityEngine;using System.Collections;/// MouseLook rotates the transform based on the mouse delta./// Minimum and Maximum values can

TL-Tomcat中长连接的底层源码原理实现

长连接:浏览器告诉tomcat不要将请求关掉。  如果不是长连接,tomcat响应后会告诉浏览器把这个连接关掉。    tomcat中有一个缓冲区  如果发送大批量数据后 又不处理  那么会堆积缓冲区 后面的请求会越来越慢。