您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > Matlab硬件代码(HDL)生成
警告:本文是雷声天下将Loren的Matlab日志翻译而成,并且添加了个人的使用体验,只发布到新浪爱问平台上,愿意与广大网友共同学习分享,不得被用于任何商业场合,如有违背,必将追究责任!!!技术交流or项目探讨欢迎联系:dlbuaa@163.comMatlabMatlabMatlabMatlab硬件代码硬件代码硬件代码硬件代码(HDL)(HDL)(HDL)(HDL)生成生成生成生成本文的原作者并不是Loren二十Mathworks公司的HDLCoder产品团队的领导者KiranKintali。利用这一团队的产品可以从M代码直接生成HDL代码,本文同时给出了多种相关的Matlab软件特性。1.Matlab硬件代码生成工具的介绍如果你在用Matlab对应用于FPGA或者其他ASIC现代数字信号处理或者视频和图像处理算法建模仿真,请继续阅读FPGA给出了通用处理器(GPP)和专用集成电路(ASIC)之间的一个很好的融合方案。GPP是完全可编程器件,但是在功率消耗和性能上差强人意(必定不是专用的器件啊)。ASIC用于特定的功能在功耗和性能上有优势,但是需要经历及其昂贵的开发设计过程。FPGA同样也用于ASIC的原型设计验证过程中和软件开发中。在应用FPGA替代传统处理器对新的算法进行的原型验证的过程中,要求高吞吐率、高性能的应用场合越来越多。多数算法在Matlab中业已实现,同时也有相应的可视化分析测试功能。当目标是为了FPGA或者ASIC设计中,不得不把Matlab算法手动地转化为HDL代码。对于多数谙熟软件设计的编程者来说,掌握硬件FPGA开发设计过程是一种挑战。与软件算法开发不同,硬件开发需要设计者“并行思考”。其他的困难例如:学习VHDL或者Verilog语言、掌握FPGA生产商提供的开发软件、理解诸如“多循环路径”、“延迟均衡”术语。在这篇日志中,我将详细描述一条更容易的从Matlab到FPGA的路径。我将向你们展示如何自动将Matlab算法代码生成HDL代码、在FPGA上验证代码和用Matlab验证你的HDL代码。2从Matlab到硬件的工作流程将Matlab涉及转换成硬件包含以下步骤:(1)在Matlab中对你的算法建模-使用Matlab来仿真、调试和优化设计;(2)生成HDL代码-自动生成FPGA原型的HDL代码(3)验证HDL代码-再次使用你的Matlabtestbench来验证你的FPGA设计(4)创建和验证FPGA原型-在FPGA上应用和验证你的设计在将Matlab“翻译”到硬件的过程中有几个特殊的困难。Matlab代码是一种面对过程的程序,而且可以高度抽象;他可以使用浮点数据并且没有时间概念。复杂的循环可以由矩阵运算和工具箱功能中推测出。在硬件中应用Matlab代码包括:(1)将浮点数Matlab代码转化为定点数Matlab代码,在这个过程中需要按照硬件生成的有效性对比特宽度进行最优化。(2)将基于过程的程序辨识和映射到并发的程序,并且进行运行速度最优化。(3)添加时钟和时钟率来完善硬件的调度。(4)创建资源共享结构来实现开销极大的操作如乘法器和for-loop循环体。(5)将大块的数据矩阵映射到硬件的RAM中去。MatlabHDLCoder通过自动流程简化了上述任务。3Matlab算法例子让我们将一个应用了直方图均衡化算法的Matlab函数来展示这个流程。这个Matlab算法增强了图像的对比度,所以最终的效果是图像的直方图更加平坦。文件名称:typemlhdlc_heq.m%HistogramEqualizationAlgorithmfunction[pixel_out]=mlhdlc_heq(x_in,y_in,pixel_in,width,height)persistenthistogrampersistenttransferFuncpersistenthistIndpersistentcumSumifisempty(histogram)histogram=zeros(1,2^8);transferFunc=zeros(1,2^8);histInd=0;cumSum=0;end%Figureoutindicesbasedonwhereweareintheframeify_inheight&&x_inwidth%validpixeldatahistInd=pixel_in+1;elseify_in==height&&x_in==0%firstcolumnofheight+1histInd=1;elseify_in=height%verticalblankingperiodhistInd=min(histInd+1,2^8);elseify_inheight%horizontalblanking-donothinghistInd=1;end%ReadhistogramhistValRead=histogram(histInd);%ReadtransferfunctiontransValRead=transferFunc(histInd);%Ifvalidpartofframeaddonetopixelbinandkeeptransferfuncvalify_inheight&&x_inwidthhistValWrite=histValRead+1;%AddpixeltobintransValWrite=transValRead;%WritebacksamevaluecumSum=0;elseify_in=height%InblankingtimeindexthroughallbinsandresettozerohistValWrite=0;transValWrite=cumSum+histValRead;cumSum=transValWrite;elsehistValWrite=histValRead;transValWrite=transValRead;end%Writehistogramhistogram(histInd)=histValWrite;%WritetransferfunctiontransferFunc(histInd)=transValWrite;pixel_out=transValRead;4Matlabtestbench例子文件这里使用一张样例图片(其中使用了图形图像工具箱中的算法函数)文件名称:typemlhdlc_heq_tb.m%%TestbenchforHistogramEqualizationAlgorithmclearmlhdlc_heq;testFile='office.png';RGB=imread(testFile);%GetintensitypartofcolorimageYCBCR=rgb2ycbcr(RGB);imgOrig=YCBCR(:,:,1);[height,width]=size(imgOrig);imgOut=zeros(height,width);hBlank=20;%makesurewehaveenoughverticalblankingtofilterthehistogramvBlank=ceil(2^14/(width+hBlank));forframe=1:2disp(['workingonframe:',num2str(frame)]);fory_in=0:height+vBlank-1%disp(['frame:',num2str(frame),'of2,row:',num2str(y_in)]);forx_in=0:width+hBlank-1ifx_inwidth&&y_inheightpixel_in=double(imgOrig(y_in+1,x_in+1));elsepixel_in=0;end[pixel_out]=mlhdlc_heq(x_in,y_in,pixel_in,width,height);ifx_inwidth&&y_inheightimgOut(y_in+1,x_in+1)=pixel_out;endendendend%Makecolorimagefromequalizedintensityimage%RescaleimageimgOut=double(imgOut);imgOut(:)=imgOut/max(imgOut(:));imgOut=uint8(imgOut*255);YCBCR(:,:,1)=imgOut;RGBOut=ycbcr2rgb(YCBCR);figure(1)subplot(2,2,1);imshow(RGB,[]);title('OriginalImage');subplot(2,2,2);imshow(RGBOut,[]);title('EqualizedImage');subplot(2,2,3);hist(double(imgOrig(:)),2^14-1);title('HistogramoforiginalImage');subplot(2,2,4);hist(double(imgOut(:)),2^14-1);title('HistogramofequalizedImage');结果是:5HDL工作流程向导如下图所示HDLWorkflowAdvisor帮助设计者自动完成上述步骤,从中可以看出的关键步骤包括:(1)定点数据转换(2)HDL代码生成(3)HDL验证(4)HDL综合和分析让我们来分别对这些步骤来进行分析:((((定点转换定点转换定点转换定点转换)Fixed-Point)Fixed-Point)Fixed-Point)Fixed-PointConversionConversionConversionConversion在Matlab中使用浮点数据进行信号处理与运算,然而,由于功率、资金、性能等原因,这些算法需要转化成定点数据才能用在目标硬件上。通常来说定点转换的过程是设计中最占时间的,1/4到1/2的时间会花在这上面,但是使用HDLCoder工具可以极大地简化和加速这个转化过程。浮点数据向定点数据转化的过程包含如下几步:(1)验证浮点数设计是不是和代码生成相适应(2)定点数类型可以通过testbench仿真来确定其范围(3)按照推荐的定点数形式生成定点Matlab代码(4)验证对比转化后的效果注:如果你的Matlab代码设计已经是定点的了,那就直接跳过这一步吧(HDL(HDL(HDL(HDL代码生成代码生成代码生成代码生成)HDL)HDL)HDL)HDLCodeCodeCodeCodeGenerationGenerationGenerationGeneration这个步骤可以从定点Matlab代码生成HDL代码。你可以生成VerilogHDL或者VHDL代码。同时软件还会给出很多报告帮助你留意那些在转化过程中被你忽略的部分。还有硬件资源占用状况,在算法级别还会告诉你什么硬件资源将被占用,例如加法器、乘法器和RAM。在代码生成期间,你可以选择相应的优化选项而不必更改你的算法。在DesignSpaceExplorationandOptimizationOptions分页中你可以找到相应的代码生成优化选项。(HDL(HDL(HDL(HDL验证验证验证验证)HDL)HDL)HDL)HDLVerificationVerificationVerificationVerification独立的HDLtestbench生成:HDLCoder同时生成VHDL和Verilogtestbench从你的Matlab脚本文件用于验证生成的代码。你可以通过规约HDLtestbench选项来控制文件的生成。这些步骤帮助你确认Matlab仿真结果和HDL仿真结果相符。HDLCoder可以和HDLVerifier一起工作,自动生成两种类型的联合仿真testbench文件。(1)基于HDL联合仿真的验证方式,可以和MentorGraphics®ModelSi
本文标题:Matlab硬件代码(HDL)生成
链接地址:https://www.777doc.com/doc-6306920 .html