您的位置:首页 > 其它

中值滤波去除噪点项目设计书

2015-08-09 18:57 211 查看
这是毕业第一年的时候写的一个项目程序,贡献出来,供大家学习,交流,不做商用。

这是fpga做的图像中值滤波,图像的分辨率是256*256。以下是详细东西,有这个算法的详细思考过程,和程序,还有做出来的效果。效果是根据fpga算法用matlab仿真出来的。















以下是项目涉及的程序:



/*
求最小值中的最大值。
*/
`timescale 1ns/1ps

module max_of_3(
//input
vclk,
vsync,
hsync,
vden,
min_x1,
min_x2,
min_x3,
//output
vsync_out,
hsync_out,
vden_out,
max_of_min
);
input vclk;
input vsync,hsync,vden;
input [23:0] min_x1,min_x2,min_x3;
output [23:0] max_of_min;
output vsync_out,hsync_out,vden_out;
reg [23:0] max_of_min=24'h0;
reg vsync_reg,hsync_reg,vden_reg;

always@(posedge vclk)
begin
if(min_x1>min_x2)
begin
if(min_x3>min_x1)
begin
max_of_min<=min_x3;
end
else
begin
max_of_min<=min_x1;
end
end
else
begin
if(min_x3>min_x2)
begin
max_of_min<=min_x3;
end
else
begin
max_of_min<=min_x2;
end
end
end
/****Delay Signals************************/
always @ (posedge vclk)
begin
vsync_reg <= vsync;
hsync_reg <= hsync;
vden_reg  <= vden;
end

assign vsync_out = vsync_reg;
assign hsync_out = hsync_reg;
assign vden_out  = vden_reg;
/****Delay Signals************************/
endmodule


/*
求中值的中值。
*/
`timescale 1ns/1ps

module mid_of_3(
//input
vclk,
vsync,
hsync,
vden,
mid_x1,
mid_x2,
mid_x3,
//output
vsync_out,
hsync_out,
vden_out,
mid_of_mid
);
input vclk;
input vsync,hsync,vden;
input [23:0] mid_x1,mid_x2,mid_x3;
output [23:0] mid_of_mid;
output vsync_out,hsync_out,vden_out;

reg [23:0] mid_of_mid=24'h0;
reg vsync_reg,hsync_reg,vden_reg;

always@(posedge vclk)
begin
if(mid_x1<mid_x2)
begin
if(mid_x3<mid_x1)
begin
mid_of_mid<=mid_x1;
end
else if(mid_x3<mid_x2)
begin
mid_of_mid<=mid_x3;
end
else
begin
mid_of_mid<=mid_x2;
end
end
else
begin
if(mid_x3<mid_x2)
begin
mid_of_mid<=mid_x2;
end
else if(mid_x3<mid_x1)
begin
mid_of_mid<=mid_x3;
end
else
begin
mid_of_mid<=mid_x1;
end
end

end
/****Delay Signals************************/
always @ (posedge vclk)
begin
vsync_reg <= vsync;
hsync_reg <= hsync;
vden_reg  <= vden;
end

assign vsync_out = vsync_reg;
assign hsync_out = hsync_reg;
assign vden_out  = vden_reg;
/****Delay Signals************************/
endmodule


/*
求最大值中的最小值。
*/
`timescale 1ns/1ps

module min_of_3(
//input
vclk,
vsync,
hsync,
vden,
max_x1,
max_x2,
max_x3,
//output
vsync_out,
hsync_out,
vden_out,
min_of_max
);
input vclk;
input vsync,hsync,vden;
input [23:0] max_x1,max_x2,max_x3;
output [23:0] min_of_max;
output vsync_out,hsync_out,vden_out;
reg [23:0] min_of_max=24'h0;
reg vsync_reg,hsync_reg,vden_reg;

always@(posedge vclk)
begin
if(max_x1<max_x2)
begin
if(max_x3<max_x1)
begin
min_of_max<=max_x3;
end
else
begin
min_of_max<=max_x1;
end
end
else
begin
if(max_x3<max_x2)
begin
min_of_max<=max_x3;
end
else
begin
min_of_max<=max_x2;
end
end

end

/****Delay Signals************************/
always @ (posedge vclk)
begin
vsync_reg <= vsync;
hsync_reg <= hsync;
vden_reg  <= vden;
end

assign vsync_out = vsync_reg;
assign hsync_out = hsync_reg;
assign vden_out  = vden_reg;
/****Delay Signals************************/

endmodule


/*
求最大值中的最小值。
*/
`timescale 1ns/1ps

