当前位置: 首页 > article >正文

理解 FPGA 的关键知识点整理

虽说接触和学习 FPGA 有一段时间了,但每次在给人介绍FPGA时,还是不能说得很清楚。因为呢,FPGA还是很有门槛的。所以,针对FPGA的关键知识再学习和整理了一次。供参考,对于FPGA老鸟,直接跳过,如果是初学者,可以看看。

FPGA 做为一个特殊的芯片,为什么存在?原理如何?如何设计和使用FPGA。

1:什么是FPGA?

要理解FPGA,如果连计算机结构都不清楚(比如:冯诺依曼架构,标准指令集),还有数字集成电路设计(组合/时序逻辑,逻辑综合,CMOS电路,时序分析,布局布线,低功耗设计,存储设计,电路测试和验证),这些还是得大致了解一下。

最基础的知识: 乘法是可以通过 加(Add) 和 移位(Shift)来完成,

所以,加法器和移位器是一切运算的基础。这个很重要!!!!!

如上图,是移动运算和加法运算。

那具体我们要运算时,有哪些实现方案呢?这里要注意了,特别是做软件的同学,有两种方案:

一种是硬件方案,一种是软件方案,如何理解?

1.1:运算的软/硬件实现方案

以 4位(二进制)乘以 4位(二进制),我们的实现方案分为软件,硬件实现方案。

对于一个数学运算,我们可以通过软件来实现,比如:CPU

软件的实现方案就是:冯式定理,通过控制器,运算器,内存。控制器确认流程,接受输入,运算时通过内存来缓存中间结果,缓存数据再运算时做数据搬运,最终给出输出。

于是,会有很多搬运的过程。(冯式原理,也就是软件的计算原理,如下)

这种做法,非常符合人的思维习惯,相当于把一个问题拆成多个步骤,按顺序来执行。

另外,软件同学并不熟悉的是:可以通过硬件方式来实现:

上图是四位的乘法。如果我们认为4位的乘法是由多次移位和加法组成的,在软件实现时,可能会把一个乘法变成多次的运算,中间结果用内存来缓存。但是,在上图的硬件实现中,我们直接把运算的过程全部通过硬件一次完成了。当然, 它在往后传递数据,进行运算时,必须要保证同步。而同步实际上是靠其它来保证(这里不细讲了)。但确实,它没有缓存,搬运数据的过程,速度更快。

上图表达了最重要的 组织逻辑,时序逻辑的实现。前者不依赖历史和状态。后者依赖历史和状态有记忆的能力。

硬件可以将运算并行,总是在第一时间拿到结果后,立即进行下一步运算,运算更快。

结论:硬件的实现比软件的能耗比更低。硬件更快,消耗能量更小。

软件有很多高级编程语言来支持,符合人的思考逻辑,开发效率高。

硬件实现较复杂,开发难度大,并且,一旦在硬件上实现,不能修改,生产成本也很高。

1.2:FPGA可以结合软硬件的优势 

那如何结合软件和硬件的优势?

FPGA是其中一种可编程的方式(运行快,可编程)Programable circuit

随着FPGA的工艺提升,芯片的产量越大,消耗越高,高于某个特定量,ASIC的成本会低于FPGA。

1.3:FPGA的特点

当然,FPGA的劣势也很明显:

1:编程难度大。

对于软件,只需要学习简单的指令,做一下编译就OK了。属于指令架构。

对于FPGA的编程,除了要学会电路编程语言verilog以外,还需要学会如何 Synthesis,place,rout,逻辑电路还需要映射到当前FPGA的 Primitive Cell。

2:比 ASIC 更贵一些(10x的面积),

3:比 ASIC 更慢一些。(3x的差距)

以上讲了那么多,关键是讲了FPGA是如何产生的,以及它在芯片行业中的定位。

那FPGA的可编程具体是如何实现的呢?大家都知道是LUTS表和Switch,但具体细节呢?我们来仔细看一下。

2:如何实现Field-Programmable

如何要改上面的运算,一是改逻辑一是改连线

2.1:FPGA实现编程的方式

对于FPGA  的实现方式如下:

通过 内存位(1和0)来控制开关。

逻辑如何实现,可以通过真值表来表达所有逻辑。所以,更改真值表的值,就变更了逻辑。

所以,不管是逻辑还是开关,都是通过 Memory 来完成定制的,所以,我们会发现,在往FPGA上烧录最终的bitstream时,实际上就是一行 1010的数据写入。

对于Memory的实现,有很多种实现方式。但是在实现时,我们会考虑如下几种场景:

* 是否支持多次编程

* 是否非易失。失电后的是否丢失内容

* 是否要采用标准工艺进行生产

* 可扩展性,伸缩性

* 是否可现场编程,不依赖工厂。

2.2:如何选择用于配置的存储

如此,我们一般会选择SRAM的方案:(除了失电会丢失数据,其它都很OK)

SRAM并不是唯一的选择:也有其它选择,可参考下表:

好,基于上面的学习,我们重新再来理解一下FPGA。

