FPGA Verilog实现基本的图像滤波处理仿真

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 [7:0] indata,
   input [11:0]x,
   input [11:0]y,
   output [7:0] 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[shiftregsize-1:0] shiftreg;
   wire [block_width*block_height*pixel_depth-1:0] 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 0)?gy-gy);
   assign g = gxabs+gyabs;
//assign outdata = average;    //平滑
   assign outdata = g[9:2];     //边缘检测
endmodule
3、仿真文件:tb_edgesobel.v
`timescale 1ns / 1ps
module tb_edgesobel;
reg clk;
   reg [7:0]  indata;
   reg [19:0] cnt;
   reg [9:0] row;
   wire [7:0] outdata;
   reg [7:0] image [307199:0];
   integer file_id;
   reg [4:0] 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 = 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类型转化为整形。

人工智能帮助零售商了解消费者
英飞凌通过合作伙伴生态系统,助推创新多电平D类音频放大器技术应用
Google 中国 AI发展计划: 死于 2018,2019 可期?
探究pandas与GUI界面的超强结合
Matter 1.0标准正式发布,涂鸦智能等早期参与者全力推进应用落地
FPGA Verilog实现基本的图像滤波处理仿真
相位检测在微弱信号测量中的应用
RL78/G16触摸套件开发板演示(上)
科学家演示基于昆虫的半生物/半机械装置
魅族pro7来了:4K曲面屏?回归小圆点设计!
索尼X9500H智能液晶4K电视加入最新安卓9.0操作系统
区块链还没有真正成为游戏的改变者
最新3D表征自监督学习+对比学习:FAC
恩智浦SAF86xx雷达单芯片的关键特性
可实时深组织成像并控制的微机器人系统
端子线的压紧机构是什么,它的作用是什么
培育新生开源力量,产学研各界齐聚一堂共话开源
曝苹果A17Pro芯片比不上高通
中国半导体如何才能崛起?
三星、高通合作计划长达十年 骁龙5G芯片组或将采用于三星7纳米LPP EUV工艺