找回密码
 注册
关于网站域名变更的通知
查看: 506|回复: 1
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-18 09:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
FPGA Verilog实现基本的图像滤波处理仿真
# W7 }" Y, f1 F* ], J

1 D: b' Y- u1 Y3 N
1、用matlab代码,准备好把图片转化成Vivado Simulator识别的格式,即每行一个数据:+ @! W" r2 F. }( A( u0 d
img = imread('E:\matlab\Images\2016-09-05-211710.jpg');. \# x* S( v/ K$ A  z
if size(img,3)==3
; O- Z# s. S# S1 o  g6 x4 N    img = rgb2gray(img);
  N0 K% G8 p: a# n. aend9 [! H( d0 _# a( K" G/ [6 }( N! Z, H
height = size(img, 1);: z0 z) u  j. }( r8 G
width = size(img, 2);
9 m3 ?5 X# x0 N& [s = fopen('image2mem.txt','wb'); %opens the output file
  E5 r$ o" h$ `5 r0 C0 A) Tcnt = 0;4 R, [& Q- V; F
for r=1:height
$ C8 o5 `/ k. R  e( k; ~3 a    for c=1:width
8 x( P% K: g% x' U! W9 [3 U        cnt = cnt + 1;  T% b1 `' z* e
        grey=img(r,c);
6 b( E% a( @3 f$ u# l. m+ H) M        greyb = dec2bin(grey,8);
' A2 ^! c, Z- V! t# \        Outbyte =greyb(1:8);
' o6 _6 @5 v; e, ]$ ]4 C/ |/ \- a0 Z
        if (Outbyte(1:4) == '0000')fprintf(s,'0%X',bin2dec(Outbyte));( J. q6 A) Q- Z( l
        else fprintf(s,'%X',bin2dec(Outbyte));   end% s$ G  F( |; ~: g  e3 a# Z
        if (mod(cnt,1) == 0)fprintf(s,'\r\n');   end
* o0 f* p0 ~+ N( }) _. [    end/ T+ t: Y& w, j1 D- V" A
end" x" x$ f! y# U$ }" U# h* G
figure,imshow(img);
, D% ?; y+ G  \  w+ r9 Wfclose(s);
8 R  D+ D, K! x7 X
/ J* S- s; K; B- C( f2、EdgeSobel的Verilog源代码:
1 c; ]- `: ]$ r- Q& z  K5 t`timescale 1ns / 1ps' q. T  ], h6 N; k( n) I

; s7 I3 s2 C; x, H& c: Y; O9 rmodule EdgeSobel
! x6 H- H. [) [    (6 L& u% z5 J5 l7 _2 L! i" c0 O" A
    input clk,) S  h; c: V  O/ D
    input [7:0] inData,
+ [6 [+ t& i3 }# Y+ [    input [11:0]x,
0 A) N8 |" K! s# w& H    input [11:0]y,
. Y' r. y6 Q; C: Z/ @* _0 x    output [7:0] outData
3 N& ~" B/ y1 A* {: T7 c9 f9 _    );    6 D* R+ P! U$ K2 W  Z2 H" Q1 A4 c
    parameter pixel_depth=8;
( D: p! [  T3 \  ~* Z' @9 f! i6 B8 e& }    parameter frame_width=640;# g# k7 {* P7 I
    parameter block_width=3;
- \. h5 C+ X! p  z% A. h/ @( G    parameter block_height=3;
2 r5 n1 n" A4 j& N" M# t  K! u' U0 x7 O( ]$ I$ ~* R
    parameter shiftRegSize=pixel_depth*((block_height-1)*frame_width+block_width);& ?: G" p  b* K; [7 t% ?, J
9 B% k& W6 M' _; q* }7 z/ G2 }0 C
    reg[shiftRegSize-1:0] shiftReg;
) k. V0 E# N% @4 @5 B8 N" q! ^) ?    wire [block_width*block_height*pixel_depth-1:0] Window;  
6 V" k. q, ~8 J/ D4 c) \
( l7 w$ E% |$ L  d  l5 m    initial begin shiftReg=10264'b0;end" a( [4 C2 J5 ~9 j# W* @) l

- R1 S1 e* G( K2 \! `    always@(posedge clk)if((x<640)&&(y<480))shiftReg<={shiftReg,inData};" b4 {, y+ a& @! _7 p; u* _
2 Q3 b% a! i, [1 ?7 r3 [
    genvar i,j;
$ B/ f1 Z% a, l' P+ L; o! B    generate% D8 r1 m! @9 v! A" ^6 Q
    for(i = 0; i < block_height; i = i + 1) begin : array
% y* ]* F7 E4 Z  b      for(j = 0; j < block_width; j = j + 1) begin : vector
3 O1 w; `5 l% v, @% Y         assign Window[pixel_depth*(i * block_width + j)+:pixel_depth] =shiftReg[pixel_depth*(i*frame_width+j)+:pixel_depth];$ f; l/ L2 p* i; [
      end# h; D8 }3 N# {9 _; t' t
    end
4 a' P; ?+ v" X    endgenerate6 J( L# \" E- T3 i! R4 `

. Z& b, L( Z9 v, Q- u    wire [7:0] average;( }& A/ C) [/ [4 r) R% V
    assign average = & D1 r, {1 v# M( W" F1 b+ m
                    (Window[7:0]+Window[15:8]+Window[23:16]+" Q3 z- N* h. s1 V, u1 V
                     //Window[31:24]+Window[39:32]+Window[47:40]+7 `. K8 |9 B& h. u
                     Window[31:24]+Window[39:32]+Window[47:40]+
( f; E$ U! z1 ^: q" b" x/ h! E                     Window[55:48]+Window[63:56]+Window[71:64])/9 ;8 d) j( T! h6 {$ R
4 ^+ z6 W9 M+ a: g  T( c1 i
    wire signed [pixel_depth+1:0] Gx;& s- E( ~% d. V6 l6 M- l% l8 }
    wire signed [pixel_depth+1:0] Gy;; }* G; V; G" o$ D2 l5 h
    wire [pixel_depth+1:0] Gxabs;1 M$ n. C/ ]1 z+ D0 C
    wire [pixel_depth+1:0] Gyabs;
2 i/ [+ ^# X  i5 l) {    wire [pixel_depth+1:0] G;6 R. h' U, O' [8 n/ T

! d3 C% m- B* \( g, s* U    assign Gx =   shiftReg[pixel_depth*(0*frame_width+2)+:pixel_depth]
9 s/ O3 Q( \8 \. K  U               +2*shiftReg[pixel_depth*(1*frame_width+2)+:pixel_depth]
2 p6 l4 D, [/ x* p; k               +  shiftReg[pixel_depth*(2*frame_width+2)+:pixel_depth]
# w- L! D6 w! ^9 a6 t/ @               -  shiftReg[pixel_depth*(0*frame_width+0)+:pixel_depth]
6 i& W$ h, V% \               -2*shiftReg[pixel_depth*(1*frame_width+0)+:pixel_depth]
4 T% i; @4 f2 P% l9 V               -  shiftReg[pixel_depth*(2*frame_width+0)+:pixel_depth];# N* a$ N* [8 N2 \4 T2 x
    assign Gy =   shiftReg[pixel_depth*(2*frame_width+0)+:pixel_depth]- d/ F) I' S5 J/ m# K& @
               +2*shiftReg[pixel_depth*(2*frame_width+1)+:pixel_depth]1 h$ l6 d# r* |- }3 R1 x) j, c
               +  shiftReg[pixel_depth*(2*frame_width+2)+:pixel_depth]9 C/ |( T* o% V  Z
               -  shiftReg[pixel_depth*(0*frame_width+0)+:pixel_depth]* ^. k; w% Z5 B2 p! x
               -2*shiftReg[pixel_depth*(0*frame_width+1)+:pixel_depth]
4 N7 L' d' b) C, A9 b               -  shiftReg[pixel_depth*(0*frame_width+2)+:pixel_depth];               
% \- D8 T' o' W; i    assign Gxabs = (Gx>0)?Gx-Gx);* B5 N1 _2 X) c* c, T& }* D
    assign Gyabs = (Gy>0)?Gy-Gy);! X4 C. X, }) S$ V/ ~) j3 W3 m; m
    assign G = Gxabs+Gyabs;
% C4 o1 ~9 P+ b. p" I; B- ]9 Z4 ?" K; a9 o
    //assign outData = average;    //平滑
( _) U) |7 N1 M    assign outData = G[9:2];     //边缘检测/ ?" p' l5 u! B) `  H! x
endmodule5 Z( a2 u. s3 [. ?8 V; a) G
* h" q# q! I2 L8 |; `
3、仿真文件:tb_EdgeSobel.v$ p  i- |# @3 P  ^& C
`timescale 1ns / 1ps
& L/ S3 X# r0 O5 d5 V, G9 K) U- s1 x' j' Z& F' _" ?3 S7 v2 P4 c. ~
module tb_edgesobel;. a7 L! `0 K# z5 l. d9 q3 N
( b0 a8 [: P. G$ Z" H3 V, o( l
    reg clk;5 O$ i. ]; o% \' U5 \
    reg [7:0]  inData;: b. b$ \* w8 S
    reg [19:0] cnt;
! O6 g: P5 k' G& [0 T    reg [9:0] row;
$ ^% Q) R5 C5 n% T5 _9 m" Y    wire [7:0] outData;
9 h/ ~3 ^3 z: O" _  ^, ?    reg [7:0] image [307199:0];
* W! o% y6 m9 t9 m9 P    integer file_id;0 K0 d  c4 n8 A
    reg [4:0] frame_cnt;
: @) [+ C: D. e$ o+ h, U/ W( \) Y( ]: d2 L; M% x( J% P
( X2 |8 b( F" ~, x/ ^
    initial: g! _! A) k# D
    begin7 g" p+ P% Q4 _% f4 |' K7 P" I
        $readmemh("E:/matlab/Vivado/image2mem.txt", image);% `, R; z" m; P9 H# X* ]
        file_id = $fopen("E:/matlab/Vivado/mem2image.txt","w");3 d2 Z1 {# ]9 G/ V
        clk = 0;
2 y! f  `+ a% T6 w" n        cnt = 0;% \1 V8 h. X8 e; ?7 N
        row = 0;
+ R0 o; G& H; u  g: x5 Y        frame_cnt = 0;
5 y; Q/ i! z4 l" x9 i    end
# r% _# d# w9 E$ c
8 ?3 o6 f2 [+ s6 q  b2 `: m    EdgeSobel u_2
) _( d. C9 p# Z7 j# l* |# p    (
, j9 b& d. G" E8 d4 e2 Z' q" b    .clk(clk),5 o/ I: ?3 ]1 ]0 H4 H# w6 ~
    .x(1),8 f( r) B1 Q+ ^6 |8 z+ I
    .y(1),
# [7 P/ [3 V; R7 a5 s# K    .inData(inData),' q- P' }. O' z/ P
    .outData(outData)3 U3 U( k0 e) A
    );* z  N/ D) }  J- P* s  W# z
& W- g; H/ r: Q0 j5 ^& d
    always #1 clk = ~clk;$ I9 P5 Q$ Q1 R3 b) V; j

1 n) r% C8 a, y* r: B  L    always@(posedge clk)
2 m6 N( H2 v9 m    begin
3 ^! F9 Z6 i9 g! x) l, |4 A/ @        if(cnt == 307200)   
' }. N& o! g, m9 n        begin- p& u. ?! E5 }# P  z; E( M
            cnt = 0;" V, z( j4 e. n0 l7 {( c4 k
            row = 0;
4 n9 g# d# A: y+ R            frame_cnt = frame_cnt + 1;
3 k" G0 _% _: H" g& G+ v        end   
2 t( G* c+ D$ c/ A$ W5 ]1 \        else
8 {% m4 h: a( s% F5 n! N  z, c        inData = image[cnt];
$ `9 ^4 ~4 l1 V6 b; K- ~- {7 j6 y4 k        cnt = cnt+1;+ r+ I6 H, y8 O4 ?
        if(frame_cnt==1)
  t# t4 P$ o9 e; s; e3 W( b+ N            begin' q. c! N; h, |0 x& p
                $fwrite(file_id, "%d ", outData);
3 o( S; e" \2 M& g                if(((cnt % 640)==0) &&(cnt>0)) 5 \4 {0 o: L! `& V8 f
                begin : F& \& t9 R0 z
                    $fwrite(file_id,"\r\n");
5 z" h+ s* T; F6 ?4 l                    row = row + 1;
7 r( L4 e) o# \5 F5 O0 ~: I3 B                end;5 @0 W% D. g% r
            end
- v0 j7 k/ J/ e4 i( L6 R    end
: I  J$ _* E0 S% ]6 yendmodule
) _+ t, @+ k3 t' x! [
' U( A9 o* O- D& S4、把输出的txt文件转化成图片Matlab程序:
' \% T+ G9 l5 n( q, Q4 |, sA=importdata('E:\matlab\Vivado\mem2image.txt');
* }8 T8 u  L5 o% I/ `A=A./255;
1 h6 u0 K0 ]' ?imshow(A);
: T% ]8 I- j. }, @  F* g1 O: _% q9 S
注意这里的A是double类型的,直接进行imshow会全白,要转化到0-1:A=A./255,或者把double类型转化为整形。

5 p" y- u: @, V1 k

该用户从未签到

2#
发表于 2019-3-18 18:57 | 只看该作者
楼主说的不错
4 ~! f5 \+ d1 h% o6 z
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-8 16:32 , Processed in 0.171875 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表