module min_of_3(
//input
vclk,
vsync,
hsync,
vden,
max_x1,
max_x2,
max_x3,
//output
vsync_out,
hsync_out,
vden_out,
min_of_max
);
input vclk;
input vsync,hsync,vden;
input [23:0] max_x1,max_x2,max_x3;
output [23:0] min_of_max;
output vsync_out,hsync_out,vden_out;
reg [23:0] min_of_max=24'h0;
reg vsync_reg,hsync_reg,vden_reg;

always@(posedge vclk)
begin
if(max_x1<max_x2)
begin
if(max_x3<max_x1)
begin
min_of_max<=max_x3;
end
else
begin
min_of_max<=max_x1;
end
end
else
begin
if(max_x3<max_x2)
begin
min_of_max<=max_x3;
end
else
begin
min_of_max<=max_x2;
end
end

end

/****Delay Signals************************/
always @ (posedge vclk)
begin
vsync_reg <= vsync;
hsync_reg <= hsync;
vden_reg  <= vden;
end

assign vsync_out = vsync_reg;
assign hsync_out = hsync_reg;
assign vden_out  = vden_reg;
/****Delay Signals************************/

endmodule


/*
求中值的中值。
*/
`timescale 1ns/1ps

module mid_of_3(
//input
vclk,
vsync,
hsync,
vden,
mid_x1,
mid_x2,
mid_x3,
//output
vsync_out,
hsync_out,
vden_out,
mid_of_mid
);
input vclk;
input vsync,hsync,vden;
input [23:0] mid_x1,mid_x2,mid_x3;
output [23:0] mid_of_mid;
output vsync_out,hsync_out,vden_out;

reg [23:0] mid_of_mid=24'h0;
reg vsync_reg,hsync_reg,vden_reg;

always@(posedge vclk)
begin
if(mid_x1<mid_x2)
begin
if(mid_x3<mid_x1)
begin
mid_of_mid<=mid_x1;
end
else if(mid_x3<mid_x2)
begin
mid_of_mid<=mid_x3;
end
else
begin
mid_of_mid<=mid_x2;
end
end
else
begin
if(mid_x3<mid_x2)
begin
mid_of_mid<=mid_x2;
end
else if(mid_x3<mid_x1)
begin
mid_of_mid<=mid_x3;
end
else
begin
mid_of_mid<=mid_x1;
end
end

end
/****Delay Signals************************/
always @ (posedge vclk)
begin
vsync_reg <= vsync;
hsync_reg <= hsync;
vden_reg  <= vden;
end

assign vsync_out = vsync_reg;
assign hsync_out = hsync_reg;
assign vden_out  = vden_reg;
/****Delay Signals************************/
endmodule


/*
求最小值中的最大值。
*/
`timescale 1ns/1ps

module max_of_3(
//input
vclk,
vsync,
hsync,
vden,
min_x1,
min_x2,
min_x3,
//output
vsync_out,
hsync_out,
vden_out,
max_of_min
);
input vclk;
input vsync,hsync,vden;
input [23:0] min_x1,min_x2,min_x3;
output [23:0] max_of_min;
output vsync_out,hsync_out,vden_out;
reg [23:0] max_of_min=24'h0;
reg vsync_reg,hsync_reg,vden_reg;

always@(posedge vclk)
begin
if(min_x1>min_x2)
begin
if(min_x3>min_x1)
begin
max_of_min<=min_x3;
end
else
begin
max_of_min<=min_x1;
end
end
else
begin
if(min_x3>min_x2)
begin
max_of_min<=min_x3;
end
else
begin
max_of_min<=min_x2;
end
end
end
/****Delay Signals************************/
always @ (posedge vclk)
begin
vsync_reg <= vsync;
hsync_reg <= hsync;
vden_reg  <= vden;
end

