罗兰在MATLAB的艺术

把想法变成MATLAB

请注意

罗兰在MATLAB的艺术已经退休,不会被更新。

MATLAB FPGA使用HDL编码器(TM)

这是我的荣幸介绍来宾博客Kiran Kintali。Kiran产品开发领导高密度脂蛋白编码器在MathWorks。在这篇文章中,Kiran引入了一个新的能力HDL编码器™产生synthesizable硬件描述语言(VHDL) / Verilog代码直接从MATLAB和突出的一些关键特性的新的基于MATLAB的工作流。

内容

介绍高密度脂蛋白从MATLAB代码生成

如果您正在使用MATLAB模拟数字信号处理(DSP)或视频和图像处理算法,最终在fpga和asic读下去……

fpga提供良好的通用处理器之间的妥协(gpp)和特定于应用程序的集成电路(asic)。gpp是完全可编程但是效率较低的功率和性能;asic实现专用的功能,展示最好的力量和性能特征,但需要非常昂贵的设计验证和实现周期。fpga在ASIC工作流对硬件也用于原型验证和软件开发早期。

由于数量级高通量运行时性能提高,高性能的应用程序,算法设计者越来越多地使用fpga原型和验证他们的创新,而不是使用传统的处理器。然而,很多算法在MATLAB中实现由于简单易用的编程模型和丰富的分析和可视化功能。当针对fpga和asic这些MATLAB算法必须手动翻译高密度脂蛋白。

对于许多算法开发人员精通的与软件编程范式,掌握FPGA设计工作流是一个挑战。与软件算法开发、硬件开发需要认为平行。其他的障碍包括:硬件描述语言(VHDL)或Verilog语言学习,掌握与FPGA供应商ide,和理解深奥的“多循环路径”和“延迟平衡”。

在这篇文章中,我描述了一个简单的路径从MATLAB fpga。我将向您展示如何从MATLAB算法自动生成HDL代码,实现FPGA的HDL代码,并使用MATLAB验证HDL代码。

MATLAB硬件工作流

翻译MATLAB设计硬件的过程包括以下步骤:

  1. 模型算法在MATLAB -使用MATLAB模拟,调试和反复试验和优化设计。
  2. 生成HDL代码,自动创建为FPGA原型HDL代码。
  3. 验证HDL代码——重用你的MATLAB试验台验证生成的HDL代码。
  4. 创建和验证FPGA原型——在FPGA实现和验证你的设计。

有一些独特的挑战在翻译MATLAB硬件。MATLAB程序代码,可以高度抽象的;它可以使用浮点数据并没有时间的概念。复杂的循环可以推断出从矩阵运算和工具箱函数。

在硬件实现MATLAB代码包括:

  • 将浮点MATLAB代码转换为定点MATLAB代码优化宽度适合高效的硬件的一代。
  • 识别和程序结构映射到并行区域,speed-optimized硬件操作。
  • 引入时间的概念,通过添加时钟和时钟频率安排硬件的操作。
  • 创建资源共享体系结构实现昂贵运营商乘数和for循环的身体。
  • 映射大持续阻止RAM阵列硬件

高密度脂蛋白编码器™简化上面的任务虽然工作流自动化。

例子MATLAB算法

让我们来一个MATLAB函数实现直方图均衡化和经过此工作流。这个算法,在MATLAB中实现,提高图像对比通过改变值的强度图像,输出图像的直方图基本持平。

类型mlhdlc_heq.m

%直方图均衡化算法函数[pixel_out] = mlhdlc_heq (x_in、y_in pixel_in,宽度、高度)
持续的柱状图持续的transferFunc持续的histInd持续的cumSum
如果isempty(直方图)直方图= 0 (1、2 ^ 8);transferFunc = 0 (1、2 ^ 8);histInd = 0;cumSum = 0;结束
%计算出指标基于我们的框架如果y_in <高度& & x_in <宽度%有效像素数据histInd = pixel_in + 1;elseify_in = = & & x_in高度= = 0%的第一列高度+ 1histInd = 1;elseify_in > =身高%垂直消隐期histInd = min (histInd + 1、2 ^ 8);elseify_in <高度%水平消隐——什么都不做histInd = 1;结束
%读直方图histValRead =直方图(histInd);
%读传递函数transValRead = transferFunc (histInd);
%如果有效的框架的一部分添加一个像素本并保持func val转移如果y_in & & x_in < <高度宽度histValWrite = histValRead + 1;%增加本像素transValWrite = transValRead;%写返回相同的值cumSum = 0;elseify_in > =身高%在消隐时间指数通过所有的箱子和重置为零histValWrite = 0;transValWrite = cumSum + histValRead;cumSum = transValWrite;其他的histValWrite = histValRead;transValWrite = transValRead;结束
%写直方图直方图(histInd) = histValWrite;
%写成传递函数transferFunc (histInd) = transValWrite;
pixel_out = transValRead;