好了,如何实现可编程,应该已经讲清楚了。

接下来,就是难点了,硬件是如何实现FPGA的,架构是怎样的?硬件是如何实现的?

3:如何实现FPGA

FPGA内部的逻辑架构如下:

首先看一下 Floorplan:(逻辑单元,输入/输出,DSP,ERAM,

3.1:逻辑单元

针对单个的Logic Block 如下:它由多logic-cell组成,注意,一个logic cell  是由 Luts,carray,register 组成。

做多大的颗粒度,与工艺相关。

3.2:连接方式

看了逻辑单元,再来看连接方式,目标很明确,走通,时序,面积,功耗。

对于连接的架构,有以下几种:

而最常见的连接架构是如下的Mesh方式:横(纵)Routing chanel + Switch Box

对于时钟网络,设计如下:

3.3:FPGA的通常架构

以下的 tile-base 架构是最常见的FPGA架构,如图,就是一种堆积相同逻辑单元的方式。

这是最早的FPGA的一个CLB的结构:

FPGA随着应用场景增加,加入了越来越多的IP,变成了一个平台。

常见的IP如下:

最新,最先进的FPGA是一个非常复杂的SoC。

什么是Scalar Engine,实际上相对于并行/向量运算的普通运算。我们用CPU实现的普通数学运算,我们都可以认为是标量(Scalar,单一数据)运算。相对应的 AI运算一般是并行的向量或者说Tensor运算,会采用DSP或者AIE,

对于FPGA的可适应用性,我们可以理解为它可以在硬件层面重新配置电路,和ARM,DSP,AIE的编程是大不相同的。

这里SoC特别强调了图像处理,神经网络推理这种热门场景,但并不仅限与此。而对于神经网络压缩的在线处理,这个好像很少有人这么使用。

3.4:软件如何建模

软件需要进行建模的元素有:

架构(为了GUI显示,为了Place / Route)

        Logic block:CLB(Xilinx的称呼)

        interconnects:连接方式的建模

        global clocks:全局时钟网络,保证时钟同步。

        Floorplan:整体的布局。

PRAM configuration(为了bitstream的生成):这是指的为了加载FPGA的配置的内存。

Timing delays:为了计算STA

Power data :为了做能耗的分析

Primitive:FPGA中原生的基础元件,为了综合时的Map和综合的处理。

我们在建模时,不可能针对每一个Lut进行单独建模,一定是按照 Tile模块的方式,只对单个Tile进行建模,其它都重复的。

3.5 软硬件如何配合

而软硬件有很强的依赖,两者交互点较多,下面的图列出了一部分关键点:


理解一下上面的图:

3.6:数字/模拟的设计过程

对于模拟电路的整个设计过程,有如下的步骤:

  • DRC:检查设计是否符合工艺规则,确保制造可行性。
  • LVS:验证版图与原理图的一致性,确保电气连接正确。相当于对逻辑图和物理实现进行对比。
  • PEX:提取寄生参数,用于评估电路的实际性能影响。

对于数字电路的设计,有以下步骤:

       

硬件相关的知识大概就了解这么多了,接下来,非常重要的是,芯片生产出来后,如何进行测试?

4:芯片如何测试?

芯片有是就设计,生产,封装测试,三个大步骤。

4.1:MOSFET的架构

下图是一个标准的MOSFET的结构,以及改进的FinFET版本,按FinFET实际生产的一款7nm芯片。

4.2:制造过程

关注一下半导体的制造过程:

1:晶园的准备——先是拉制成硅锭,然后切割成晶园。

2:光刻——这里称为图形转移,就是将电路图转移到晶园上。光刻机使用光源将光通过掩模,将掩膜上的图案通过缩放投影在涂有光刻胶的昌园表面。

3:掺杂——形成源极和漏极。通过注入杂质。形成芯片的基本元件。

4:沉积——形成金属导电层,形成芯片中各个元件之间的导线。形成电路互连结构。

5:蚀刻——把不需要的部分去掉,只保留电路。去除掉不需要的材料。

6:封装——将wafer中的die切出来,切成祼片,加上保护壳,成为集成电路的芯片。经过测试和质量检测,就可以投入市场使用。

4.3:光刻过程

对于光刻过程,有必要重点了解一下:

4.4:芯片的面积约束

芯片不能太大,因为越大,良率越低。如下图。一般最大的面积是 25mm * 25 mm

4.5:芯片的测试

那我们如何判断一颗芯片是OK,可用的?

1:回片测试

        是否和设计的要求一致,需要严格的回片测试。

2:功能测试

        按需要达成的功能进行测试,比如:乘法是否正常。

3:性能测试

        运行时的最高频率。也就是能跑到的最高频率。

4:量产测试

        可能需要对测试的芯片划分等级,因为质量可能不同。如:速率,温度……) 

4.6:测试的方法      

功能测试:主要对开关,导线的联通性做测试。

按照功耗,速度。会对芯片分等级,分箱处理。(用在不同场景,或销售不同价格)