assign vsync_out = vsync_reg;
assign hsync_out = hsync_reg;
assign vden_out  = vden_reg;
/****Delay Signals************************/
endmodule


`timescale  1ns/1ps

module pro_final_of_mid(
vsync,
hsync,
vden,
vclk,
vd11,
vd12,
vd13,
vd21,
vd22,
vd23,
vd31,
vd32,
vd33,
vsync_out,
hsync_out,
vden_out,
dout
);

input wire			 vsync;
input wire			 hsync;
input wire			 vden;
input wire			 vclk;
input wire	[23:0] vd11;
input wire	[23:0] vd12;
input wire	[23:0] vd13;
input wire	[23:0] vd21;
input wire	[23:0] vd22;
input wire	[23:0] vd23;
input wire	[23:0] vd31;
input wire	[23:0] vd32;
input wire	[23:0] vd33;
output wire		    vsync_out;
output wire			 hsync_out;
output wire			 vden_out;
output wire	[23:0] dout;

wire	[23:0] max_of_min;
wire	[23:0] max_x1;
wire	[23:0] max_x2;
wire	[23:0] max_x3;
wire	[23:0] mid_of_mid;
wire	[23:0] mid_x1;
wire	[23:0] mid_x2;
wire	[23:0] mid_x3;
wire	[23:0] min_of_max;
wire	[23:0] min_x1;
wire	[23:0] min_x2;
wire	[23:0] min_x3;
wire	[23:0] final_of_mid;
wire			 vden1_out;
wire			 vden11_out;
wire			 vden12_out;
wire			 vden2_out;
wire			 vden21_out;
wire			 vden22_out;
wire			 vden3_out;
wire			 hsync1_out;
wire			 hsync11_out;
wire			 hsync12_out;
wire			 hsync2_out;
wire			 hsync21_out;
wire			 hsync22_out;
wire			 hsync3_out;
wire			 vsync1_out;
wire			 vsync11_out;
wire			 vsync12_out;
wire			 vsync2_out;
wire			 vsync21_out;
wire			 vsync22_out;
wire			 vsync3_out;

reg	[23:0] max_x1_reg;
reg	[23:0] max_x2_reg;
reg	[23:0] max_x3_reg;
reg	[23:0] mid_x1_reg;
reg	[23:0] mid_x2_reg;
reg	[23:0] mid_x3_reg;
reg	[23:0] min_x1_reg;
reg	[23:0] min_x2_reg;
reg	[23:0] min_x3_reg;
reg	[23:0] max_of_min_reg;
reg	[23:0] mid_of_mid_reg;
reg   [23:0] min_of_max_reg;
reg			 vsync3_out_reg;
reg			 hsync3_out_reg;
reg          vden3_out_reg;
/****Cache Data******************************************/
always@(posedge vclk)
begin
vsync3_out_reg <= vsync3_out;
hsync3_out_reg <= hsync3_out;
vden3_out_reg  <= vden3_out;
min_x1_reg     <= min_x1;
mid_x1_reg		<= mid_x1;
max_x1_reg     <= max_x1;
min_x2_reg     <= min_x2;
mid_x2_reg		<= mid_x2;
max_x2_reg     <= max_x2;
min_x3_reg     <= min_x3;
mid_x3_reg		<= mid_x3;
max_x3_reg     <= max_x3;
max_of_min_reg <= max_of_min;
mid_of_mid_reg <= mid_of_mid;
min_of_max_reg <= min_of_max;
end
/****Cache Data******************************************/
rank_3_data	rank_x1(
.vclk(vclk),
.vsync(vsync),
.hsync(hsync),
.vden(vden),
.p1(vd31),
.p2(vd21),
.p3(vd11),
.vsync_out(vsync1_out),
.hsync_out(hsync1_out),
.vden_out(vden1_out),
.max(max_x1),
.mid(mid_x1),
.min(min_x1));

rank_3_data	rank_x2(
.vclk(vclk),
.vsync(vsync),
.hsync(hsync),
.vden(vden),
.p1(vd32),
.p2(vd22),
.p3(vd12),
.vsync_out(vsync11_out),
.hsync_out(hsync11_out),
.vden_out(vden11_out),
.max(max_x2),
.mid(mid_x2),
.min(min_x2));

rank_3_data	rank_x3(
.vclk(vclk),
.vsync(vsync),
.hsync(hsync),
.vden(vden),
.p1(vd33),
.p2(vd23),
.p3(vd13),
.vsync_out(vsync12_out),
.hsync_out(hsync12_out),
.vden_out(vden12_out),
.max(max_x3),
.mid(mid_x3),
.min(min_x3));

max_of_3	pro_max_of_min(
.vclk(vclk),
.vsync(vsync1_out),
.hsync(hsync1_out),
.vden(vden1_out),
.min_x1(min_x1),
.min_x2(min_x2),
.min_x3(min_x3),
.vsync_out(vsync2_out),
.hsync_out(hsync2_out),
.vden_out(vden2_out),
.max_of_min(max_of_min));

mid_of_3	pro_mid_of_mid(
.vclk(vclk),
.vsync(vsync1_out),
.hsync(hsync1_out),
.vden(vden1_out),
.mid_x1(mid_x1),
.mid_x2(mid_x2),
.mid_x3(mid_x3),
.vsync_out(vsync21_out),
.hsync_out(hsync21_out),
.vden_out(vden21_out),
.mid_of_mid(mid_of_mid));

min_of_3	pro_min_of_max(
.vclk(vclk),
.vsync(vsync1_out),
.hsync(hsync1_out),
.vden(vden1_out),
.max_x1(max_x1),
.max_x2(max_x2),
.max_x3(max_x3),
.vsync_out(vsync22_out),
.hsync_out(hsync22_out),
.vden_out(vden22_out),
.min_of_max(min_of_max));

mid_of_3	pro_final_of_mid(
.vclk(vclk),
.vsync(vsync2_out),
.hsync(hsync2_out),
.vden(vden2_out),
.mid_x1(max_of_min),
.mid_x2(mid_of_mid),
.mid_x3(min_of_max),
.vsync_out(vsync3_out),
.hsync_out(hsync3_out),
.vden_out(vden3_out),
.mid_of_mid(final_of_mid));

assign vsync_out = vsync3_out_reg;
assign hsync_out = hsync3_out_reg;
assign vden_out  = vden3_out_reg;
assign dout      = final_of_mid;
endmodule


module pro_final_of_mid(
//input
vclk,
vsync,
hsync,
vden,
vd11_in,
vd12_in,
vd13_in,
vd21_in,
vd22_in,
vd23_in,
vd31_in,
vd32_in,
vd33_in,
//output
vsync_out,
hsync_out,
vden_out,
final_of_mid,
);

/****Ports************************************/
input 			vclk;
input 			vsync,hsync,vden;
input  [23:0] 	vd11_in,vd12_in,vd13_in,vd21_in,vd22_in,vd23_in,vd31_in,vd32_in,vd33_in;
output [23:0]	final_of_mid;
output 			vsync_out,hsync_out,vden_out;
/****Ports************************************/

/****Signals**********************************/
wire [23:0] vd11_in,vd12_in,vd13_in,vd21_in,vd22_in,vd23_in,vd31_in,vd32_in,vd33_in;
wire [23:0] min_x1,mid_x1,max_x1;
wire [23:0] min_x2,mid_x2,max_x2;
wire [23:0] min_x3,mid_x3,max_x3;
wire [23:0] max_of_min,mid_of_mid,min_of_max;
reg  [23:0] max_of_min_reg,mid_of_mid_reg,min_of_max_reg;
wire [23:0] final_of_mid_reg;
wire        vsync,hsync,vden;
wire  		vsync1_out,hsync1_out,vden1_out;
wire  		vsync2_out,hsync2_out,vden2_out;
wire  		vsync_out,hsync_out,vden_out;
/****Signals**********************************/

always@(posedge vclk)
begin
max_of_min_reg<=max_of_min;
mid_of_mid_reg<=mid_of_mid;
min_of_max_reg<=min_of_max;
end

assign final_of_mid=final_of_mid_reg; //得出中值

rank_3_data u1(.vclk(vclk),.vsyns(vsync),.hsync(hsync),.vden(vden),.p1(vd31_in),.p2(vd21_in),.p3(vd11_in),.vsyns_out(vsync1_out),.hsync_out(hsync1_out),.vden_out(vden1_out),.min(min_x1),.mid(mid_x1),.max(max_x1));
rank_3_data u2(.vclk(vclk),.vsyns(vsync),.hsync(hsync),.vden(vden),.p1(vd32_in),.p2(vd22_in),.p3(vd12_in),.vsyns_out(vsync1_out),.hsync_out(hsync1_out),.vden_out(vden1_out),.min(min_x2),.mid(mid_x2),.max(max_x2));
rank_3_data u3(.vclk(vclk),.vsyns(vsync),.hsync(hsync),.vden(vden),.p1(vd33_in),.p2(vd23_in),.p3(vd13_in),.vsyns_out(vsync1_out),.hsync_out(hsync1_out),.vden_out(vden1_out),.min(min_x3),.mid(mid_x3),.max(max_x3));

//第1行排序
/*min_of_3 pro_max_of_min(.vclk(vclk),.vsyns(vsync1_out),.hsync(hsync1_out),.vden(vden1_out),.min_x1(min_x1),.min_x2(min_x2),.min_x3(min_x3),.vsyns_out(vsync2_out),.hsync_out(hsync2_out),.vden_out(vden2_out),.max_of_min(max_of_min));
//第2行排序
mid_of_3 pro_mid_of_mid(.vclk(vclk),.vsyns(vsync1_out),.hsync(hsync1_out),.vden(vden1_out),.mid_x1(mid_x1),.mid_x2(mid_x2),.mid_x3(mid_x3),.vsyns_out(vsync2_out),.hsync_out(hsync2_out),.vden_out(vden2_out),.mid_of_mid(mid_of_mid));
//第3行排序
max_of_3 pro_min_of_max(.vclk(vclk),.vsyns(vsync1_out),.hsync(hsync1_out),.vden(vden1_out),.max_x1(max_x1),.max_x2(max_x2),.max_x3(max_x3),.vsyns_out(vsync2_out),.hsync_out(hsync2_out),.vden_out(vden2_out),.min_of_max(min_of_max));

//对角线排序
mid_of_3 pro_final_of_mid(.vclk(vclk),.vsyns(vsync2_out),.hsync(hsync2_out),.vden(vden2_out),.mid_x1(max_of_min_reg),.mid_x2(mid_of_mid_reg),.mid_x3(min_of_max_reg),.vsyns_out(vsync_out),.hsync_out(hsync_out),.vden_out(vden_out),.mid_of_mid(final_of_mid_reg));
*/endmodule


/*	每一列三个数据的排序。
插入排序法,最少比较2次,最多比较3次
*/
`timescale 1ns/1ps

