嵌入式设计与 FPGA:实现语言
编者注:随着用于智能产品设计的高级算法不断涌现,开发人员经常发现自己难以实现能够满足这些算法相关处理需求的嵌入式系统。 FPGA 可以提供所需的性能,但长期以来,使用 FPGA 进行设计一直被认为仅限于 FPGA 编程专家的权限。然而,如今功能更强大的 FPGA 和更有效的开发环境的出现使得 FPGA 开发变得更加容易。在此摘录中,即《架构高性能嵌入式系统》一书中的第 4 章,作者全面回顾了 FPGA 设备、实现语言和 FPGA 开发过程,并详细介绍了如何开始在您自己的环境中实现 FPGA。设计。以下系列文章中提供了完整的摘录:
1:硬件资源
2:实现语言(本文)
3:开发流程
4:构建项目
5:实现
改编自建筑高性能嵌入式系统,作者 Jim Ledin。
FPGA 实现语言
实现 FPGA 设计最终归结为使用一种或多种类似软件编程的语言来定义设备的功能。
FPGA开发使用的传统语言是VHDL和Verilog。
当前的 FPGA 开发工具通常支持这两种语言,并且能够使用框图技术定义系统配置。一些工具套件还支持使用传统的 C 和 C++ 编程语言定义 FPGA 功能。
VHDL
VHSIC 硬件描述语言 (VHDL ),其中 VHSIC 代表非常 高速集成电路 , 具有让人联想到 Ada 编程语言的语法。 VHDL是在美国国防部的指导下于1983年开始开发的。
与 Ada 一样,VHDL 往往非常冗长且结构严格。在编程语言方面,VHDL 是强类型的。该语言包含一组预定义的基本数据类型,主要是布尔、位、位向量、字符、字符串、整数、实数、时间和数组。所有其他数据类型均根据基本类型定义。
电气和电子工程师协会定义了一组VHDL库 (IEEE ) 并正式化为 IEEE 1164 标准,多值逻辑系统 VHDL 模型互操作性 .这些库定义了要在 VHDL 语言中使用的一组逻辑值。该库包括一个名为 std_logic 的类型,它表示一个 1 位信号。 std_logic 类型中的逻辑值由下表所示的字符文字表示:
上图中的“强”0 和 1 值表示驱动到指定二进制状态的信号。 “弱”信号表示在具有多个驱动程序的总线上驱动的信号,其中任何驱动程序都可以在总线上声明自己,覆盖其他驱动程序。 Z 值表示处于高阻抗状态的 CMOS 输出,其中不是将总线驱动到 0 或 1 状态,而是有效地将输出与总线断开并且根本不驱动它。 U 状态代表所有信号的默认值。在执行电路仿真时,将检测到任何处于 U 状态的信号,这可能表明无意中使用了未初始化的值。 X 状态与没有任何输出驱动它们的电线相关联。 – 状态代表未使用的输入,因此它们处于什么状态无关紧要。
VHDL 电路设计通常从通过以下语句导入 IEEE 1164 库开始:
图书馆 IEEE;
使用 IEEE.std_logic_1164.all;
我们将在本章后面的项目示例中使用 VHDL。这并不表示 VHDL 比 Verilog 更受欢迎。两种硬件定义语言都完全能够表示基本上可以为 FPGA 综合的任何设计。
Verilog
Verilog 硬件描述语言 (HDL ) 于 1984 年推出,并于 2005 年标准化为 IEEE 1364。2009 年,Verilog 标准与 SystemVerilog 结合 制定 IEEE 标准 1800-2009 的标准。除了 Verilog 中存在的硬件设计功能外,SystemVerilog 还包含用于执行系统验证的大量工具。
Verilog 的设计类似于 C 编程语言,包括类似的运算符优先级和使用一些相同的控制流关键字,包括 if、else、for 和 while。
Verilog 使用了 wire 的概念 来表示信号状态。信号值可以取任何值 0、1、无关 (x) 或高阻抗 (z),并且可以具有强 或弱 信号强度。
VHDL 和 Verilog 都定义了可用于设计逻辑电路的语言子集。这些子集被称为可合成的 语言子集。可综合子集之外的其他语言功能可用于支持诸如电路仿真之类的任务。我们将在本章后面看到一个例子。
不可综合的语言结构往往表现得更像传统的软件编程语言。例如,不可综合的 for 循环按指定的次数按顺序迭代代码块,就像在常规编程语言中一样。另一方面,可综合的 for 循环可以有效展开以生成一组复制的硬件结构,这些结构并行执行,代表循环的每次迭代。
框图
在基于文本的 HDL 之上的抽象级别,现代 FPGA 开发工具套件支持系统设计的快速配置,这些系统设计包含使用块结构格式的复杂逻辑组件,例如微处理器和复杂的 I/O 设备。 图 4.2 是包含 MicroBlaze 软处理器的 Xilinx FPGA 设计的部分框图示例:
点击查看全尺寸图片
图 4.2 – 包含 MicroBlaze 软微处理器的框图
MicroBlaze 处理器 是 Xilinx Vivado 工具套件提供的处理器内核,用于处理器系列(包括 Artix-7)中的 FPGA 设计。
虽然使用框图提供了一种直观的方式来组织 FPGA 设计中复杂逻辑元素的实例化和互连,但重要的是要记住,在框图背后,开发工具生成 VHDL 或 Verilog 代码来定义组件及其连接。框图只是一个用于管理这些组件配置的用户界面。
开发框图后,您可以检查生成的 HDL 代码,这些代码将包含在与项目关联的文件中。在图4.2的示意图中 ,从图中生成了一个名为 design_1_microblaze_0_0_stub.vhdl 的文件。该文件以以下 VHDL 代码开头:
图书馆 IEEE;
使用 IEEE.STD_LOGIC_1164.ALL;
实体设计_1_microblaze_0_0是
端口(
时钟:在 STD_LOGIC 中;
重置:在 STD_LOGIC 中;
中断:在 STD_LOGIC 中;
Interrupt_Address:在 STD_LOGIC_VECTOR(0 到 31)中;
Interrupt_Ack:输出 STD_LOGIC_VECTOR(0 到 1);
Instr_Addr:输出 STD_LOGIC_VECTOR(0 到 31);
指令:在 STD_LOGIC_VECTOR(0 到 31)中;
这段代码首先引用了 IEEE 1164 标准库,然后定义了 MicroBlaze 处理器的接口,该接口公开了微处理器上预期的信号,包括系统时钟、复位、中断请求和中断向量输入;中断确认和指令地址输出;以及用于从内存中检索指令的总线。
此代码将 IEEE 1164 库数据类型用于单位信号 (STD_LOGIC) 和多位总线信号 (STD_LOGIC_VECTOR)。
清单中的代码定义了 MicroBlaze 处理器的接口,但不包含处理器本身的 HDL 定义。微处理器等组件的复杂 HDL 设计被认为是有价值的知识产权 (IP ) 和开发这些设计的商业实体通常会采取措施确保在没有适当许可的情况下不会使用它们。当供应商分发 IP 供其客户使用时,它可能以对最终用户不透明的编译格式提供。这允许用户将 IP 合并到他们的设计中,但他们不能检查用于开发它的 HDL。这在概念上类似于软件开发人员以编译形式发布库但不提供源代码。
C/C++
许多供应商提供软件工具,将传统的高级编程语言(通常是 C 和 C++)转换为 HDL 代码,用于 FPGA 开发。如果您希望在 FPGA 实现中加速 C 或 C++ 中的复杂算法,则这种方法可能很有吸引力。这些工具还允许熟悉 C/C++ 的软件开发人员立即开始实现用于 FPGA 的代码,而无需学习其中一种 HDL。
虽然用于这些高级语言的 FPGA 开发工具能够显着优化 C/C++ 代码算法的最终 FPGA 实现,但仍然存在一些脱节,因为 C/C++ 执行模型涉及语句的顺序执行,而原生 FPGA 环境由并行硬件组件组成。由 C/C++ 代码生成的 FPGA 设计通常类似于一组状态机,用于管理编程语言语句中定义的操作的顺序执行。根据在 C/C++ 代码中并行执行的机会的可用性,与在传统处理器上运行相同的代码相比,FPGA 实现可能会提供显着的性能增强。
在现代 FPGA 开发工具套件中,如果需要,本节中描述的所有 FPGA 实现方法(VHDL、Verilog、框图和 C/C++)都可以组合在一个设计中。因此,一个团队成员可能更喜欢在 VHDL 中工作,而另一个则使用 Verilog。不鼓励在单个项目中使用多 HDL 可能有项目管理原因,但语言本身在单个设计中一起运行没有问题。项目经理可能希望避免使用多个 HDL 的一个原因是,该工作的未来维持将需要具有两种语言技能的开发人员的参与。
同样,可以根据框图为项目定义高级架构,然后使用所选的 HDL 实现详细的子系统功能。在同一设计中,还可以集成由 C/C++ 算法生成的 HDL。嵌入式系统架构师和开发人员应仔细考虑其中的含义,并为 FPGA 设计的每个部分选择合适的实现方法。
下一节将介绍标准FPGA开发流程中的步骤。
经 Packt Publishing 许可转载。版权所有 © 2021 Packt Publishing
吉姆·莱丁 是 Ledin Engineering, Inc. 的首席执行官。Jim 是嵌入式软件和硬件设计、开发和测试方面的专家。他还擅长嵌入式系统网络安全评估和渗透测试。他拥有学士学位爱荷华州立大学航空航天工程学士学位和硕士学位。佐治亚理工学院电气和计算机工程学士学位。 Jim 是加利福尼亚州的注册专业电气工程师、认证信息系统安全专家 (CISSP)、认证道德黑客 (CEH) 和认证渗透测试员 (CPT)。
相关内容:
- 使用 FPGA 进行嵌入式设计:硬件资源
- 开源工具有助于简化 FPGA 编程
- 在 FPGA 或 ASIC 中实现浮点算法
- 软件工具将 GPU 代码迁移到 FPGA 以用于 AI 应用
- FPGA 取代了 Subaru Eyesight 基于视觉的 ADAS 中的 ASIC
- 基于闪存的 FPGA 如何简化功能安全要求
- 获得即时启动 FPGA 的优势
- 使用高速 NOR 闪存的 FPGA 配置
- FPGA 技术如何发展以满足新的中端系统要求
有关 Embedded 的更多信息,请订阅 Embedded 的每周电子邮件通讯。
嵌入式