如何使用FPGA开发板编程出更高级的应用

描述

许多设计人员迟早都会发现,微控制器或微处理器上运行的固件可能会变得太慢。现场可编程门阵列 (FPGA) 为此提供了一种可编程方法,以硬件速度来解决高速、实时、嵌入式设计问题。然而,为了最大限度地利用 FPGA,传统上涉及到一个技术学习曲线,但由于成本和期限压力,许多工程师无法负担这样的学习曲线。

FPGA 的学习曲线常常涉及学习新的编程语言(Verilog 或 VHDL),下载大型开发工具包,学习全新工具开发流程以生成 FPGA 比特流,而且可能要花大量资金(可能数百或数千美元)用于购买 FPGA 开发板。由于这些障碍,尽管 FPGA 是嵌入式设计工具箱中极其有用的工具,但许多设计工程师都避免使用它们。

一些供应商试图通过提供入门 FPGA 板来减少使用 FPGA 的障碍,但学习新硬件描述语言和开发工具的必要性仍然是很高的门槛,阻碍了 FPGA 的更广泛采用。为了破除这些障碍,Arduino 作出了最新的努力,推出一款名为 Arduino MKR Vidor 4000 的新型低成本开发板,其代表了一种在嵌入式系统设计中使用 FPGA 的独特方法。

Arduino MKR Vidor 4000 提供了多种 FPGA 编程方法,这些方法可无缝集成到广受欢迎的 Arduino IDE 中。借助这种方式,通过特殊的 Arduino 库扩展获得 FPGA 级性能,便能使嵌入式系统开发人员直接从 Arduino 草图中快速获益。同时,随着更高级的设计人员对该技术的信心增强,他们可以采取更复杂的 FPGA 使用模型。

本文将首先讨论有关 FPGA 的需求,再介绍 MKR Vidor 4000 开发板的功能。然后,本文将深入阐述如何应用 Arduino 的新型简化方法来使用 FPGA。

第一代 Arduino 开发板

2005 年推出的第一款 Arduino 开发板是基于一个简单的 8 位微控制器:Atmel(现为 Microchip Technology)AVR。此开发板的很多后续产品同样基于该微控制器系列的不同器件。由于成本低且 Arduino IDE 简单易用,Arduino 开发板系列已成为物联网 (IoT) 产品开发的流行平台,常用于 STEM/STEAM 项目。事实上,最初的 Arduino 板就是第一个获得广泛成功的开源硬件项目。

现在,全世界有成千上万的设计师、工程师、开发人员和创客在使用各种版本的 Arduino 开发板系列,其已成为让学生们第一次接触嵌入式编程的首选。人们的创意无限,从音乐、游戏、玩具、智能家居、农业到自主驾驶车辆,其应用范围非常广泛。

随着 Arduino 用户不断将最初的 Arduino 架构推进到越来越复杂的应用领域,性能问题开始出现。一部分问题是最初的 Arduino 微控制器的 8 位架构过于简单。另一部分问题是许多实时外设的软件实现,尤其是时间关键型外设,例如高速定时器、高频 PWM(脉冲宽度调制)输出和正交编码器。这个问题的一种解决办法是使用速度更快、功能更强大的微控制器,但最终软件在实时环境中能做的事情是有限的。一些高速实时功能必须在硬件中实现。

Arduino 和 FPGA 结合

挑战在于让使用 Arduino 的嵌入式开发人员能使用 FPGA 资源,但又不破坏 Arduino 的简易性。Arduino 从硬件角度解决了这一挑战:将 FPGA 添加到 Arduino 架构中,使得 FPGA 可通过 Arduino 库扩展 Arduino 的微控制器外设资源。现有 Arduino 用户很熟悉这些库;当使用 Arduino 的原生外设时,以及向 Arduino 扩展排针添加外设板时,经常会使用这些库。

由此产生的 Arduino 开发板称为 MKR Vidor 4000,其结合了基于 32 位 Arm® Cortex®-M0+ 处理器内核的 Microchip Technology SAMD21 低功耗微控制器的处理能力与 Intel(前身为 Altera)Cyclone 10 10CL016 FPGA(图 1)。

微处理器

图 1:Arduino MKR Vidor 4000 开发板基于 Microchip SAMD21 微控制器和 Intel Cyclone 10 FPGA。(图片来源:Arduino)

该 FPGA 包含 15,408 个可编程逻辑单元、516,096 比特的嵌入式 RAM 和 56 个 18 x 18 位硬件乘法器,可用于实现高速 DSP。每个 FPGA 的 I/O 引脚切换速度快于 150 兆赫兹 (MHz),这比板载 SAMD21 微控制器的 I/O 速度要快得多。简而言之,板载 FPGA 为 Arduino MKR Vidor 4000 板提供了可观的处理和 I/O 能力。