module rank_3_data(
//input
vclk,
vsync,
hsync,
vden,
p1,
p2,
p3,
//output
vsync_out,
hsync_out,
vden_out,
min,
mid,
max
);
input vclk;
input  vsync,hsync,vden;
input [23:0] p1,p2,p3;
output reg [23:0] min,mid,max;
output	vsync_out,hsync_out,vden_out;
reg vsync_reg,hsync_reg,vden_reg;

always @ (posedge vclk)
begin
if(p1<=p2)
begin
if(p3<=p1)
begin
min<=p3;
mid<=p1;
max<=p2;
end
else if(p3<=p2)
begin
min<=p1;
mid<=p3;
max<=p2;
end
else
begin
min<=p1;
mid<=p2;
max<=p3;
end
end
else
begin
if(p3<=p2)
begin
min<=p3;
mid<=p2;
max<=p1;
end
else if(p3<=p1)
begin
min<=p2;
mid<=p3;
max<=p1;
end
else
begin
min<=p2;
mid<=p1;
max<=p3;
end
end
end
/****Delay Signals************************/
always @ (posedge vclk)
begin
vsync_reg <= vsync;
hsync_reg <= hsync;
vden_reg  <= vden;
end

assign vsync_out = vsync_reg;
assign hsync_out = hsync_reg;
assign vden_out  = vden_reg;
/****Delay Signals************************/
endmodule


