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

相关文章

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长