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]