首页 > 编程知识 正文

fpga教程(fpga硬件电路设计)

时间:2023-05-03 18:45:56 阅读:74824 作者:3711

文章目录前言什么是FPGA? FGA的硬件架构LUT资源Flip-FlopDSP48块Block RAM和其他存储资源其他资源BRAM的APP应用单端口BRAM配置双端口BRAM配置FIFO BRAM配置

前言

正文首发: FPGA的设计艺术(1) FPGA的硬件架构

FPGA是一个非常不可思议的设备,工程师可以在此基础上制作游戏。 话说,工程师每天都在上面做游戏。 通过制作积木,也可以设计美丽、复杂、奇怪的电路。 这几乎不能用设备构建。 因为太庞大了。 这种设计也只能由FPGA或专用IC实现,IC只能定制,但FPGA可以重复使用,每次可以是不同的电路。 因此,FPGA目前的应用非常广泛,在许多重要领域也是一场盛宴。

既然FPGA这么棒,就有必要对FPGA有清楚的认识!

什么是FPGA? 什么是FGA? 这是官方的说明:

FGA是集成电路(IC ),在制造后可以编程不同的算法。 现代FPGA最多由200万个逻辑单元组成,可以配置和实现各种软件算法。 传统的FPGA设计过程类似于典型的IC而不是处理器,但与IC开发工作相比,FPGA在成本上有很大的优势,在电路设计完成后,可以直接使用流片而不需要继续。 在大多数情况下,它提供相同的性能级别。 与集成电路相比,FPGA的另一个优点是可以动态重新配置。 (FPGA的名称是现场可编程门阵列,可以随时重新编程、重新配置。 此过程可以影响FPGA结构中的部分或全部可用资源,就像将程序加载到处理器中一样。

Xilinx FPGA是一种异构计算平台,包括Block RAM、DSP Slices、PCI Express支持和可编程体系结构。 所有这些计算资源都可以同时使用,从而在整个平台上实现APP应用程序的并行化和流水线化。

FGA的基本结构由以下元素组成。

查找表—此元件执行逻辑运算。 触发器(FF )此寄存器元素存储LUT的结果。 电缆连接资源将各种元件相互连接。 输入/输出(I/O )引脚-这些物理端口将数据输入/输出到FPGA。 这些元素的组合形成了下图所示的基本FPGA结构。 该结构足以实现任何算法,但从计算吞吐量、所需资源和可实现的时钟频率的角度来看,实现效率有限。

现代FPGA架构将基本要素与附加计算和数据存储块相结合,提高了器件的计算密度和效率。 这些额外要素包括:

分布式数据存储嵌入式存储器(分布式ram ) PLL,用于以不同的时钟速率驱动FPGA结构。 (PLL/MMCM )高速串行收发器(Transceiver )片外存储器控制器(MIG )累加模块

上图显示了现代FPGA体系结构中这些元素的组合。 这为在处理器上运行的任何软件算法提供了灵活性。 请注意,整个FPGA的所有这些元素都可以同时使用。

LUT资源LUT是FPGA的基本组件,可以实现n个布尔变量的任意逻辑功能。 本质上,该要素是真值表,在该真值表中,根据输入的组合实现不同的功能,生成输出值。 真值表的大小限制为n。 其中n表示LUT的输入数。 对于通常的n个输入LUT,表访问的存储器位置的数量是2的n次幂。 请注意,Xilinx FPGA中n的典型值为6。

LUT的硬件实现可被视为连接到一组复用器的存储器单元的集合。 LUT的输入在给定时刻选择结果作为复用器上的选择位。 牢记这种表达方法很重要。 因为LUT既可以用作函数计算引擎,也可以用作数据存储元素。

触发器的基本配置是数据输入、时钟输入、时钟使能、复位和数据输出。 正常工作时,数据输入端口的值全部锁存,用时钟的各脉冲传递给输出端子。 时钟使能引脚的目的是允许触发器在多个时钟脉冲中保持特定的值。 只有在时钟和时钟启用都为1时,新的数据输入才会被锁存并传递到数据输出端口。

触发器也是FPGA中的一种存储资源,一个触发器可以存储1bit的数据。 虽然其存储量小,但在FPGA中是非常重要的资源。 可以说,FPGA如果没有触发,水的流动就会消失,变成死水,不是吗? 那对FPGA来说,不是会变成砖头吗?

DSP48块Xilinx FPGA中可用的最复杂的计算块是下图所示的DSP48块。

DSP48块是集成在FPGA结构中的算术逻辑单元(ALU ),由三个不同的块构成的链。 DSP48的计算链包含加减运算单元,连接到乘法器并连接到最后的加减运算/累计引擎。 通过该链,可以在一个DSP48单元上实现以下形式的函数:

p=bx(ad ) c

或者

p=bx(ad )

Block RAM和其它存储资源FPGA结构包括嵌入的存储元件,其可以用作随机存取存储器(RAM )、只读存储器(ROM )或移位寄存器。 这些元件是块ram、LUT和移位寄存器。

BRAM是一个双端口RAM模块,实例化为FPGA结构,为较大的数据集提供片上存储。 器皿

件中可用的两种类型的BRAM存储器可以容纳18k或36k位,这些存储器的可用量是器件特定的。这些存储器的双端口性质允许对不同位置进行并行的、同时钟周期的访问。

块RAM(或BRAM)代表块随机存取存储器。块RAM用于存储FPGA内部的大量数据。它们是FPGA数据表上四个常见的识别元件之一。其他三个是触发器、查找表(LUT)和数字信号处理器(DSP)。通常FPGA越大、越贵,它的块状RAM就越多。既然这在FPGA产品概述的顶部就能找到,那么它一定很重要!

块状RAM(有时称为嵌入式存储器,或嵌入式块状RAM(EBR)),是FPGA的一个分立部分,这意味着芯片上只有这么多块状RAM可用。每个FPGA都有不同的数量,所以根据您的应用,您可能需要更多或更少的块状RAM。会撒娇的画笔成为一个更好的数字设计师时,知道你需要多少就会变得更容易。正如我之前所说,它是用来在FPGA内部存储 "大量 "数据的。也可以将数据存储在你的FPGA之外,但那要通过SRAM、DRAM、EPROM、SD卡等设备来完成。

在RAM配置中,数据可以在电路运行期间的任何时间进行读写。相反,在ROM配置中,数据只能在电路运行期间读取。ROM的数据是作为FPGA配置的一部分写入的,不能以任何方式修改。

如前所述,LUT是一个小存储器,在器件配置时,将真值表的内容写入其中。由于Xilinx FPGA中LUT结构的灵活性,这些块可以作为64位存储器使用,通常被称为分布式存储器。这是FPGA上最快的一种存储器,因为它可以在结构的任何部分实例化,从而提高了实现电路的性能。

移位寄存器是一个相互连接的寄存器链。这种结构的目的是提供沿计算路径的数据重用,例如与滤波器一起。例如,一个基本的滤波器是由一个乘法器链组成的,该乘法器将数据样本与一组系数相乘。通过使用移位寄存器来存储输入数据,内置的数据传输结构在每个时钟周期将数据样本移动到链中的下一个乘法器。

其他资源

上面也说了,FPGA中一些其他的资源,例如Serdes,或者称为Transceiver,我们在这方面讲了太多,也有相应的专题:
例如:

什么是MGTs

注:Serdes通常位于FPGA的专门Bank上,Xilinx称为MGT BANK,一般位于IOB附近。

BRAM的应用 单端口BRAM配置

块RAM单端口配置

当只有一个接口需要检索数据时,单端口块RAM配置是很有用的。这也是最简单的配置,对某些应用很有用。一个例子是存储只读数据,当FPGA被编程时,这些数据会被写入一个固定的值。这就是Block RAM的一个特点,就是它们都可以被初始化(这里的例外是Microsemi FPGA,因为它们是不同的架构,所以不能被初始化。)

也许你的应用有一堆校准参数,这些参数只写一次,并在启动时读出,那么一个单端口块RAM就可以很好的完成这个任务! 或者你需要做8B/10B编码/解码,这在以太网,HDMI,SATA,USB等中是很常用的。这些都将是单端口Block RAM的伟大应用。

它们的工作方式都是基于时钟的。只要Wr En信号不激活,数据将在时钟周期的正边沿读出,地址由Addr指定。读取值在Rd Data上出来,这是存储在BRAM中的数据。注意,每个时钟周期只能读取一个Rd Data值。因此,如果你的Block RAM有1024个值深,那么至少需要1024个时钟周期才能读出全部内容。

在某些应用中,您可能希望将一些数据写入Block RAM缓冲区,然后在稍后时间将其读出。这就需要将Wr En高电平驱动一个时钟周期,而Wr Data将拥有您的写入数据。对于单端口配置,你可以在感性的大碗上读或写数据,你不能同时做这两件事。如果你想同时读和写数据,你将需要一个双端口块RAM!

双端口BRAM配置

块RAM双端口配置

双端口块RAM(或DPRAM)配置的行为方式与单端口配置完全相同,只是您有另一个端口可用于读取和写入数据。感性的大碗和端口B的行为完全相同。感性的大碗可以在端口B向地址200写入的同一时钟周期内对地址0进行读取。因此,DPRAM能够在一个地址上执行写入,同时从一个完全不同的地址上进行读取。我个人发现DPRAM的用例比单端口RAM的用例多。

一个可能的用例是存储外部设备的数据。例如,你想从SD卡上读取数据,你可以把它存储在双端口RAM中,然后再读出来。或者您想连接模数转换器(ADC),并需要一些地方来存储转换后的ADC值。DPRAM将是很好的选择。此外,双端口RAM通常被转化为FIFO,这可能是FPGA上Block RAM最常见的使用情况之一。

FIFO BRAM配置

块RAM FIFO配置

FIFO的意思是First In First Out,它们在FPGA设计中使用得很普遍。任何时候你需要在两个接口之间缓冲一些数据,你都会用到FIFO。或者如果你想跨时钟域,或者你想缓冲一行图像数据并对其进行操作,或者你想把数据送到片外的DDR存储器上,这些都需要使用Block RAM FIFO。
我有专门的CDC处理就用到了FIFO,可见:FPGA逻辑设计回顾(6)多比特信号的CDC处理方式之异步FIFO

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。