如何快速掌握FPGA?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何快速掌握FPGA?相关的知识,希望对你有一定的参考价值。
参考技术A 任何一个硬件工程师对FPGA都不会陌生,就好比C语言对于软件工程师来说是必修课程一样,只要是电子相关专业的学生,都要学习可编程逻辑这门课程。 FPGA的英文全称是Field Programmable Gate Array,即现场可编程门阵列,它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物。从表象看,Programmable这个单词确实能够很好的描述FPGA的特点,但这也使得很多初学者走了不少弯路。一说到编程,大家不免联想到 coding,因为软件编程的思想对工程师来说已经是根深蒂固了。因此,很多初学者都会问一个相同的问题,两种硬件编程语言VHDL和Verilog,应该学哪个?即使明确了要学习哪种设计语言,也会一头扎进浩瀚的语法中,走向歧途。有些初学者写了大量的代码,在Demo板上跑了n个试验,可还是觉得不懂 FPGA,甚至搞不清楚它和单片机的区别。这是为什么?其实,这都归结一个原因,就是被“可编程”这3个字给迷惑了,也就是说,没有弄清楚FPGA的本质是什么。因此,对于FPGA的学习也就不着法门,事倍功半,浪费了不少时间,却仍然达不到效果。
FPGA是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。因此,从底层来看,FPGA还是属于集成电路的范畴。就当前的技术而言,使用FPGA开发项目还是全部基于数字电路设计的,所以,FPGA的“可编程”也就是实现不同的数字电路逻辑。这与所谓的软件编程有着本质的区别!归根结底,FPGA设计就是电路设计,因此,对于每个FPGA工程师来说,在做设计时必须在脑中有电路的模样,这很重要!那么,到底该如何有效地学习FPGA呢?其实,很简单,只要从以下7点着手,循序渐进,日积月累,就完全能够对FPGA设计游刃有余。
1. 首先,必须了解FPGA的结构和性能。不同厂家,不同系列的FPGA芯片都有不同的结构和性能,但是万变不离其中。刚开始,从掌握几款典型的高端芯片开始,例如Altera公司的Stratix III和Xilinx公司的Virtex 5。之后,再去了解其它系列的芯片就很容易了。至于Lattice和Actel公司的芯片,当使用时再了解也不迟,因为学习主流的东西才会更加有效!许多有关FPGA的教科书都会以几款常用的芯片为例,讲述FPGA的基本结构和原理。初学者看了后,总觉得过于抽象,有点不知所云的感觉。因此,为了深刻理解 FPGA,必须要有扎实的数字电路基础!在数字电路里,最基本的就是逻辑和时序。工程师必须明白FPGA内部逻辑结构和数字电路基本电路结构的关系。例如,任何4个输入信号的组合逻辑都可以通过FPGA提供的4输入LUT来实现。如果使用Xilinx的芯片,移位寄存器既可以通过多个触发器级联实现,也可以通过LUT来实现。通常,初学者可以设计出正确的逻辑,但却很容易忽略时序。在I/O口的设计中,与时序相关的缺陷对于产品是致命的,会影响产品的可靠性。因此,在掌握了结构后,还必须关注芯片的一些重要时序参数,例如I/O口时钟的建立时间、保持时间和从触发器到输出的延迟时间,以及芯片内部工作时钟的最高频率等等。只有充分掌握了所使用芯片的结构和性能,才能设计出一个合理的系统,才能保证FPGA的设计可靠稳定。FPGA厂商提供的大量文档是一个不错的学习资料。
2. FPGA既然是“可编程”,自然离不开编程语言。其实,早期的工程师大多使用原理图输入方式进行逻辑设计,这是一种更接近于电路设计的设计方式。这种设计方式对设计者要求较高,而且也不利于移植和维护,因此VHDL和Verilog才渐渐流行起来。这两种语言,无所谓孰优孰劣,只不过Verilog发展的比VHDL好,而且和将来可能一统天下的SystemVerilog比较接轨。它们都是硬件描述语言。既然叫硬件描述语言,自然是和软件世界里的编程不一样,所以,初学者不能把它当作软件编程语言来学习,否则就会舍本逐末。如果仅仅只是从事FPGA逻辑设计和做简单的功能仿真,只需学习最简单的语法就够了。那些用于写验证脚本的语法,完全不用学,基本用不上。语言仅仅只是一个工具,尤其在硬件设计里,代码写得漂不漂亮,并不重要,最关键的是设计思想。记住,FPGA工程师是在设计电路,而不是在“编程”!
3. 很多工程师会谈到算法的重要性,认为必须懂得很多算法。没错,好的算法对于设计来说犹如利器一般。可是,研究算法和如何实现算法是两个不同的概念,研究算法是在做数学题,实现算法才是工程师的职责。这里并不是说FPGA工程师不用去研究算法,而是强调职责所在。不同的算法,我们对其原理的研究和理解的要求也是不同的。例如8B/10B编码,只要你懂得在哪里需要使用它就够了,现成的IP Core可以直接调用。但是,诸如FEC编解码这样的算法,则只有了解了基本原理后才可能懂得如何实现。对于算法,FPGA工程师的重点就是在于“如何实现”!。另外,算法之外,逻辑设计里常用的设计方法必须懂得,例如,乒乓操作、流水线设计和分时复用等等。还有常用的逻辑模块,如异步FIFO、状态机,这些其实都是数字电路里最基础的东西,但是对于初学者来说,在做FPGA设计时未必会正确的使用。
4. FPGA设计必须有一个好的设计流程来支撑。代码写完后,花大量时间做完善的功能仿真和验证是很有必要的。可是一些工程师并不重视仿真和验证,而是迫不及待的上板调试。碰到BUG后就在代码上修修补补,运气好的话,BUG表面上是解决了,可真正深层次的原因却未必发现,给产品留下了隐患。一个好的设计流程要求大多数BUG在前期工作中必须解决掉,功能仿真和验证则是一个很有效也很重要的步骤。除了仿真验证,综合和布线也必须重视,这要求我们必须仔细浏览编译报告和时序报告,因为,许多时序问题都能通过报告反映出来。有时候,一些工程师碰到时序问题,仅仅做时钟反相来调整数据和时钟的相位关系,或者修改综合和布线的参数,仍无法解决问题。尤其是在用了高速时钟的设计里,大多数情况,我们只有修改代码里的逻辑才能满足设计的时序要求。这些也只有仔细分析了报告后,才能对症下药。另外,对于大多数同步逻辑设计来说,时序仿真是没有必要的,这一步完全可以省略。
5. 现阶段,FPGA发展的三大方向就是SOC,高速I/O和DSP。在有限的时间里,选择一个领域进行主攻是有必要的,只有明确了目标,才会更加投入。 SOC设计要求设计者对软件编程、CPU原理甚至是操作系统比较了解才行,因为SOC就是一个软硬件结合的系统。高速I/O设计则要求设计者掌握许多模拟电路的基本知识以及一些常用的通信协议,例如,SDH、GbE、PCI-E等等。FPGA在DSP领域的使用是近几年兴起的一个发展方向。FPGA由于其内在的并行特性,能以很高的效率实现DSP算法中计算量较大的模块,非常适合视频和图像处理等对DSP性能要求越来越高的新兴应用,设计者需要掌握数字信号处理常用算法。这3个方向完全不同,切勿囫囵吞枣,一切通吃!“术业有专功”,资深的高级工程师也很难在多个方向都取得成就。当然,若能在一个领域有较深的研究,同时,对另外两个领域也有一定的了解,那就更好了。
6. 一个优秀的FPGA工程师,必须做到“一专多能”。所谓的“一专”当然是指在FPGA设计领域的专业深度,而“多能”则是要求工程师对其它专业领域也要有所了解和掌握。例如,对于设计一个SOC系统来说,C语言就必须学习,否则对于片上系统的架构就可能不合理。另外,对于设计高速I/O口的工程师来说,电路板原理设计和PCB设计则需要有所了解。只有掌握了预加重、均衡以及阻抗匹配等这些与模拟电路相关的概念,才可能在设计和调试中得心应手。
7. 最后一点,也是最难的一点,这也是迈向高级工程师的关键,就是FPGA的设计需要一个好的系统架构方案和合理的模块化分。这有助于FPGA的调试和维护,也便于多人共同开发,尤其是在使用大规模FPGA时,这也就是常说的Top-Down设计方式。把一个庞大的、复杂的设计化分成若干个小模块,而且层次要分明,不能扁平化,这需要设计者对设计必须有全面深刻的理解。一个杂乱无序的设计对于后期的维护是灾难性的,尤其是对于接手者来说,若要修改某个逻辑,可以说是苦不堪言。从这一点看,初学者的问题都可以在这里找到答案。FPGA学什么?就是学习系统级的电路设计。所以,FPGA工程师的发展方向就是系统工程师。
以上7点若能有深刻理解,则就能看清FPGA的本质了。市场的瞬息变化,要求电子产品必须对市场具有高敏感性,产品从方案设计到市场投放的时间越来越短,FPGA在其中功不可没。另外,在面对Cost Down时,FPGA也起着不可或缺的作用。在当今时代,FPGA已经在通信、数据处理、网络、仪器、工业控制、军事和航空航天等众多领域得到了广泛应用。随着功耗和成本的进一步降低,FPGA还将进入更多的应用领域,相信FPGA工程师也必将会有一个更加广阔的施展空间。
推荐一本书《基于VHDL的FPGA开发快速入门·技巧·实例》
加油吧!
[从零开始学习FPGA编程-5]:快速入门篇 - FPGA工作原理(从硬件资源整合的角度看FPGA编程)
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/124722606
目录
第3章 FPGA的内部结构-高度抽象化的资源--(Xilinx FPGA为例)
第1章 什么是FPGA
FPGA是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
与传统模式的芯片设计进行对比,FPGA 芯片除了用于研究以及设计芯片之外,它一个重要的作用是借助特定的芯片模型对较多业务领域的产品进行性能优化设计。
FPGA的中文意思是:现场-可编程-门-阵列,我们先解读这个中文的字面意思:
(1)现场:
- 第一层意思是:指芯片的功能并不是芯片厂家出厂前预先固化的,而是芯片的使用者自己根据需要重新编程和定制的。
- 第二层意思是:芯片的功能,不仅仅是芯片使用者可以定制,而且其功能,也可以通过下载FPGA的软件,在设备的硬件电路连接成功后,到了用户的现场,也可以重新编程。这是“现场”的含义,现场是相对于芯片厂家的工厂和设备厂家的工厂而言,是指用户“现场”,设备“现场”。
(2)可编程
通过JTAG、AS、PS等方式,可以现场对器件进行编程,以实现各种不同的定制功能;
而ASIC芯片,在芯片出厂前是可以编程的,这个过程称为芯片设计,而芯片出厂后,硬件的功能 就无法编程了。
而通用CPU只能实现软件编程,而不能改变硬件的连线与功能,无法实现硬件电路的编程。
(3)门
这里讲了FPGA内部资源的组成是由“门电路组成”。
实现基本逻辑关系的电子电路称为“门”电路。
最基本的逻辑关系是:与、或、非,因此,最基本的门就是:与门、或门、非门;
也就是说,FPGA内部是通过“基本的门”电路进行堆叠和定制化完成的。
(4)阵列
将实现基本逻辑关系的“基本的门”电路按照阵列(矩阵)的形式排布,就形成了门阵列;
这里讲的是FPGA内部组织基本的门电路的方式。如果把不同基本逻辑功能的“门”比成不同兵种的单个士兵的话,FPGA的门阵列即是一个大规模的混合兵种的军队,如下图所示:
而对FPGA编程,就是大规模的排兵布阵。
这里就有如下的疑问:
- FPGA是硬件,它是如何做到能够对硬件进行现场可编程的呢?
- FPGA是硬件,它是如何做硬件的可定制化呢?
- FPGA是什么样的半成品硬件呢?
第2章 FPGA的外部接口(外部硬件管脚与功能)
FPGA与ASIC芯片从功能使用上来看是相似的。
硬件芯片本身就是一个小系统,一个系统除了完成内部的功能之外,一个重要的任务就是与外部通信,这就是输入输出。
外部接口包含两大部分:IO输入输出接口和内部功能接口。
2.1 IO输入输出接口
与外部通信所需要的各种接口,称为IO接口,IO接口品种繁多.
- 按照传输速度分为高速和低速: 常见的I2C, Uart,SPI都是低速总线,以太网、PCIe, CPRI都是高速总线。
- 按照传输线的多少分为串行与并行接口,大部分IO总线都是串行总线,内存总线就是并行总线,如32bit或64bit的数据和地址总线。
2.2 内部功能接口
FPGA为了完成自身的功能,包含的接口,称为内部功能接口,如:
- 电源
- 时钟
- 硬件功能配置
- 调试
2.3 FPGA的对外接口与ASIC芯片对外接口的主要区别
- ASIC芯片的对外接口是确定性的,在芯片出厂后,芯片的对外管脚的功能就确定下来了。
- FPGA芯片是半定制化产品, 内部的功能部分是确定性,因此有部分的外部管脚是固定的、确定,包括时钟、电源、调试
- FPGA芯片是半定制化产品, 其内部的大部分功能是后期可定制化编程的,因此其外部的大部分管脚也不是确定性不变的,而是可以编程定制。这种不确定性或可定制化特性,就导致FPGA的硬件的灵活性要比ASIC芯片大很多。如下图所示,大部分管脚都是可定制化的IO管脚。
当然,不同厂家的FPGA,其IO管脚的描述方式是不同的。
FPGA外部管脚是内部功能的体现,因此与内部逻辑是关联的。
2.4 外设芯片三大并行总线
(1)控制总线:传送控制的信号
(2)数据总线:传送数据的信号
(3)地址总线:传送地址的信号
第3章 FPGA的内部结构-高度抽象化的资源--(Xilinx FPGA为例)
3.1 FPGA内部基本结构(Xilinx FPGA为例)-- 横向划分
FPGA内部实际上是一个电子电路系统,由各种高度抽象化后的、可编程的、基础电子电路资源组成。经过抽象后,FPGA内部有三大部分组成:
(1)可编程逻辑(阵列)块 CLB/LAB(类于普通PCB板上的各种功能芯片,是FPGA内部的最核心部分)
(2)输入输出块(I/O)(类比普通PCB板上的各种IO接口,是FPGA对外的接口部分)
(3)片内互连线(IC)(类比PCB板上各芯片之间的连线,是FPGA内部的高速公路)
3.2 可编程逻辑功能块 CLBs:企、事业单位
可编程逻辑功能块 CLB,又称为LAB(可编程逻辑阵列块Logic Array Block)
类于普通PCB板上的各种功能芯片,是FPGA内部的最核心部分
FPGA对外展现出来的功能是由这部分来完成的。
相当于一个国家内部的各个省份、各个县市、乡村;各个部委、各个公司、单位。
可编程逻辑功能块是实现用户功能的基本单元,多个逻辑功能通常规则地排成一个阵列结构,分布于整个芯片。
CLB和LAB的核心部件的简化示意图如下:
数字电路根据逻辑功能的不同特点,可以分成两大类,
一类叫组合逻辑电路(简称组合电路),另一类叫做时序逻辑电路(简称时序电路)。
可以只是用查找表LUT,可以实现任意的组合逻辑运算;
可以只是用D触发器, 可以实现任意的时序逻辑运算;
同时使用查找表和D触发器,实现复杂的大规模的时序组合逻辑运算;
3.2.1 LUT(Look-Up-Table)查找表
LUT表是FPGA实现可编程、组合逻辑最重要的单元。
查找表的本质是一个RAM,是一个N地址线总线,M位数据总线的RAM。
对于FPGA而言,LUT是如此的重要,因此,非常有必要深入浅出地了解LUT的工作原理。
(1)什么是组合逻辑电路
组合逻辑电路在逻辑功能上的特点是任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关,即与访问的时间无关,只与组合逻辑内在逻辑实现有关。
数字电路中包含了大量的组合逻辑的功能单元,如:
- 算术运算电路,如加法器,对两路数据进行累加。
- 编码器:对输入数据编码后输出新的数据
-
译码器:对输入数据解码后输出新的数据
-
数据选择器:从某一地址空间选择一路数据输出 =>LUT的本质就是数据选择器。
-
数据分配器:多路分配器的功能是把输入数据分配给不同的通道上,相当于一个单刀多掷开关
-
数值比较器:多路数据进行比较后输出新的数据
描述组合电路的工具是:真值表。
(2)先了解RAM内存数据访问的基本原理
随机存取存储器(英语:Random Access Memory,缩写:RAM),也叫主存,是与CPU直接交换数据的内部存储器。
它可以随时读写(刷新时除外),而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储介质。RAM工作时可以随时从任何一个指定的地址写入(存入)或读出(取出)信息。
它与ROM的最大区别是数据的易失性,即一旦断电所存储的数据将随之丢失。
RAM在计算机和数字系统中用来暂时存储程序、数据和中间结果。
它与ROM相比,具备如下的优点:
- 随机访问:所谓“随机存取”,指的是当存储器中的数据被读取或写入时,所需要的时间与这段信息所在的位置或所写入的位置无关。
- 高速访问:访问速度快
- RAM中内容的动态可修改性,实现RAM中内容的动态编程!!!
LUT就是利用了RAM的上述优点(特点),实现高速的组合逻辑电路和动态可编程!!!
(3)LUT工作原理(RAM的读操作就是LUT)
LUT的工作原理与RAM的工作原理类似,下面以4位地址线,1位数据线的LUT, 来介绍LUT是如何实现可编程的组合逻辑的。更多的地址线和数据线与之类同。
4位地址线,可以访问2^4=16个RAM的地址空间,每个地址空间可以输出1位数据,输出的内容是0或1,取决于RAM中存储的数据内容.
在上图案例中,当地址=0000、0001时输出为0; 当地址=1111时,输出为1. 这就是组合逻辑,即与时间无关,任何时候,输入指定的地址,得到确定性的输出0或1.
当然,我们通过给RAM的不同地址空间中存放不同的可编程的数据,就可以实现对LUT表组合逻辑的编程。
3.2.2 D触发器
(1)什么是时序电路
时序电路,是由最基本的逻辑门电路加上反馈逻辑回路(输出到输入,就把当前的输出状态作为下一次的输入之一)或器件组合而成的电路,与组合电路最本质的区别在于时序电路自身具有状态记忆功能。输出值,不仅仅取决于输入,而且还取决于自身当前的状态!!!即输出不仅仅与输入有关,时间有关,所以称为时序电路。
时序电路是实现硬件状态机最重要和最基本的电路之一。
描述时序电路的工具是:状态图。
(2)D触发器
D触发器是一个具有记忆功能的,具有两个稳定状态的信息存储器件,是构成多种时序电路的最基本逻辑单元,也是数字逻辑电路中一种重要的单元电路。D触发器在数字系统和计算机中有着广泛的应用。
触发器具有两个稳定状态,即"0"和"1",在一定的外界触发信号作用下,可以从一个稳定状态翻转到另一个稳定状态。
在上图中,输出值Q是0还是1,不仅仅取决于输入D是0还是1, 还取决于触发触发自身当前的状态。并且在时钟信号CP的触发下才是进行输出(状态的翻转)。
D触发器应用很广,可用做数字信号的寄存,移位寄存,分频和波形发生器等等。
当然,除了D触发器,还有RS触发器,T触发器等。
3.2.3 实际的CLB
实际的CLB,除了核心部件LUT和触发器外,还有一些辅助电路。
3.3 输入输出块(I/O):出入境
类比普通PCB板上的各种IO接口,是FPGA整体的对外接口部分。
相当于一个国家对外的接口,即出入境管理:有海路接口、陆上接口、有空路接口等,FPGA的IO输入输入输出也有多种功能分类。
可编程输入输出块完成芯片内部逻辑与外部管脚(只是导线)之间的接口。
IO输入输出块围绕在逻辑单元阵列块LAB四周,可编程输入输出块的功能和性能从一定程度上也决定了该器件的市场地位。
一个可编程输入输出基本单元包括:输入与输出两个部分
一、输出
- (1)输出寄存器(Output Register) =》 暂时缓存输出信号电平
- (2)输出使能寄存器(OE Register),使能输出电平,使能前,输出电平是不确定的,既不是确定性的0,和也不是确定性的1,为第三这种状态,称为“三态”。
- (3)输出延迟链(Output Pin Delay) => 叠加管脚信号的时延
- (4)输出驱动(提供更大的电流)
二、输入
- (5)输入寄存器(Input Register) =》 暂时缓存输入信号电平
- (6)输入延迟链(Input Pin Delay) => 叠加管脚信号的时延
- (7)上拉电阻(Pll Up Resistor) =》 确保在没有输入信号时,输入IO为确定性的1.
- (8)下拉电阻(Pll Up Resistor) =》 确保在没有输入信号时,输入IO为确定性的0.
从上述可以看出:输入和输出的信号是受控的,而不是完全开放、不受控制的。
就像一个国家的边防和海关,处境和入境是完全受控的,不是自由出入的!!!
3.4 片内互连线(IC):交通网
类比PCB板上各芯片之间的连线,是FPGA内部的高速通路。
通过它,可以把不同的功能部件连接起来,提供不同功能部件之间的互联互通。
相当于一个国家内部的交通网:水路、公路、地跌、高铁、航空等等、
可编程内部互联资源包括各种长度的连线线段和一些可编程连接开关,通过这些连接开关,把FPGA内部的各个功能模块连接起来,它们将各个可编程逻辑块或输入/输出块连接起来,构成特定功能的电路。
用户可以通过编程决定每个单元的功能以及它们的互连关系,从而实现所需的逻辑功能。
- 局部快速通道最快,
- 列快速通道次之,
- 行快速通道最慢
时序约束时尽量让相关信号分布在局部快速通道里,可以保证系统的高效运行。
第4章 FPGA的具体化的内部资源-具体化的资源
FPGA内部结构决定了它为什么能够支持现场可编程。
FPGA内部结构决定了它如何支持现场可编程。
4.1 内部“分层”资源--纵向划分
FPGA内部的资源是分层的,与公司、军队对资源的管理是类似的 。
4.2 基本的逻辑门结构(最底层的资源)
FPGA称为可编程“门”阵列,表明其最底层的资源:基本的逻辑"门”:与、或、非、异或门。
也就是说,是数字电路编程,如下是通过晶体三极管实现基本门电路的示意图。
FPGA的规模大小,也是通过包含多少基本的“门”电路的数量,即门数来标识的。
详细信息参考:
[从零开始学FPGA编程-3]:快速入门篇 - 导体、半导体、晶体管、常见电子元器件、集成电路_文火冰糖的硅基工坊的博客-CSDN博客
4.3 FPGA的层次型资源库
当然,FPGA的编程,不会让编程者从基本的“门”电路从头开始编程,FPGA厂家提供了丰富的资源库供编程者使用,与C语言编程的标准库类似,资源库的提供极大的方便了FPGA编程者的工作量,可以利用大量已有的、成熟的资源库完成自身业务上的需求,而不需要关心资源库内部逻辑实现。也就是说,FPGA的编程这不需要重复造轮子,FPGA的资源库,会自动把资源映射成底层需要底层的门电路。
(1)定时器资源(分频/倍频、数字延迟、时钟锁定):周期性产生定时中断。
(2)内存资源(块RAM、分布式RAM):用于存放数据的地方。
(3)时钟锁相环资源:提供稳定的时钟。
(4)输入输出控制器资源:与外界的信息交流(输入与输出)。
(5)互联总线资源:内部各种资源的互联互通。
(6)微处理器(Cortex-M3、Cortex-A9、PowerPC):能够执行软件指令的资源。
(7)算数运算单元(高速硬件乘法器、乘法器);
(8)高速串行I/O接口;
(9)特殊功能模块(PCIE、DDR等硬IP核);
每个资源都类似一个专用ASIC芯片。
有了这些高度集成化的资源,FPGA的编程轻松很多,FPGA的编程就像搭积木。
充分利用这些已有资源库,FPGA的编程效率就可以得到极大的提升。
当然,实际情况,要比搭积木复杂很多,这里只是一个类比。
第5章 FPGA可编程的基本原理(原因)
FPGA编程就是对内部各种层次资源的整合和大规模的排兵布阵, 对FPGA内部资源的编排的过程,就是编程的过程。这句话的前提是:
(1)FPGA内部资源是可以重新编排的,而不是像ASIC的资源时固化不变。
(2)要有大量可用的基础资源可用,大规模“门”阵列就是可以编程的基本资源。
5.1 组合逻辑的编程(LUT):查找表实现任意组合逻辑
前面已经提到,组合电路是通过编程LUT(RAM)查找表中的内容,来实现组合逻辑的编程的。
原理:
其实就是通过控制数据选择器将RAM的数据进行输出,比如要实现A|B|C|D运算,则该运算只有当A、B、C、D同时为0时,输出为0,其余时间输出均为1;
加入规定当数据选择端输入低电平时,数据选择器的上面输入端与输出端导通,
当数据选择端输入高电平时,数据选择器的下面输入端与输出端导通,则查找表应如下图所示:
对FPGA进行编程,实际上就是把需要进行的运算结果计算出来并存储在RAM之中,当输入发生相应变化时,将RAM中对应的值进行输出即可;
一个N输入查找表(LUT)可以实现N个输入变量的任何逻辑功能,如N输入“与”、N输入“异或”等。
输入多于N个的函数、方程必须分开用几个查找表(LUT)实现,这个过程由综合软件自动完成。
5.2 时序电路的编程(D触发器)
那么时序电路如何实现编程的呢?
FPGA 中有很多的 D 触发器(DFF),既然有了 D 触发器(DFF),加上时钟,就能实现时序逻辑了, 通过把多个D触发器连接和组合起来,构成更复杂的时序电路。
那么如何把D触发器连接和组合起来呢?
答案就是具有可编程开关的内部连线。
FPGA 内部有大量的长的短的连线,这些连线能够将不同的 LE(CLB/LAB)的输入和输出连接起来。这样,假设每个 LE 实现一个单独的功能,然后多个 LE 的输入输出按照一定的规则使用连线连接起来,就能实现复杂的功能了。如下图所示!
上图为一个最最基本的 FPGA 架构,且不包括 I/O 块。
通过上图右半部分可以看到:一 个 FPGA 中以阵列的形式分布着很多的小逻辑块,这个块就是我们熟知的逻辑单元(LogicElements,简称LE/LAB/CBS),这些所有的小块共同构成了 FPGA 的可编程逻辑门阵列。
而为了把不同的逻辑单元连接起来,FPGA 中分布着大量的可编程互联资源,通过对这些可编程互联资源编程,就能够把各个不同的逻辑单元的输入、输出连接起来。
在上图的上半部分就演示了部分互联资源将多个逻辑单元按照一定的规则连接了起来。
这样看起来,这和我们的电路板模型非常的相似,在电路板上有各种芯片,每个芯片都有很多的管脚,通过 PCB 板走线把这些管脚按照正确的方式连接到一起,就能够形成一个可以实现特定功能的电路板了。
5.3 LE/LAB编程
前面提到,一个逻辑单元由一个查找表(LUT)和 D 触发器(DFF)组成,通过对LUT和D触发的组合编程,即实现了对LE/LAB的编程:
LUT 的输出 Q可以送给 D 触发器的数据输入端口 D,也可以不经过 D 触发器直接输出。当然了,实际上 D 触发器的输入也可以不来自于LUT 的输出,而来自于其他逻辑单元的输出。不经过 D 触发器输出,那这个 LE 实现的就是一个纯组合逻辑,经过 D 触发器输出,那这个 LE 实现的就是一个时序逻辑。当然,真实的逻辑单元里面可能还包含了很多其他辅助的电路,这里省略。
附录:
对FPGA资源的横向和纵向进一步的理解
[机缘参悟-16]:FPGA编程、软件编程与公司管理有着相似原理_文火冰糖的硅基工坊的博客-CSDN博客
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/124722606
以上是关于如何快速掌握FPGA?的主要内容,如果未能解决你的问题,请参考以下文章