例子MATLAB试验台

这是试验台,验证算法与图像一个例子。(注意,这个testbench使用图像处理工具箱函数读取原始图像和策划转换后的图像均衡化之后。)

类型mlhdlc_heq_tb.m

% %试验台对直方图均衡化算法清晰的mlhdlc_heq;测试文件=“office.png”;RGB = imread(测试文件);
%得到强度彩色图像的一部分YCBCR = rgb2ycbcr (RGB);imgOrig = YCBCR (:: 1);
尺寸(高度、宽度)= (imgOrig);imgOut = 0(高度、宽度);hBlank = 20;%确保我们有足够的垂直消隐过滤柱状图vBlank =装天花板(2 ^ 14 /(宽+ hBlank));
帧= 1:2 disp ([在框架的工作:“num2str(帧)]);+ vBlank-1 y_in = 0:高度% disp([框架:,num2str(帧),2、行:,num2str (y_in)]);x_in = 0:宽度+ hBlank-1如果x_in <宽度& & y_in <高度pixel_in =双(imgOrig (y_in + 1, x_in + 1));其他的pixel_in = 0;结束
[pixel_out] = mlhdlc_heq (x_in、y_in pixel_in,宽度、高度);
如果x_in <宽度& & y_in <高度imgOut (y_in + 1, x_in + 1) = pixel_out;端端端端
%利用平衡的彩色图像强度图像%重新调节图像imgOut =双(imgOut);imgOut (:) = imgOut / max (imgOut (:));imgOut = uint8 (imgOut * 255);
YCBCR (:,: 1) = imgOut;RGBOut = ycbcr2rgb (YCBCR);
图(1)次要情节(2 2 1);imshow (RGB, []);标题(原始图像的);次要情节(2,2,2);imshow (RGBOut []);标题(“平衡的形象”);次要情节(2、2、3);嘘(双(imgOrig(:)), 2 ^赔率);标题(原始图像的直方图);次要情节(2、2、4);嘘(双(imgOut(:)), 2 ^赔率);标题(平衡的图像的直方图);

让我们看到结果模拟算法。

mlhdlc_heq_tb
研究框架:1研究框架:2

高密度脂蛋白工作流顾问

高密度脂蛋白工作流顾问(参见下面的快照)帮助自动化的步骤和硬件提供了一个从MATLAB引导路径。你可以看到下面的关键步骤的工作流在左窗格中工作流顾问:

  1. 定点转换
  2. HDL代码生成
  3. 高密度脂蛋白验证
  4. 高密度脂蛋白的合成和分析

让我们来看看每个工作流详细步骤。

定点转换

信号处理在MATLAB应用程序通常使用浮点操作实现。然而,对于权力、成本和性能的原因,这些算法时,需要转换为使用定点操作针对硬件。定点转换可以非常具有挑战性的,耗时的,通常要求25 - 50%的总设计和实现。定点转换工作流程的自动浮点HDL编码器™可以极大地简化和加速这一转换过程。

定点的浮点转换工作流程包括以下步骤:

  1. 验证浮点设计与代码生成兼容。
  2. 提出定点类型计算范围的基础上,通过仿真的testbench或静态分析,传播设计范围计算派生的所有变量的范围。
  3. 生成定点MATLAB代码通过应用提出定点类型。
  4. 验证所生成的定点代码生成和比较的数值精度定点代码与原浮点代码。

注意,这一步是可选的。你可以跳过这一步如果MATLAB设计已经实现定点。

HDL代码生成

HDL代码生成步骤生成HDL代码从定点MATLAB代码。您可以生成硬件描述语言(VHDL)或Verilog代码实现MATLAB设计。除了生成synthesizable HDL代码,高密度脂蛋白编码器™还生成各种报告,包括一个可跟踪性报告,帮助您浏览MATLAB代码和生成的HDL代码之间和资源利用率的一份报告显示,在算法层面,大约需要哪些硬件资源来实现设计的蛇,乘数和公羊。

在代码生成,您可以指定各种优化选项来探索设计空间,而无需修改你的算法。在设计空间探索和优化选项部分下面,你可以看到如何修改代码生成选项和优化你的设计速度或区域。

高密度脂蛋白验证

独立的HDL试验台一代:

高密度脂蛋白编码器™生成硬件描述语言(VHDL)和Verilog测试长椅从MATLAB脚本生成的HDL代码的快速验证。你可以定制一个高密度脂蛋白试验台使用各种选项,刺激适用于HDL代码。你也可以生成脚本文件自动编译和仿真的过程代码在高密度脂蛋白模拟器。这些步骤有助于确保MATLAB仿真的结果与高密度脂蛋白仿真的结果。

