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

相关文章

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循