`timescale 1ns / 1ps

module shift_ram_256(
//input:
rst,    //reset
clk,    //clock
sen,    //shift enable
din,    //[23:0] data in
//output:
dout    //[23:0] data out
);

/****Parameters*************************************************************/
parameter DWIDTH = 24;
parameter AWIDTH = 8;
/****Parameters*************************************************************/

/****Port Definition********************************************************/
input						rst;
input 						clk;
input      					sen;
input 		[DWIDTH-1:0] 	din;
output 		[DWIDTH-1:0]  	dout;
/****Port Definition********************************************************/

/****Signals****************************************************************/
reg 	[DWIDTH-1:0]	RAM	[2**AWIDTH-1:0];
reg	[AWIDTH-1:0]	wadr_reg;
/****Signals****************************************************************/

/****Write******************************************************************/
always @ (posedge clk)
if(sen)
RAM[wadr_reg] <= din;
/****Write******************************************************************/

/****Read******************************************************************/
assign dout = RAM[wadr_reg];
/****Read******************************************************************/

/****Address***************************************************************/
always @ (posedge clk)
if(!rst)
wadr_reg <= 8'd0;
else if(sen)
wadr_reg  <= wadr_reg + 1'b1;
/****Address***************************************************************/

endmodule


`timescale 1ns / 1ps