Arduino MKR Vidor 4000 属于 Maker Arduino 板系列,其新式 MKR 外形尺寸与之前的 Arduino 板不相符。MKR 系列还包括:

Arduino MKR WAN 1300 连接板,带有用于物联网应用的板载 LoRa 射频模块

Arduino MKR GSM 1400 连接板,带有板载蜂窝 RF 模块,适合于需要全球 GSM 连接的物联网应用

与之前的 Arduino 开发板一样,Arduino 的 MKR 系列不仅是针对初学者而开发,专业人员同样可以使用它来快速开发系统原型。Arduino 组织发现越来越多的正规工程项目使用 Arduino 开发板进行原型开发甚至生产,因而开发了该系列板。

Arduino MKR Vidor 4000 包括许多外设,其中有几个是较早期、较简单的 Arduino 所不曾涉及的。有一个 28 针 MKR 排针接口,其与最初的 Arduino 扩展板排针在概念上相似,但在物理上不同。该排针接口中的 I/O 引脚可由 SAMD21 微控制器或 Intel Cyclone 10 FPGA 控制。除了标准化 MKR 排针接口外,Arduino MKR Vidor 4000 板上的外设端口列表还包括:

微型 USB 连接器

微型 HDMI 视频输出连接器

与 Raspberry Pi 相机模块兼容的 MIPI 摄像机连接器

采用 U-BLOX NINA-W102 射频收发器模块实现的 Wi-Fi 和 BLE(低功耗蓝牙)RF 接口

MiniPCIe 连接器,具有多达 25 个用户可编程引脚

请注意,Arduino MKR Vidor 4000 开发板没有真正的 PCIe 接口端口。它只是改造了与 MiniPCIe 端口相关的连接器,在 MiniPCIe 边缘连接器上分接出 Cyclone 10 FPGA 的许多 I/O 引脚。这是一种经济实惠的大容量连接器,现已广泛应用于数以百万计的 PC 主板中,这足以证明其可靠性。MiniPCIe 连接器可用来轻松地将 Arduino MKR Vidor 4000 板插入更大的系统或 I/O 扩展板中。

尽管有如此多的 I/O 连接器,Arduino MKR Vidor 4000 开发板却很小。其尺寸为 83 mm(3.25 英寸)× 25 mm(0.98 英寸),这样便适合安装在嵌入式计算应用越来越常见的狭小空间中。该板的电流消耗额定值为 100 毫安 (mA),因此应当也适合许多嵌入式系统项目的功率包络,其中包括电池供电系统。

该板有一个用于直接连接 3.7 伏锂聚合物 (LiPo) 电池的连接器,如图 1 所示。但是,电流消耗将取决于 FPGA 中实现的功能以及实例化硬件的运行速度,这会使电池容量的计算变得复杂,最终将需要进行一些实验才能确定电池的正确大小。

MKR Vidor 4000 板的视频输出是由 Intel Cyclone 10 FPGA 生成的真正 HDMI 视频输出。Arduino MKR Vidor 4000 板的 Arduino IDE 中包含了 Adafruit GFX 图形核心库,这允许 SAMD21 微控制器使用 Arduino 草图在软件控制下生成图形。

此外,Arduino 还通过两个专门为 MKR Vidor 4000 板创建的主库向 Arduino IDE 添加了几个硬件 IP 块:VidorPeripherals 和 VidorGraphics。当 Arduino 草图中包含相关外设库时,Arduino MKR Vidor 4000 上的 Intel Cyclone 10 FPGA 会自动构建这些硬件 IP 块。目前的外设 IP 块清单包括:

I2C 端口

SPI 端口

UART

高频 PWM 控制器

高速定时器

高速正交解码器

Adafruit Neopixel 可寻址 RGB 智能 LED 控制器

同样,Arduino MKR Vidor 4000 板的软件库包含用于该板 MIPI 摄像头输入的视频捕获代码。此库中的例程可以从连接的摄像头中捕获 640 x 480 像素视频图像。摄像头的 24 位 RGB 图像存储在开发板的 8 MB SDRAM 中,该 SDRAM 直接连接到 Cyclone 10 FPGA。此外,可以使用 Arduino MKR Vidor 4000 板的其中一个 I2C 接口访问所连摄像头的控制和状态寄存器。

其中一些外设(例如 I2C 和 SPI)已经作为软件 IP 块用于早前的 Arduino 板。这些早期软件实现与 Arduino MKR Vidor 4000 板的 FPGA 上实现的等效 IP 块的区别在于,FPGA 版本的外设性能更好。

