前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FPGA设计中 Verilog HDL实现基本的图像滤波处理仿真

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

作者头像
FPGA技术江湖
发布2020-12-29 15:42:17
7480
发布2020-12-29 15:42:17
举报
文章被收录于专栏:FPGA技术江湖FPGA技术江湖

大侠好,欢迎来到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 [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 < block_height; i = i + 1) begin : array

for(j = 0; j < block_width; j = j + 1)

begin : vector

assign Window[pixel_depth*(i * block_width + j)+:pixel_depth] =shiftReg[pixel_depth*(i*frame_width+j)+:pixel_depth];

end

end

endgenerate

wire [7:0] average;

assign average =

(Window[7:0]+Window[15:8]+Window[23:16]+

//Window[31:24]+Window[39:32]+Window[47:40]+

Window[31:24]+Window[39:32]+Window[47:40]+

Window[55:48]+Window[63:56]+Window[71:64])/9 ;

wire signed [pixel_depth+1:0] Gx;

wire signed [pixel_depth+1:0] Gy;

wire [pixel_depth+1:0] Gxabs;

wire [pixel_depth+1:0] Gyabs;

wire [pixel_depth+1:0] G;

assign Gx = shiftReg[pixel_depth*(0*frame_width+2)+:pixel_depth]

+2*shiftReg[pixel_depth*(1*frame_width+2)+:pixel_depth]

+ shiftReg[pixel_depth*(2*frame_width+2)+:pixel_depth]

- shiftReg[pixel_depth*(0*frame_width+0)+:pixel_depth]

-2*shiftReg[pixel_depth*(1*frame_width+0)+:pixel_depth]

- shiftReg[pixel_depth*(2*frame_width+0)+:pixel_depth];

assign Gy = shiftReg[pixel_depth*(2*frame_width+0)+:pixel_depth]

+2*shiftReg[pixel_depth*(2*frame_width+1)+:pixel_depth]

+ shiftReg[pixel_depth*(2*frame_width+2)+:pixel_depth]

- shiftReg[pixel_depth*(0*frame_width+0)+:pixel_depth]

-2*shiftReg[pixel_depth*(0*frame_width+1)+:pixel_depth]

- shiftReg[pixel_depth*(0*frame_width+2)+:pixel_depth];

assign Gxabs = (Gx>0)?Gx-Gx);

assign Gyabs = (Gy>0)?Gy-Gy);

assign G = Gxabs+Gyabs;

//assign outData = average; //平滑

assign outData = G[9:2]; //边缘检测

endmodule

3、仿真文件:EdgeSobel_tb.v

源码:

`timescale 1ns / 1ps

module edgesobel_tb;

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类型转化为整形。

后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FPGA技术江湖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档