典型的FPGA方法:如何开始使用Digilent的开发板

电子说

1.3w人已加入

描述

过去,设计人员倾向于使用现场可编程门阵列 (FPGA) 在硬件设计中提升计算密集型应用的性能,例如计算机视觉、通信、工业嵌入式系统,以及越来越多的物联网 (IoT)。然而,传统 FPGA 编程中涉及的繁琐步骤一直让人望而却步,促使设计人员到目前都还在寻求替代处理解决方案。

基于 Jupyter 笔记本的 Python Productivity for Zynq (PYNQ) 开发环境的问世,解决了 FPGA 的可编程性问题。使用专为支持 PYNQ 而设计的开发板,即使 FPGA 经验很少的开发人员也可快速实现相关设计,从而充分利用 FPGA 性能来加快计算密集型应用。

本文将说明典型的 FPGA 方法,然后介绍并演示如何开始使用 Digilent 的开发板。该开发板为快速开发基于 FPGA 的系统提供了一种强大的开源替代方法。

为何使用 FPGA?

若需要使用计算密集型复杂算法,工程师常常依赖 FPGA 提高执行速度,同时又不影响紧张的功率预算。实际上,FPGA 已成为在边缘计算系统中提高人工智能算法速度的主流平台。

更先进的 FPGA 片上系统 (SoC) 器件专为嵌入式应用而设计,将可编程逻辑 (PL) 结构与微控制器集成在一起。例如,Xilinx 的 Zynq-7000 SoC 在集成式可编程逻辑 (PL) 结构中结合了一个 Arm® Cortex®-A9 双核处理器系统,以及最多 444,000 个逻辑单元(图 1)。除了内置处理器和全套外设外,Zynq SoC 还提供最多 2,020 个数字信号处理 (DSP) 块(或称切片)。开发人员使用这些资源,便可将 PL 结构配置到专用的处理链中,以便在复杂的计算密集型算法中提高吞吐量。

微控制器

图 1:Xilinx 的 Zynq-7000 SoC 结合了 Arm Cortex-A9 双核处理器、可编程逻辑结构,以及很多嵌入式应用中所需的全套外设和接口。(图片来源:Xilinx)

除了可减少元器件数量外,处理器与 PL 结构的集成还允许通过片上总线而不是片外访问来执行运算。这种集成也进一步简化了在上电或复位序列期间,加载 PL 结构的关键任务。

在使用 FPGA 构建的基于微控制器的典型系统中,开发人员需要管理用于加载 FPGA 编程比特流的序列和安全性。在 Zynq SoC 中,集成的处理器负责执行常规微控制器的任务,包括管理 PL 结构和其他片上外设。因此,与传统的 FPGA 比特流初始化相比,该 FPGA 加载过程更接近于常规微控制器的引导过程。

该引导过程通过由其中一个 Zynq 处理器管理的短步骤序列完成(图 2)。上电或复位时,如果 Zynq 处理器执行其只读 BootROM 中的一小段代码,以从引导设备获取实际引导代码,则引导过程开始。除了用于配置处理器系统组件的代码外,引导代码还包含 PL 比特流以及用户应用。当引导代码加载完成时,处理器使用其中包含的比特流来配置 PL。而完成组件和 PL 的配置后,该器件开始执行引导代码中包含的应用。

微控制器

图 2:在类似于常规微控制器的引导序列中,Xilinx 的 Zynq-7000 SoC 运行 Boot ROM 中的代码来加载和执行引导加载程序,该加载程序负责处理后续阶段,包括使用引导代码中封装的比特流来配置可编程逻辑结构。(图片来源:Xilinx)

即使有了简化的 PL 加载处理,开发人员在过去仍需自行处理复杂的 FPGA 开发过程,才能生成所需比特流。对于希望利用 FPGA 性能的开发人员来说,传统的 FGPA 开发过程仍然是他们实现设计的一大障碍。Xilinx 通过其 PYNQ 环境有效地消除了这一障碍。

PYNQ 环境

在 PYNQ 中,PL 比特流封装在预先构建的库中。这些库称为覆盖层,在开发过程和执行环境中,其角色与软件库类似。在引导加载过程中,与所需覆盖层相关联的比特流将配置 PL 结构。不过,对于通过与每个覆盖层关联的 Python 应用程序编程接口 (API) 来利用覆盖层功能的开发人员而言,该过程保持透明。在开发过程中,工程师可以根据需要组合软件库和覆盖层,通过其各自 API 来实现应用。在执行过程中,处理器系统像往常一样执行软件库代码,而 PL 结构负责实现覆盖层中提供的功能。这样做的结果是可以提升性能,从而进一步促使开发人员对日益严苛应用进行 FPGA 设计的兴趣。

顾名思义,PYNQ 利用了与 Python 编程语言相关的更高开发生产力。Python 之所以能够成为顶级语言之一,不仅是因为其相对简单,还因为它具有庞大且不断扩增的生态系统。开发人员可能会在 Python 开源模块的存储库中,找到支持服务或专用算法所需的软件库。与此同时,开发人员可以使用 C 语言实现关键功能,因为 PYNQ 使用常见 C 语言实现 Python 解释器。该实现允许轻松访问数千个现有 C 语言库,并简化开发人员提供的 C 语言库的使用。尽管经验丰富的开发人员可以使用专用硬件覆盖层和 C 语言软件库来扩展 PYNQ,但是 PYNQ 的真正优势在于,它可为任何能够构建 Python 程序的开发人员提供高生产力开发环境。

PYNQ 本身是一个开源项目,基于另一个开源项目(Jupyter 笔记本)而构建。针对通过交互方式探索算法,以及使用 Python 或任何其他受支持的编程语言(目前超过 40 种)对复杂应用进行原型开发,Jupyter 笔记本可提供极其有效的环境。Jupyter 笔记本由 Project Jupyter 基于社区共识而开发,将可执行代码行与描述文本和图形结合在一起。这一功能使各开发人员能够更有效地记录进展,而无需转到其他开发环境。例如,开发人员可以使用笔记本,将查看数据所需的数行代码与代码生成的图形结合起来(图 3)。

微控制器

图 3:来自 Xilinx 样例存储库的 Jupyter 笔记本将描述文本、可执行代码以及与应用相关的输出结合起来。(图片来源:Xilinx)

Jupyter 笔记本之所以能够同时包含代码、输出和描述文本,是因为它是一种活动文档,并在 Jupyter 笔记本服务器提供的交互式开发环境中进行维护(图 4)。在 Jupyter 会话中,服务器使用 HTTP 协议在常规 Web 浏览器中呈现笔记本文件,并对所呈现文档中的静态和动态内容应用 HTTP 和 Websocket 协议。在后端,服务器使用 ZeroMQ (ØMQ) 开源消息传递协议与代码执行内核通信。

图 4:在 Jupyter 会话中,笔记本服务器将笔记本文件的内容呈现到 Web 浏览器,同时与执行代码的后端内核进行交互。

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

全部0条评论

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

×
20
完善资料,
赚取积分