下面是完整的制造测试流程:

1:DFT——基于DFT规则来指导测试的试计

2:Fault Model——定义缺陷模式。

3:测试向量生成——手动生成简单故障,自动生成更复杂的故障模型。

4:形成测试程序——在生产测试中实际运行。

5:测试向量集——需要生成额外向量,处理测试中未检测到的缺陷。

6:客户产品测试——基于客户的应用做测试

7:良率分析——如果存在逃逸,需要分析原因

整个 MFT 框架包含了从测试生成、配置、执行到评估的完整流程。各模块通过数据库和仿真工具的相互配合,确保测试能够覆盖所有潜在故障,验证芯片功能的可靠性。

最终测试完成后确认的芯片,一般的命名规则:

5:FPGA的软件工具

5.1:软件开发流程

和ASIC的区别,会有一个固定的架构(这会影响后续的每一个步骤)

FPGA的EDA软件必须要适配硬件提供的架构,否则,没有用处。

5.2:RTL设计

第一步,仍然是输入RTL设计。

5.3:综合

然后,是将RTL综合成为门级网表。

5.4:Mapping

按照FPGA提供的Primitive,进行Mapping,匹配上FPGA固定的器件。

5.5:Place & Route

然后在FPGA中选择具体的物理元器件,涉及具体的物理位置。

选好位置,开始步线,保证实现原有的逻辑。

5.6:时序分析

布线如果不通,可以重新Place。同时,需要分析时序是否合适。

5.6:功耗分析

另外,需要做功耗分析。

5.7:FPGA设计关键

注意一下,实际上 FPGA 的频率要达到1G,是很难的(因为固定架构,需要更多的走线,时钟本身频率也不高)。但即使这样,运行速度仍然会比CPU要快很多(因为主频并不代表速度,高速更多源于并行运算),并且,频率越高,功耗越大,也是不适合的。

FPGA最大的一个问题:估算连线的时延很难,不是很准确。

我们在设计EDA软件前,一定要明白,在越靠前的地方,出错的成本会越高(这和做任何事情都是一样的)。

6:如何支持客户开发FPGA应用

对于客户,除了芯片,必须用到的是:

* 芯片的参数表

一般会涉及逻辑单元量(LUTS量,FF),Memory,DSP,通讯接口,DDR控制器,封装的引脚……

* 芯片的EDA工具,特别是GUI版本的工具

* 芯片的开发版

6.1:芯片参数表

6.2:EDA工具

客户使用场景最多的就是EDA工具。

在工具中完成仿真,就可以使用开发板,将程序下载到实际芯片,进行测试了。

6.3:如何获得客户

要获得一个FPGA客户,有6个步骤

第一步:做宣传,品牌营销,让客户知道。

第二步:深入介绍产品,让用户了解具体的产品。

第三步:帮助客户做验证,AE介入,评估产品是否适合客户。

第四步:与客户深入互动,解决客户遇到的问题。

第五步:免费试用,指导操作,促成客户购买芯片。

第六步:建立长期合作关系,加深客户的忠诚度。

6.4:如何更好的支持客户

客户可能不会给RTL代码,所以,很可能需要现场进行调试。

6.5:FAE是软件的最重要的客户

对于初创公司,需要尽快的发布产品,获得收入。所以,产品很有可能并不成熟。

所以,FAE可能会面临很多问题。

好了,大概就从这6个方面,重新学习一下FPGA的基础知识。


http://www.kler.cn/a/388370.html

相关文章:

  • 从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化20241112
  • 使用HTML、CSS和JavaScript创建动态圣诞树
  • 项目模块十七:HttpServer模块
  • ODOO学习笔记(1):ODOO的SWOT分析和技术优势是什么?
  • 使用docker-compose单点搭建社区版seafile+onlyoffice在线word编辑平台
  • JMeter基础篇
  • Scala 中 set 的实战应用 :图书管理系统
  • 华为ensp防火墙配置(纯享版)
  • web——[GXYCTF2019]Ping Ping Ping1——过滤和绕过
  • 【日志】力扣58.最后一个单词的长度//14.最长公共前缀//28. 找出字符串中第一个匹配项的下标
  • PHP API的路由设计思路
  • Java基础面试题
  • strerror函数详解
  • JavaScript缓存之Service Worker workbox
  • Library:Day-02
  • qt QPixmapCache详解
  • 解决 Vue3、Vite 和 TypeScript 开发环境下跨域的问题,实现前后端数据传递
  • b4tman / docker-squid 可快速安装运行的、容器型代理服务器 + podman
  • contos7.9 部署3节点 hadoop3.4 集群 非高可用
  • 【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--访问权限中间件
  • 深度学习:NAT Decoder 详解
  • 【GPTs】EmojiAI:轻松生成趣味表情翻译
  • Java进阶嵌套循环:十.冒泡与选择算法排序
  • 命令行工具PowerShell使用体验
  • 【C++】STL中的list容器详解及常用函数用法
  • UOS启动器