高密度脂蛋白编码器™也适用高密度脂蛋白验证器自动生成两种类型的cosimulation testbenches:

  • 高密度脂蛋白cosimulation-based验证与导师图形®ModelSim®和QuestaSim®, MATLAB和高密度脂蛋白模拟同步发生。
  • FPGA-in-the-Loop仿真允许您运行一个MATLAB仿真和FPGA板严格同步。您可以使用MATLAB来满足现实世界数据到你的FPGA设计,并确保该算法在硬件中实现时按预期行为。

高密度脂蛋白的合成

除了语言学习的挑战,为fpga编程需要复杂的EDA工具的使用。生成一个比特流HDL设计和编程的FPGA可以令人生畏的任务。高密度脂蛋白编码器™提供自动化,通过创建项目文件Xilinx®和阿尔特拉®配置生成的HDL代码。您可以使用工作流步骤合成HDL代码在MATLAB环境中,看到的结果合成,MATLAB设计迭代来改进合成的结果。

设计空间探索和优化选择

高密度脂蛋白编码器™提供了以下优化来帮助你探索设计空间面积和速度之间权衡。您可以使用这些选项来探索各种架构和权衡,而无需手动改写你的算法。

速度优化

  • 流水线:提高设计的时钟频率,HDL编码允许您插入管道注册在你的设计在不同地点。例如,您可以插入在设计输入和输出寄存器,并在给定的MATLAB的输出变量算法。
  • 分布式流水线:高密度脂蛋白编码器还提供了一个优化的基础上重新定时自动移动管道寄存器插入时钟频率最大化,通过最小化的延迟通过组合路径设计。

区域的优化

  • 内存映射:高密度脂蛋白编码器™矩阵映射到电线或在硬件寄存器。如果持续的矩阵变量映射到寄存器,它们会占用大量的FPGA。高密度脂蛋白编码器™自动地图持久矩阵块RAM来提高效率。在MATLAB矩阵映射到块RAM的挑战是块RAM的硬件通常有一个有限的读写端口。高密度脂蛋白编码器™解决这个问题通过自动分区和调度矩阵读写荣誉块RAM的端口限制,同时还向其他控制和数据依赖的设计。
  • 资源共享:这种优化识别功能与乘数在MATLAB代码和股票业务。你可以控制的乘数共享设计。
  • 循环流:硬件描述语言(VHDL)的MATLAB循环创建一个FOR_GENERATE循环。多次循环复制的主体在硬件循环迭代的数量。这导致低效的使用面积。循环流优化创建一个单一的硬件实例的循环体time-multiplexed在循环迭代。
  • 常数乘数优化:这个设计水平优化将常数因子转化为改变和添加操作使用规范签名的数字(CSD)技术。

最佳实践

现在,让我们来看看相关的一些最佳实践,针对fpga时编写MATLAB代码。

在编写MATLAB设计:

  • 使用代码生成的子集MATLAB支持HDL代码生成。金宝app
  • 保持高层接口尽可能简单。顶级函数大小、类型和复杂性决定芯片在硬件中实现的接口。
  • 不通过大量的并行数据设计。并行数据需要大量的IO针芯片,,可能不会被synthesizable。在一个典型的图像处理设计,你应该序列化像素作为输入,缓冲他们内部的算法。

当编写MATLAB实验台:

  • 从testbench函数调用的设计。
  • 练习的设计。这对浮点定点转换尤为重要,而高密度脂蛋白编码器™决定了范围的变量算法基于testbench分配的变量的值。您可以重用此testbench产生高密度脂蛋白testbench测试生成的硬件。
  • 模拟设计与代码生成前testbench模拟确保没有错误,并确保所有必需的文件路径。

结论

高密度脂蛋白编码器™提供了一个无缝的工作流,当你想在一个FPGA实现算法。在这篇文章中,我向您展示了如何用MATLAB图像处理算法,将其转换为定点,生成HDL代码,使用试验台验证生成的HDL代码,最后,综合在硬件的设计和实现。

看到这个文章高密度脂蛋白编码器的客户之一,如何FLIR利用MATLAB HDL工作流能达到良好的结果。你也可以了解更多关于此工作流使用该产品的例子坐落在这里。

我们希望这个简短的介绍了高密度脂蛋白编码器™和MATLAB-to-HDL代码生成、验证框架展示了如何快速开始实现你的MATLAB设计和目标fpga。请在评论中让我们知道这篇文章如何使用这个新功能。或者,如果你已经尝试使用HDL编码器™,让我们了解你的经历在这里




发表与MATLAB®R2013a

|
  • 打印
  • 发送电子邮件