从OpenCV代码转换为FPGA代码比从Matlab代码转换更容易吗?

8
我希望做一个图像处理项目。如果我想要在FPGA上实现这个项目,我应该选择哪个工具作为第一阶段:Matlab还是Open CV?并且是否可能直接将Open CV的代码转换为FPGA,就像从Matlab到FPGA可以使用代码生成器一样?

不确定,但那很不可能。 - Marc Claesen
这取决于你更喜欢哪一个。我会选择Matlab,因为它更稳定、更成熟,而且更容易调试。 - FarhadA
现在实现这一点的最佳方式是使用树莓派,是的!您可以直接访问传感器或执行器。 - FreddicMatters
3个回答

16

首先,为什么要使用FPGA?除非你有充分的理由,否则请避免使用!

好的理由可能包括:

  • 成本
  • 功耗
  • 尺寸
  • 必须重复使用的现有硬件
  • 个人兴趣
  • 这是一项强制使用FPGA的任务

不好的理由包括“图像处理...那肯定需要使用FPGA!”


考虑FPGA

如果要在FPGA上实现,您需要从一开始就考虑“FPGA”。与传统处理器相比,它们具有非常特殊的特性,这意味着许多“传统”算法在FPGA上实现起来非常困难。而传统处理会遇到困难的其他算法在FPGA上实际上可以很容易地完成。

一个经典的(非图像)例子是CRC计算,通常使用软件中的查找表来实现,但在FPGA上可以是一个简单的移位寄存器和XOR门。

关于代码生成器...

曾经有一个产品(AccelDSP)可以采用(非常谨慎制作的)Matlab代码并生成VHDL,后来被Xilinx收购,但表现不佳并已退出。

Matlab拥有HDL Coder,它声称可以完成相同的工作,还可以处理Simulink图。我很久以前评估过它 - 我不知道现在它有多好(尽管它的价格惊人!)。从网页上看,它似乎仍然只支持Matlab函数(而不是用户定义对象),这对于存储状态的任何内容都是不可行的(在我看来),因为所有状态都必须存储在函数外面,这意味着您必须有一个带有所有寄存器的“输入”和“输出”struct。与AccelDSP遇到的问题相同。

Xilinx System Generator和Altera的System Builder都使用Simulink作为生成FPGA代码的前端。它们可以相当成功,但要注意,您不能只是随意地将复杂的Simulink块放在一起,并希望产生可综合的FPGA。

再次强调,您必须从一开始就考虑FPGA。

FPGA特点

无论何时使用比较性词语,我都是与“传统桌面处理器”进行比较的。

  • FPGA内存贫乏,但它们有许多小块,这意味着它们的总体内部带宽可以是巨大的,如果您有足够的小任务要做。内存也非常低延迟(单个时钟周期),非常像处理器的L1高速缓存
  • 选择(类似于if...else功能)在FPGA领域中的面积成本可能相当昂贵
  • 乘法是一种受限制的资源,因此有时使用来自“早期”的算法(当处理器没有MUL指令时)会更加划算
  • 位宽可以任意 - 没有必要使用32位元素来表示计算结果的18位。大多数情况下,工具可以自动完成这项工作。

开发周期也不同。

  • 模拟编译和运行相对较快。确保您要大量进行此操作
  • 实际的综合和布局(使您获得可以编程到FPGA芯片本身的“位流”操作)可能需要很长时间才能运行。我的当前编译(相对较小)只需要30分钟。您应尽可能避免执行此操作!

1
Mathworks仍然提供HDL编码器产品。以下是最近的博客文章,展示了如何使用代码生成将图像处理算法从MATLAB转换为FPGA:http://blogs.mathworks.com/loren/2013/04/11/matlab-to-fpga-using-hdl-codertm/ - Amro

11

Xilinx有一个名为Vivado HLS的工具。

还有一篇应用笔记(XAPP1167),介绍如何使用该工具在Zynq平台上定位OpenCV。

我没有使用过这个工具,但是在最近的OpenCV会议上了解到了它。以下是应用笔记的开头:

本应用笔记描述了如何在Zynq设备上使用OpenCV库开发计算机视觉应用程序。OpenCV可以在设计过程的许多不同点使用,从算法原型设计到系统内执行。 OpenCV代码还可以使用与Vivado HLS一起提供的视频库迁移到可综合的C ++代码。当集成到Zynq设计中时,合成块使高分辨率和帧速率的计算机视觉算法得以实现。

Altera支持OpenCL,这是一种广泛的规范,用于并行化ANSI C。有一个OpenCV模块可用于OpenCL。再次声明,我还没有使用过这个(尚未;))。

此链接有助于理解在主机和硬件加速器(如FPGA开发板)的上下文中使用OpenCL的方法。

因此,如果您想选择Altera路线,那么您需要使用上面提到的OpenCV模块将您的OpenCV函数包装在OpenCL中,然后使用Altera的SDK来针对fpga进行目标设置。选择这条路线的好处是,如果您发现FPGA不适合您的应用程序,那么您可以将OpenCL+OpenCV定位到其他平台。


我忘了提到,Altera和Xilinx都有工具可以让你从Matlab转换到HDL。在Altera的情况下,你可以通过一些开发板免费获得这些工具。 - shparekh

0

Matlab提供了对HDL的支持。它提供了包,您可以直接将matlab代码转换为HDL代码。您还可以将其用于编程FPGA。

HDL Coder

另一方面,由于库的原因,将Opencv转换为HDL语言并不容易。您可以轻松地将面向对象编程(OOPs)语言,如C ++,转换为Verilog / VHDL,但由于“OpenCV库”,这会创建一些问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接