眼镜一米二 发表于 2023-6-7 14:32:27

FPGA设计中 Verilog HDL实现基本的图像滤波处理仿真

本帖最后由 眼镜一米二 于 2023-6-7 14:42 编辑

叁芯智能科技FPGA就业班06月开班中

      大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。

      今天给大侠带来FPGA设计中用Verilog HDL实现基本的图像滤波处理仿真,话不多说,上货。

1、用matlab代码,准备好把图片转化成Vivado Simulator识别的格式,即每行一个数据:




源码:

img = imread('E:\matlab\Images\2016-09-05-211710.jpg');      
         if size(img,3)==3         
         img = rgb2gray(img);      
         end      
         height = size(img, 1);      
         width = size(img, 2);      
         s = fopen('image2mem.txt','wb'); %opens the output file      
         cnt = 0;      
         for r=1:height               
            for c=1:width                        
                   cnt = cnt + 1;                        
                   grey=img(r,c);                        
                   greyb = dec2bin(grey,8);                        
                   Outbyte =greyb(1:8);



                   if (Outbyte(1:4) == '0000')fprintf(s,'0%X',bin2dec(Outbyte));                        
                   else fprintf(s,'%X',bin2dec(Outbyte));   end                        
                   if (mod(cnt,1) == 0)fprintf(s,'\r\n');   end               
               end      
         end      
         figure,imshow(img);      
         fclose(s);


2、EdgeSobel的Verilog源代码:



源码:
`timescale 1ns/1ps
module EdgeSobel(         input clk,         input inData,         input x,         input y,         output outData      );                parameter pixel_depth=8;      parameter frame_width=640;      parameter block_width=3;      parameter block_height=3;
      parameter shiftRegSize=pixel_depth*((block_height-1)*frame_width+block_width);
      reg shiftReg;      wire Window;
      initial begin shiftReg=10264'b0;end      always@(posedge clk)if((x<640)&&(y<480))shiftReg<={shiftReg,inData};
      genvar i,j;      generate      for(i = 0; i < block_height; i = i + 1) begin : array                for(j = 0; j < block_width; j = j + 1)                 begin : vector                        assign Window =shiftReg;                end      end      endgenerate
      wire average;      assign average =          (Window+Window+Window+                //Window+Window+Window+                Window+Window+Window+                Window+Window+Window)/9 ;
      wire signed Gx;      wire signed Gy;      wire Gxabs;      wire Gyabs;      wire G;
      assign Gx =   shiftReg                              +2*shiftReg                              +shiftReg                              -shiftReg                              -2*shiftReg                              -shiftReg;                                    assign Gy =   shiftReg                              +2*shiftReg                              +shiftReg                              -shiftReg                              -2*shiftReg                              -shiftReg;                                       assign Gxabs = (Gx>0)?Gx-Gx);      assign Gyabs = (Gy>0)?Gy-Gy);      assign G = Gxabs+Gyabs;
      //assign outData = average;    //平滑      assign outData = G;   //边缘检测      endmodule
3、仿真文件:EdgeSobel_tb.v




源码:
`timescale 1ns / 1ps
module edgesobel_tb;
      reg clk;      reg inData;      reg cnt;      reg row;      wire outData;      reg image ;      integer file_id;      reg frame_cnt;
      initial      begin                $readmemh("E:/matlab/Vivado/image2mem.txt", image);                file_id = $fopen("E:/matlab/Vivado/mem2image.txt","w");                clk = 0;                cnt = 0;                row = 0;                frame_cnt = 0;      end
      EdgeSobel u_2                        (                        .clk(clk),                        .x(1),                        .y(1),                        .inData(inData),                        .outData(outData)                        );
      always #1 clk = ~clk;
      always@(posedge clk)      begin                if(cnt == 307200)                            begin                              cnt = 0;                              row = 0;                              frame_cnt = frame_cnt + 1;                        end                    else                         inData = image;                        cnt = cnt+1;                        if(frame_cnt==1)                              begin                                        $fwrite(file_id, "%d ", outData);                                        if(((cnt % 640)==0) &&(cnt>0))                                                 begin                                                       $fwrite(file_id,"\r\n");                                                      row = row + 1;                                                end;                              end      end      endmodule
4、把输出的txt文件转化成图片Matlab程序:
A=importdata('E:\matlab\Vivado\mem2image.txt');
A=A./255;
imshow(A);
注意这里的A是double类型的,直接进行imshow会全白,要转化到0-1:A=A./255,或者把double类型转化为整形。
后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。
大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!


页: [1]
查看完整版本: FPGA设计中 Verilog HDL实现基本的图像滤波处理仿真