警告:本文是雷声天下将Loren 的Matlab 日志翻译而成,并且添加了个人的使用体验,只发布到新浪爱问平台上,愿意与广大网友共同学习分享,不得被用于任何商业场合,如有违背,必将追究责任!!!
技术交流or 项目探讨欢迎联系:dlbuaa@163 Matlab 硬件代码硬件代码(HDL)(HDL)(HDL)生成
生成本文的原作者并不是Loren 二十Mathworks 公司的HDL Coder 产品团队的领导者Kiran Kintali。利用这一团队的产品可以从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 代码-再次使用你的Matlab test bench 来验证你的FPGA 设计
(4)创建和验证FPGA 原型-在FPGA 上应用和验证你的设计
在将Matlab“翻译”到硬件的过程中有几个特殊的困难。Matlab代码是一种面对过程的程序,而且可以高
度抽象;他可以使用浮点数据并且没有时间概念。复杂的循环可以由矩阵运算和工具箱功能中推测出。
在硬件中应用Matlab代码包括:
(1)将浮点数Matlab代码转化为定点数Matlab代码,在这个过程中需要按照硬件生成的有效性对比特宽度进行最优化。
(2)将基于过程的程序辨识和映射到并发的程序,并且进行运行速度最优化。
(3)添加时钟和时钟率来完善硬件的调度。
(4)创建资源共享结构来实现开销极大的操作如乘法器和for-loop循环体。
(5)将大块的数据矩阵映射到硬件的RAM中去。
Matlab HDL Coder通过自动流程简化了上述任务。
3Matlab算法例子
让我们将一个应用了直方图均衡化算法的Matlab函数来展示这个流程。这个Matlab算法增强了图像的
对比度,所以最终的效果是图像的直方图更加平坦。
文件名称:type mlhdlc_heq.m
%Histogram Equalization Algorithm
function[pixel_out]=mlhdlc_heq(x_in,y_in,pixel_in,width,height) persistent histogram
persistent transferFunc
persistent histInd
persistent cumSum
if isempty(histogram)
histogram=zeros(1,2^8);
transferFunc=zeros(1,2^8);
histInd=0;
cumSum=0;
end
%Figure out indices based on where we are in the frame
if y_in<height&&x_in<width%valid pixel data
histInd=pixel_in+1;
elseif y_in==height&&x_in==0%first column of height+1
histInd=1;
elseif y_in>=height%vertical blanking period
histInd=min(histInd+1,2^8);
elseif y_in<height%horizontal blanking-do nothing
histInd=1;
end
%Read histogram
histValRead=histogram(histInd);
%Read transfer function
transValRead=transferFunc(histInd);
%If valid part of frame add one to pixel bin and keep transfer func val
if y_in<height&&x_in<width
histValWrite=histValRead+1;%Add pixel to bin
transValWrite=transValRead;%Write back same value
cumSum=0;
elseif y_in>=height%In blanking time index through all bins and reset to zero histValWrite=0;
transValWrite=cumSum+histValRead;
cumSum=transValWrite;
else
histValWrite=histValRead;
transValWrite=transValRead;
end
%Write histogram
histogram(histInd)=histValWrite;
%Write transfer function
transferFunc(histInd)=transValWrite;
pixel_out=transValRead;
4Matlab test bench例子文件
这里使用一张样例图片(其中使用了图形图像工具箱中的算法函数)
文件名称:type mlhdlc_heq_tb.m
%%Test bench for Histogram Equalization Algorithm
clear mlhdlc_heq;
testFile='office.png';
RGB=imread(testFile);
%Get intensity part of color image
YCBCR=rgb2ycbcr(RGB);
imgOrig=YCBCR(:,:,1);
[height,width]=size(imgOrig);
imgOut=zeros(height,width);
hBlank=20;
%make sure we have enough vertical blanking to filter the histogram
vBlank=ceil(2^14/(width+hBlank));
for frame=1:2
disp(['working on frame:',num2str(frame)]);
for y_in=0:height+vBlank-1
%disp(['frame:',num2str(frame),'of2,row:',num2str(y_in)]);
for x_in=0:width+hBlank-1
if x_in<width&&y_in<height
pixel_in=double(imgOrig(y_in+1,x_in+1));matlab直方图
else
pixel_in=0;
end
[pixel_out]=mlhdlc_heq(x_in,y_in,pixel_in,width,height);
if x_in<width&&y_in<height
imgOut(y_in+1,x_in+1)=pixel_out;
end
end
end
end
%Make color image from equalized intensity image
%Rescale image
imgOut=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('Original Image');
subplot(2,2,2);imshow(RGBOut,[]);
title('Equalized Image');
subplot(2,2,3);hist(double(imgOrig(:)),2^14-1);
title('Histogram of original Image');
subplot(2,2,4);hist(double(imgOut(:)),2^14-1);
title('Histogram of equalized Image');
结果是:
5HDL工作流程向导
如下图所示HDL Workflow Advisor帮助设计者自动完成上述步骤,从中可以看出的关键步骤包括:
(1)定点数据转换
(2)HDL代码生成
(3)HDL验证
(4)HDL综合和分析
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论