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滤波达到了预期的效果。


原创粉丝点击