module shifter(
//input:
input           vclk,
input           vsync,
input           hsync,
input           vden,
input   [23:0]  vd,
//output:
output          vsync_out,
output          hsync_out,
output          vden_out,
output  [23:0]  vd11_out,
output  [23:0]  vd12_out,
output  [23:0]  vd13_out,
output  [23:0]  vd21_out,
output  [23:0]  vd22_out,
output  [23:0]  vd23_out,
output  [23:0]  vd31_out,
output  [23:0]  vd32_out,
output  [23:0]  vd33_out
);

/****Parameters*****************************************************/
parameter	WIDTH 		= 8'd255;
parameter	HIGHT 		= 8'd255;

parameter	IDLE		= 3'd0;
parameter	ADD1		= 3'd1;
parameter	ADD2		= 3'd2;
parameter	NORMAL1		= 3'd3;
parameter	NORMAL2		= 3'd4;
parameter	SUB			= 3'd5;
parameter	ADD_VDEN	= 3'd6;
parameter	WAIT		= 3'd7;
/****Parameters*****************************************************/

/****Signals Definition*********************************************/
reg	[2:0]	  state_reg;

reg	[15:0]  cnt_reg;
reg	[7:0]	  row_reg;
reg	[7:0]	  col_reg;
reg        	  special_reg;

reg			  vsync_reg;
reg			  hsync_reg;
reg			  vden_reg;
reg			  vden2_reg;
reg	[23:0]  vd_reg;

wire	[23:0]  dout1;
wire	[23:0]  dout2;
wire			  vden_tmp;

reg			  vsync_out_reg;
reg			  hsync_out_reg;
reg			  vden_out_reg;
reg	[23:0]  vd21_out_reg;
reg  	[23:0]  vd22_out_reg;
reg	[23:0]  vd23_out_reg;
reg  	[23:0]  vd31_out_reg;
reg  	[23:0]  vd32_out_reg;
reg  	[23:0]  vd33_out_reg;
/****Signals Definition*********************************************/

/****Ctrl Signal Register*******************************************/
always @ (posedge vclk)
begin
vsync_reg <= vsync;
hsync_reg <= hsync;
vden_reg	 <= vden;
vd_reg	 <= vd;
end
/****Ctrl Signal Register*******************************************/

/****Vden Signal Delay**********************************************/
always @ (posedge vclk)
if(!vsync_reg)
begin
state_reg 	<=	IDLE;

row_reg		<= 8'd0;
cnt_reg  	<= 16'd0;
vden2_reg 	<= 1'b0;
end
else
begin
case(state_reg)
IDLE:begin
if(vden_reg)
state_reg <= ADD1;

