首页 > 技术 > 内容

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

时间:2026-01-08  作者:Diven  阅读:0

今天给大侠带来FPGA设计中用Verilog HDL实现基本的图像滤波处理仿真,话不多说,上货。   1、用matlab代码,准备好把图片转化成Vivado Simulator识别的格式,即每行一个数据:

  代码:

 

img = imread('E:matlabImages2016-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,''); end end end figure,imshow(img); fclose(s);
    2、EdgeSobel的Verilog源代码:

 

 

代码:

 

`timescale 1ns/1psModule 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,""); row = row + 1; end; end endendmodule

4、把输出的txt文件转化成图片Matlab程序:

A=importdata('E:matlabVivadomem2image.txt');A=A./255;imshow(A);

注意这里的A是double类型的,直接进行imshow会全白,要转化到0-1:A=A./255,或者把double类型转化为整形。

审核编辑:黄飞

 

猜您喜欢


同步整流LLC电路,作为电力电子领域的革新成果,现已成为电源转换应用中的理想选择。凭借其高效能和稳健的性能表现,广受各类用户,尤其是对电源效率和可靠性要求较高的...
2024-08-28 00:00:00
触发二极管,也被称为可控硅,是重要的半导体器件,应用于电力电子和电气控制领域。其符号在电路图中代表着这种器件的特性和功能,了解触发二极管符号的含义以及其在电路中...
2025-04-01 07:00:34
光敏电阻作为重要的光电元件,应用于光控开关、光照强度检测、自动调光等领域。正邦(JPCON)作为业内知名品牌,提供多种类型的光敏电阻,满足不同客户的需求。本文将...
2023-09-20 00:31:20
电子元器件领域,贴片电阻因其小巧、便于自动化生产等优势被应用。而在贴片电阻的标识中,“丝印”是常见的阻值表示方式。本文将围绕“丝印688贴片电阻阻值是多大”这一...
2025-11-25 00:00:22
硅电容式集成传感器是新型的传感器。在很多领域都有应用。比如说:工业自动化、医疗设备等。本文将探讨特点。高灵敏度硅电容式集成传感器灵敏度高。能检测微小的变化。即使...
2025-04-12 03:31:42
贴片电阻上的「474」并非直接代表欧姆值,而是一种编码方式。它代表的是47乘以10的4次方,即470000欧姆,也就是470kΩ。这种编码方式通常用于表面贴装元...
2025-04-14 15:03:34
电流检测电阻是不可少的重要元件。通过精准测量电流大小,实现电路的保护与控制。作为知名品牌,融欣(JACKCON)高品质的电流检测电阻产品,赢得了市场的认可。本文...
2024-06-26 05:16:00
贴片电阻在电子电路中扮演着至关重要的角色,其好坏直接影响电路的正常工作。学会快速判断贴片电阻的好坏,对于电子爱好者和专业人士都非常重要。以下是一些简单有效的判断...
2025-04-14 15:03:53
贴片电阻数值下面的线表示电阻的阻值精度。不同数量和位置的线代表不同的精度等级。最常见的情况是一条线位于数字中间或末尾,这表示电阻的精度为±1%。例如,标有100...
2024-11-29 10:26:18
鞋套是常见的保护性用品,主要用于防止鞋子沾染污垢或保护地面清洁。根据不同的使用场景和材料,鞋套可以分为几种主要类型。按材料分类,鞋套可以分为塑料鞋套和布料鞋套。...
2012-03-10 00:00:00