Matlab、ISE联合开发之中值滤波(三)联合开发
来源:互联网 发布:淘宝买二手cpu散片注意 编辑:程序博客网 时间:2024/05/22 14:19
声明:主要程序及架构思想均来自徐文波、田耘《Xilinx FPGA开发实用教程(第二版)》,本人在学习过程中按照书上指导将其实现,将其拿出与初学者交流分享。所有步骤均经过验证(并修正了书上若干细节小错误)。O(∩_∩)O~
前面两篇我们分别单独在MAtlab和ISE上实现了中值滤波,其中在ISE上的实现还只是对少量的测试数据。那么,为了对较大规模的实际数据进行滤波。我们采取这样的方案:
1.首先由Matlab读取图片数据并经过适当的处理以适合硬件输入,然后保存为数据文件
2.然后ISE中读取上述数据文件,进行中值滤波后将结果也写入新的数据文件
3.Matlab在读取ISE中所写的数据文件,经过适当排列处理后进行结果验证(这里就是以图片格式输出进行对比)。
下面分别来实现
1.matlab预处理数据
%用于产生FPGA中值滤波所需的输入信号clear;clcs=load('demo.mat');demo=s.image;%载入RGB图像文件(三维矩阵)demo=rgb2gray(demo);%转化为灰度图像(二维矩阵)[a,b]=size(demo);len=(a-2)*(b-2);%分割成len个3*3九宫格duut=zeros(9,len);%测试向量,9个一列for i=2:a-1 for j=2:b-1 %************读入九宫格**************** tmp=demo(i-1:i+1,j-1:j+1); tmpv=reshape(tmp,9,1); %***********写入测试向量*************** k=(i-1)*(b-2)+j; duut(:,k)=tmpv; endend%*************写入数据文件以供测试******************fid1 = fopen('din1tt.dat', 'wt');dout1 = duut(1,:);fprintf(fid1, '%x\n', dout1);fclose(fid1);fid2 = fopen('din2tt.dat', 'wt');dout2 = duut(2,:);fprintf(fid2, '%x\n', dout2);fclose(fid2);fid3 = fopen('din3tt.dat', 'wt');dout3 = duut(3,:);fprintf(fid3, '%x\n', dout3);fclose(fid3);fid4 = fopen('din4tt.dat', 'wt');dout4 = duut(4,:);fprintf(fid4, '%x\n', dout4);fclose(fid4);fid5 = fopen('din5tt.dat', 'wt');dout5 = duut(5,:);fprintf(fid5, '%x\n', dout5);fclose(fid5);fid6 = fopen('din6tt.dat', 'wt');dout6 = duut(6,:);fprintf(fid6, '%x\n', dout6);fclose(fid6);fid7 = fopen('din7tt.dat', 'wt');dout7 = duut(7,:);fprintf(fid7, '%x\n', dout7);fclose(fid7);fid8 = fopen('din8tt.dat', 'wt');dout8 = duut(8,:);fprintf(fid8, '%x\n', dout8);fclose(fid8);fid9 = fopen('din9tt.dat', 'wt');dout9 = duut(9,:);fprintf(fid9, '%x\n', dout9);fclose(fid9);
这样实际上就是把每一步的九宫格的9个数据都写成一个列向量存入duut矩阵中,然后把duut的每一行都保存为一个文件(共9个),这九个文件就是FPGA上9个输入引脚的输入数据流。
2.fpga测试
编写测试文件时,先读入上述数据文件,然后在经过滤波,滤波结果写入到“fpga_dout.txt”中。
module tb_midfilt2_demo;// Inputsreg clk_pixel; reg rst_n;reg [7:0] din1;reg [7:0] din2;reg [7:0] din3;reg [7:0] din4;reg [7:0] din5;reg [7:0] din6;reg [7:0] din7;reg [7:0] din8;reg [7:0] din9;// Outputswire [7:0] dout;// Instantiate the Unit Under Test (UUT)zhongzhilvbo uut (.clk_pixel(clk_pixel), .rst_n(rst_n), .din1(din1), .din2(din2), .din3(din3), .din4(din4), .din5(din5), .din6(din6), .din7(din7), .din8(din8), .din9(din9), .dout(dout));reg [7:0] din1t [260611:0];reg [7:0] din2t [260611:0];reg [7:0] din3t [260611:0];reg [7:0] din4t [260611:0];reg [7:0] din5t [260611:0];reg [7:0] din6t [260611:0];reg [7:0] din7t [260611:0];reg [7:0] din8t [260611:0];reg [7:0] din9t [260611:0];/*reg [7:0] din1t [10:0];reg [7:0] din2t [10:0];reg [7:0] din3t [10:0];reg [7:0] din4t [10:0];reg [7:0] din5t [10:0];reg [7:0] din6t [10:0];reg [7:0] din7t [10:0];reg [7:0] din8t [10:0];reg [7:0] din9t [10:0];*/ integer i;integer number_file;initial begin// Initialize Inputs number_file = $fopen("fpga_dout.txt", "w");clk_pixel = 0;rst_n = 0;din1 = 0;din2 = 0;din3 = 0;din4 = 0;din5 = 0;din6 = 0;din7 = 0;din8 = 0;din9 = 0; $readmemh("din1tt.dat", din1t); $readmemh("din2tt.dat", din2t); $readmemh("din3tt.dat", din3t); $readmemh("din4tt.dat", din4t); $readmemh("din5tt.dat", din5t); $readmemh("din6tt.dat", din6t); $readmemh("din7tt.dat", din7t); $readmemh("din8tt.dat", din8t); $readmemh("din9tt.dat", din9t);// Wait 100 ns for global reset to finish#100;rst_n = 1;for(i=0; i<260612; i=i+1) begin #10; din1 = din1t[i]; din2 = din2t[i]; din3 = din3t[i]; din4 = din4t[i]; din5 = din5t[i]; din6 = din6t[i]; din7 = din7t[i]; din8 = din8t[i]; din9 = din9t[i]; $fwrite(number_file, "%d\n",dout); end // Add stimulus here $fclose(number_file);endalways #5 clk_pixel = ~clk_pixel; endmodule
仿真之前要先将matlab生成的数据文件拷贝到ISE工程目录中,然后添加到工程中,仿真时如果结果不对,就先点击Simulation——Restart,然后再点击Run All
仿真波形图一部分
3.fpga输出数据经matlab分析
首先 导入数据,可以用matlab——file——Import Data功能导入“fpga_dout.txt”的数据,然后将该数据按原来顺序还原成二维图像,然后显示出来并与原图对比。
%验证FPGA的输出clear allclcs=load('demo.mat');demo=s.image;%载入RGB图像文件(三维矩阵)demo=rgb2gray(demo);%转化为灰度图像(二维矩阵)figure;imshow(demo);%显示原始图像[a,b]=size(demo);dfpga=uint8(zeros(a,b));%转化为uint8型(默认为double)for i = 2:a-1 for j = 2:b-1 k=(i-1)*(b-2)+j; if k>260612 dfpga(i,j)=0; else dfpga(i,j)=fpga_dout(k); end endendfigure;imshow(dfpga);
程序运行结果如下
原图:
matlab滤波之后的图:
fpga滤波之后的图
结果表明使用fpga滤波达到了预期的效果。
- Matlab、ISE联合开发之中值滤波(三)联合开发
- Matlab、ISE联合开发实例之中值滤波(一)Matlab实现
- Matlab、ISE联合开发实例之中值滤波(二)FPGA硬件架构实现
- Asset Server(联合开发)
- ITK VTK CTK QT 跨平台联合开发之 三 <Mac OS X篇>
- matlab中值滤波--medfilt2
- 中值滤波讲解-Matlab
- 中值滤波 matlab实现
- 中值滤波matlab
- Matlab中值滤波代码
- matlab 中值滤波
- JADE与JBoss联合开发
- buffalo与spring联合开发
- buffalo与spring联合开发
- Spring + JDBC联合开发
- Spring + Struts2联合开发
- Halcon11与VS2010联合开发
- Halcon11与VS2010联合开发
- 黑马韩前成linux从入门到精通之UNIX发展史
- CXimage
- PHP5.4.14安装配置步骤
- linux 一些命令
- java基础之多线程
- Matlab、ISE联合开发之中值滤波(三)联合开发
- 如何使用mencoder打LOGO
- java中switch 也是可以变相实现String的比较的
- Autocad技巧
- windows平台下编译curl支持https
- 黑马程序员_多线程
- cocos2d-x之码农工作笔记 CCNode常用函数(2.0.4)
- oracle 修改默认的8080端口
- install4j打包jar