从OpenCV代码到FPGA代码的转换是否比Matlab代码更容易?

时间:2013-07-25 06:45:06

标签: matlab opencv image-processing fpga

我想做图像处理项目。我想知道我是否想在FPGA上实现这个项目,我应该在第一阶段Matlab或OPEN CV中选择哪个工具?是否有可能直接将代码从Open CV转换为FPGA,代码生成器可以直接从Matlab到FPGA使用?

3 个答案:

答案 0 :(得分:13)

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

很好的理由可能是:

  • 成本
  • 功率
  • 尺寸
  • 必须重复使用的预先存在的硬件
  • 个人兴趣
  • 这是指定FPGA的任务

不好的理由包括“图像处理......这必然意味着我需要一个FPGA!”


Think FPGA

如果你想在FPGA上实现,你需要从一开始就考虑“FPGA”。与传统处理器相比,它们具有非常特殊的特性,这意味着很多“常规”算法很难在FPGA上高效实现。传统处理难以实现的其他算法实际上可以在FPGA上完成。

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

关于代码生成器......

以前有一种Xilinx购买的产品(AccelDSP)可以采用(非常精心制作)Matlab代码并生成VHDL。它做得不好而且被撤回了。

Matlab有HDL-coder,它声称可以做同样的工作,也可以做Simulink图。很久以前我对它进行了评估 - 我不知道它现在有多好(虽然它的价格非常昂贵!)。查看网页ti似乎仍然只支持Matlab函数(不是用户定义的对象),这使得它对于存储状态(IMHO)的任何东西都不起作用,因为所有状态必须存储在函数外部,这意味着你有将所有注册表放入“in”和“out”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 :(得分:9)

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

还有一个appnote(XAPP1167)描述了使用该工具在Zynq平台上定位OpenCV。

我没有这方面的经验,但在最近的OpenCV会议上了解到了这一点。以下是appnote的开头 -

  

本应用笔记介绍了OpenCV库如何用于开发计算机   Zynq设备上的视觉应用。 OpenCV可用于许多不同的点   设计过程,从算法原型设计到系统内执行。 OpenCV代码也可以   使用随Vivado HLS提供的视频库迁移到可综合的C ++代码。   当集成到Zynq设计中时,合成块可实现高分辨率和帧   率计算机视觉算法将被实施。

Altera supports OpenCL这是一个并行化ANSI C的广泛规范。有一个OpenCV module可用于OpenCL。我再次没有这方面的经验(还有))。

This link有助于理解在主机和硬件加速器(如FPGA开发板)环境中使用OpenCL。

因此,如果您想要使用Altera路由,那么您必须使用上面提到的OpenCV模块将OpenCV函数包装在OpenCL中,然后使用Altera的SDK来定位fpga。走这条路的好处是,如果您发现FPGA对您的应用程序来说不是那么好,那么您可以将OpenCL + OpenCV定位到其他平台。

答案 2 :(得分:0)

Matlab为HDL提供支持。它提供了可以直接将matlab代码转换为HDL代码的包。您也可以使用它来编程FPGA。

HDL Coder

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