row_reg	 	<= 8'd0;
cnt_reg  	<= 16'd0;
vden2_reg 	<= 1'b0;
end
ADD1:begin
if(!vden_reg)
state_reg <= ADD2;

cnt_reg <= cnt_reg + 1'b1;
end
ADD2:begin
if(vden_reg)
state_reg <= NORMAL1;

cnt_reg 	<= cnt_reg + 1'b1;
vden2_reg	<= vden;
end
NORMAL1:begin
if(!vden_reg)
state_reg <= NORMAL2;

if(!vden_reg)
row_reg <= row_reg + 1'b1;
vden2_reg 	<= vden;
end
NORMAL2:begin
if(vden_reg && row_reg == (HIGHT - 1'b1))
state_reg <= SUB;
else if(vden_reg)
state_reg <= NORMAL1;
vden2_reg 	<= vden;
end
SUB:begin
if(cnt_reg == 16'd1)
state_reg <= ADD_VDEN;

if(!vden_reg)
row_reg <= HIGHT;
cnt_reg <= cnt_reg - 1'b1;
vden2_reg <= vden;
end
ADD_VDEN:begin
if(cnt_reg == 16'd255)
state_reg <= WAIT;

cnt_reg <= cnt_reg + 1'b1;
vden2_reg <= 1'b1;
end
WAIT:begin
if(!vsync_reg)
state_reg <= IDLE;

vden2_reg <= 1'b0;
end
default:begin
state_reg 	<=	IDLE;

row_reg		<= 8'd0;
cnt_reg  	<= 16'd0;
vden2_reg 	<= 1'b0;
end
endcase
end
/****Vden Signal Delay**********************************************/

/****Two Shift RAM**************************************************/
assign vden_tmp = vden_reg | vden2_reg;
shift_ram_256 shift_ram_256_1(
//input:
.rst(vsync_reg),	//reset
.clk(vclk),    		//clock
.sen(vden_tmp), 	//shift enable
.din(dout2),   		//[23:0] data in
//output:
.dout(dout1)		//[23:0] data out
);

shift_ram_256 shift_ram_256_2(
//input:
.rst(vsync_reg),	//reset
.clk(vclk),    		//clock
.sen(vden_tmp), 	//shift enable
.din(vd_reg),   	//[23:0] data in
//output:
.dout(dout2)		//[23:0] data out
);
/****Two Shift RAM**************************************************/

/****Signal Output**************************************************/
always @ (posedge vclk)
if(vden2_reg)
col_reg <= col_reg + 1'b1;
else
col_reg <= 8'd0;

always @ (posedge vclk)
begin
vsync_out_reg <= vsync_reg;
hsync_out_reg <= hsync_reg;
vden_out_reg  <= vden2_reg;
end

always @ (posedge vclk)
if(!vsync_reg)
begin
vd21_out_reg <= 24'd0;
vd22_out_reg <= 24'd0;
vd23_out_reg <= 24'd0;
vd31_out_reg <= 24'd0;
vd32_out_reg <= 24'd0;
vd33_out_reg <= 24'd0;

special_reg <= 1'b0;
end
else if(vden2_reg)
begin
if(col_reg == 8'd0 || col_reg == WIDTH || row_reg == 8'd0 || row_reg == HIGHT)
special_reg <= 1'b1;
else
special_reg <= 1'b0;

vd21_out_reg <= dout1;
vd22_out_reg <= dout2;
vd23_out_reg <= vd_reg;
vd31_out_reg <= vd21_out_reg;
vd32_out_reg <= vd22_out_reg;
vd33_out_reg <= vd23_out_reg;
end
/****Signal Output**************************************************/

assign vsync_out 	= vsync_out_reg;
assign hsync_out 	= hsync_out_reg;
assign vden_out  	= vden_out_reg;

assign vd11_out	= special_reg ? vd22_out_reg : dout1;
assign vd12_out  	= special_reg ? vd22_out_reg : dout2;
assign vd13_out  	= special_reg ? vd22_out_reg : vd_reg;

assign vd21_out 	= special_reg ? vd22_out_reg : vd21_out_reg;
assign vd22_out 	= special_reg ? vd22_out_reg : vd22_out_reg;
assign vd23_out 	= special_reg ? vd22_out_reg : vd23_out_reg;

assign vd31_out 	= special_reg ? vd22_out_reg : vd31_out_reg;
assign vd32_out 	= special_reg ? vd22_out_reg : vd32_out_reg;
assign vd33_out 	= special_reg ? vd22_out_reg : vd33_out_reg;

endmodule


matlab仿真涉及的文件:

A=imread('cameraman.tif');
imshow(A)
B1=imnoise(A,'salt & pepper',0.02);
t=change(B1);
for c11=1:2:241
for c12=1:2:307
xl=number(c11,cl2,t);
if(selfmax(c11,cl2,t)-selfmin(cl1,c12,t))>2O&xl>0
[q11,q12]=noise(c11,cl2,t);
t(q11,q12)=selfmin(cl1,cl2,t);
end
if(selfmax(cl1,c12,t)-selfmin(cl1,c12,t))<2O&xl>0
[q11,ql2]=noise(c11,c12,1);
t(ql1,ql2)=meanfilter(cl1,cl2,t);
end
end
end
imshow(t)


A=imread('cameraman.tif');
imshow(A)
B1=imnoise(A,'salt & pepper',0.02);
t=change(B1);
for c11=1:2:241
for c12=1:2:307
xl=number(c11,cl2,t);
if(selfmax(c11,cl2,t)-selfmin(cl1,c12,t))>2O&xl>0
[q11,q12]=noise(c11,cl2,t);
t(q11,q12)=selfmin(cl1,cl2,t);
end
if(selfmax(cl1,c12,t)-selfmin(cl1,c12,t))<2O&xl>0
[q11,ql2]=noise(c11,c12,1);
t(ql1,ql2)=meanfilter(cl1,cl2,t);
end
end
end
imshow(t)


clear all;
close all;

%----Load Image-----------------------------------------------------------
img = imread('cameraman_zaodian.jpg');		%If you want test other picture,
%change it's name here.
imshow(img);					%Show the selectted image.
%----Load Image-----------------------------------------------------------
%----Write Image Data In RAM Format---------------------------------------
file = fopen('img_cameraman_zaodian_x.txt', 'w');	%Hex Format Data, used to inital
%The RAM in modelsim.
R = uint8(0);
G = uint8(0);
B = uint8(0)
for row = 1:256
for col = 1:256
R = uint8(img(row,col,1));
G = uint8(img(row,col,2));
B = uint8(img(row,col,3));
if(R < 16)
fprintf(file,'0');
end
fprintf(file,'%x',R);
if(G < 16)
fprintf(file,'0');
end
fprintf(file,'%x',G);
if(B < 16)
fprintf(file,'0');
end
fprintf(file,'%x\n',B);
end
end
%----Write Image Data In RAM Format---------------------------------------


clear all
clear all
I=imread('cameraman.jpg');%读入原图像
J=imread('cameraman_zaodian.jpg');%读入已含有噪点的图像
%---显示 原图像,已含有噪点的图像------------------------------------------
subplot(131),imshow(I)
title('原图像')
subplot(132),imshow(J)
title('噪点图像')

%---显示 原图像,已含有噪点的图像-------------------------------------------

%---将 噪点图像 经过 噪点处理(FPGA)后,显示--------------------------------

%----Data loading----------------------------------------------------------
data_fpga = load('fpga_cameraman_zaodian.txt');
%----Data loading----------------------------------------------------------

%---- median_filter_fpga--------------------------------------------------
img_median_filter_fpga = uint8(zeros(256,256,3));
for row = 1:256
for col =1:256
img_median_filter_fpga(row,col,1) = data_fpga((row-1)*256*3 + (col-1)*3 + 1);
img_median_filter_fpga(row,col,2) = data_fpga((row-1)*256*3 + (col-1)*3 + 2);
img_median_filter_fpga(row,col,3) = data_fpga((row-1)*256*3 + (col-1)*3 + 3);

end
end
subplot(1,3,3);
imshow(img_median_filter_fpga);
title('中值滤波 fpga ');
%---- median_filter_fpga----------------------------------------------------

%---将 噪点图像 经过 噪点处理(FPGA)后,显示----------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: