Verilog 或 Vivado HLS 或 Vivado SDSoC

Verilog or Vivado HLS or Vivado SDSoC

我想将我用 C++ (OpenCV) 编写的车道检测代码转换为 FPGA。 Vivado HLSVivado SDSoC可以帮助将C++代码嵌入到FPGA中。或者我可以用 verilog 重写车道检测代码。问题是,这三种方式各有什么优缺点? 我想使用一种便宜的 Zynq-7000 FPGA。

SDSoc更好更简单,HLS像个黑盒子,连UG902都有那么多页

仅代表个人意见

看看Xilinx XAPP1167 and the Xilinx HLS Video Library Wiki

该应用说明已有数年历史(比 SDSoC 工具更早),但具有使用 HLS 在 Zynq 中加速 OpenCV 应用程序的参考设计。

我无法与 SDSoC 交谈,但我强烈建议从 HLS 开始,而不是在 Verilog 中重写。听起来您对 HLS 的 use-case 完全有意:在 FPGA 中实现现有的 C++ 应用程序。它的缺点是 (1) 您可能需要稍微修改您的代码,因为 HLS 不支持所有 C++ 功能,并且 (2) 性能可能不如纯 Verilog 实现那么好。

即使您有硬件设计经验,手动将 C++ 转换为 Verilog 也需要付出很大的努力。我会避免这种方法,除非 HLS 或 SDSoC 不能为您提供所需的性能。

如今 Verilog 被认为是低级的。将其与软件实现的汇编进行比较。人们使用它只是为了获得他们在软件领域使用高级语言(例如 C 或 Java 无法获得的性能。

在硬件领域,C(用于 Vivado HLS)或 OpenCL 被认为是高级语言。 OpenCL 的开发考虑了对 GPU 和 CPU 等其他架构的可移植性。然而,与 Vivado HLS 相比,它在与 FPGA 通信方面的开销要大得多。

Vivado HLS 本身仅生成 VHDL 或 Verilog 中的硬件模块,您仍然需要将其连接到 FPGA 引脚、ARM 处理器等。它不负责与您的模块的通信。您仍然需要自己将模块集成到 Vivado 模块设计或顶层 VHDL 或 Verilog 实现中。

SDSoC,而不是 "Vivado SDSoC" 顺便说一下,它还允许您用 C 语言编写整个实现(硬件和软件)。在底层,它将调用 Vivado HLS 来实现硬件模块。之后,该工具将负责在您的硬件和板载 ARM 处理器之间实现一个接口,该接口将 运行 软件。

总而言之,除非您有充分的理由不使用它,否则我推荐 SDSoC。然而,我确实要警告,分析 Vivado HLS 的综合结果比分析 Vivado 的 Verilog 或 VHDL 输出要困难得多。因此,我总是建议首先确保您的代码作为软件实现工作。以最小的努力,您应该能够在 gcc 或其他编译器中编译任何代码。不要使用综合结果来调试您的代码,而只是为了分析性能。

开始使用 OpenCL SDAccel 或英特尔 SDK。 OpenCL 冗长且定义明确 API - 这是一件好事。它非常容易学习,您可以执行类似于 Verilog/VHDL 的多模块实例的并行代码执行。 OpenCl 与 HLS 的优势在于不需要重新发明整个系统来管理数据、I/O、管道。等。您在 OpenCL BSP(英特尔)或 shell(XILINX)中获得了相当多的辅助逻辑。是的,开始阅读这些冗长的指南。

我会推荐 SDAccel,因为它对 C++ "software" 用户更友好。同时,不要在这方面引用我的话,但我认为他们提供了开箱即用的 OpenCV 实现,这意味着您可能只需要修改 non-OpenCV 代码即可实现您想要的性能。