首先,为什么要使用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。
无论何时使用比较性词语,我都是与“传统桌面处理器”进行比较的。
if...else
功能)在FPGA领域中的面积成本可能相当昂贵开发周期也不同。
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定位到其他平台。
Matlab提供了对HDL的支持。它提供了包,您可以直接将matlab代码转换为HDL代码。您还可以将其用于编程FPGA。
另一方面,由于库的原因,将Opencv转换为HDL语言并不容易。您可以轻松地将面向对象编程(OOPs)语言,如C ++,转换为Verilog / VHDL,但由于“OpenCV库”,这会创建一些问题。