例如,每个 I2C 和 SPI 实例化都是通过板上 FPGA 内部的独立可编程硬件块实现的。因此,实例化若干个这样的串行端口时没有性能损失。

FPGA 速度示例:快速正交编码

正交编码器常用作 3D 打印机所用步进电机的定位反馈机制。基于软件的编码器可能会出现问题,因为其速度有限;当处理器忙于执行其他代码时,这些编码器可能会错失计数。Arduino MKR Vidor 4000 板的正交编码器是在 Cyclone 10 FPGA 硬件中实现实例化,其时钟频率为 100 MHz,并采用 32 位硬件计数器实现,因此在任何实际物理系统中都不会错失计数。

每个实例化的正交编码器都利用单独的 FPGA 块实现,因此实例化多个编码器时不会有性能损失。若要实现更多编码器,只需要使用 FPGA 的更多内部可编程逻辑。这是 FPGA 硬件并行性的关键优势。

轻松使用 FPGA — Arduino 方式

通过以 FPGA 硬件实现外设块,并借助无数 Arduino 草图编写人员已经熟悉的相同库机制使其可用,Arduino MKR Vidor 4000 板简化了 FPGA 的使用。无需学习 VHDL 或 Verilog 之类新的硬件描述语言 (HDL)。对于开发人员来说,基于 FPGA 的外设与程序员眼中的任何其他 C++ 对象并无二致。Arduino 计划日后添加更多此类硬件 IP 块外设。

Arduino 已经完成了这个魔法,通过使用的软件堆栈远远低于最初 Arduino IDE 的软件堆栈,让 FPGA 硬件看起来就像硬件化的外设块。MKR Vidor 4000 板的软件堆栈使用远程过程调用在 Arduino C++ 版本编写的高级草图与开发板的 FPGA 硬件之间建立链接;这些过程调用发送到 FPGA 上实例化的邮箱,而 FPGA 通过 JTAG 连接到 SAMD21 微控制器(图 2)。

微处理器

图 2:Arduino MKR Vidor 4000 开发板的软件堆栈使用远程过程调用,其通过 JTAG API 传输到 Intel Cyclone 10 FPGA,而 FPGA 可编程硬件上实例化了一个 Arduino 驱动器。(图片来源:Steve Leibson)

使用此软件堆栈访问基于 FPGA 的外设非常简单,只需正确调用适当的 Vidor 外设库即可。Arduino 草图编写人员不必知道 Vidor 的 FPGA 魔法工作原理。它切实有效。

要借助 FPGA 提升系统性能,一种有效的方法当然是访问利用可编程硬件实现的预定义外设 IP 块,不过这样获得的性能提升仅仅是 FPGA 全部能力的一小部分。尽管如此,Arduino 仍然鼓励 MKR Vidor 4000 用户开发更多外设块,以便通过庞大的 Arduino 开源社区扩大选择范围。

然而,Arduino MKR Vidor 4000 板还不是通用的 FPGA 开发板,因为它不支持使用 HDL 代码对板载 Cyclone 10 FPGA 直接编程。不过,Arduino 还计划发布一个 Intel Quartus 项目,演示直接在 MKR Vidor 4000 板上实现 FPGA HDL 代码,从而让更多高级用户可以通过 Arduino MKR Vidor 4000 板的 FPGA 来实现更多用途。Quartus 是一款全面的 HDL 开发工具,Intel 将其提供给设计人员开发采用该公司 FPGA 的 FPGA 设计。

当 Arduino 为 Arduino MKR Vidor 4000 板发布此 Quartus 项目时,想要学习 HDL 编程的设计师、工程师、创客和学生们将能把该板用作更高级 FPGA 项目的低成本开发与生产平台。借助这种直接 FPGA 编程功能,设计人员将能在 Arduino MKR Vidor 4000 板的 FPGA 中实例化几乎任何类型的硬件块。例如,板载 FPGA 资源足以在 FPGA 结构中容纳 Arm Cortex-M1 处理器内核。这样做将会把 Arduino MKR Vidor 4000 板变换成双处理器嵌入式系统。

总结

虽然 FPGA 与微控制器或微处理器一起能为许多处理功能提供更高的性能,但这需要很长的学习曲线。Arduino MKR Vidor 4000 板和配套的 Arduino IDE 大大降低了学习如何使用 FPGA 开发更高级应用的门槛。想要了解 FPGA“水有多深”的设计人员可能会发现,Arduino MKR Vidor 4000 这个池塘中的水不深也不浅,刚刚合适。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分