中值滤波消除椒盐噪声,高斯滤波消除高斯噪声
1 `timescale 1ns / 1ps 2 ////////////////////////////////////////////////////////////////////////////////// 3 // Company: 4 // Engineer: 5 // 6 // Create Date: 2019/03/07 10:06:43 7 // Design Name: 8 // Module Name: matrix 9 // Project Name: 10 // Target Devices: 11 // Tool Versions: 12 // Description: 13 // 14 // Dependencies: 15 // 16 // Revision: 17 // Revision 0.01 - File Created 18 // Additional Comments: 19 // 20 ////////////////////////////////////////////////////////////////////////////////// 21 22 23 module matrix #( 24 parameter COL = 640 , 25 parameter ROW = 480 26 ) 27 ( 28 input clk , 29 input rst_n , 30 31 input data_de , 32 input [7:0] data , 33 34 output matrix_de , 35 36 output reg [7:0] matrix11 , 37 output reg [7:0] matrix12 , 38 output reg [7:0] matrix13 , 39 40 output reg [7:0] matrix21 , 41 output reg [7:0] matrix22 , 42 output reg [7:0] matrix23 , 43 44 output reg [7:0] matrix31 , 45 output reg [7:0] matrix32 , 46 output reg [7:0] matrix33 47 ); 48 49 wire [7:0] row3_data ; 50 wire [7:0] row2_data ; 51 wire [7:0] row1_data ; 52 53 reg [15:0] col_cnt ; 54 reg [15:0] row_cnt ; 55 56 wire row2_rd ; 57 58 reg data_de_r ; 59 reg data_de_r1 ; 60 61 wire u1_empty ; 62 wire u2_empty ; 63 64 wire wr_en ; 65 66 always@(posedge clk) 67 if(!rst_n) 68 col_cnt <= 'd0; 69 else if(col_cnt==COL-1) 70 col_cnt <= 'd0; 71 else if(data_de==1'b1) 72 col_cnt <= col_cnt + 1'b1; 73 else 74 col_cnt <= col_cnt; 75 76 always@(posedge clk) 77 if(!rst_n) 78 row_cnt <= 'd0; 79 else if(col_cnt==COL-1&&row_cnt==ROW-1) 80 row_cnt <= 'd0; 81 else if(col_cnt==COL-1) 82 row_cnt <= row_cnt + 1'b1; 83 else 84 row_cnt <= row_cnt; 85 86 always@(posedge clk) 87 if(!rst_n) 88 data_de_r <= 1'b0; 89 else 90 data_de_r <= data_de; 91 92 always@(posedge clk) 93 if(!rst_n) 94 data_de_r1 <= 1'b0; 95 else 96 data_de_r1 <= data_de_r; 97 98 assign matrix_de = data_de_r1 ; 99 assign row3_data = data; 100 assign wr_en = data_de&&row_cnt<ROW-1; 101 102 fifo_matrix_buf u1_fifo_matrix_buf ( 103 .rst (~rst_n ), 104 .wr_clk (clk ), 105 .rd_clk (clk ), 106 .din (row3_data ), 107 .wr_en (wr_en ), 108 .rd_en (row2_rd ), 109 .dout (row2_data ), 110 .full ( ), 111 .empty (u1_empty ) 112 ); 113 114 fifo_matrix_buf u2_fifo_matrix_buf ( 115 .rst (~rst_n ), 116 .wr_clk (clk ), 117 .rd_clk (clk ), 118 .din (row2_data ), 119 .wr_en (wr_en ), 120 .rd_en (row2_rd ), 121 .dout (row1_data ), 122 .full ( ), 123 .empty (u2_empty ) 124 ); 125 126 assign row2_rd = data_de&&row_cnt>0; 127 128 always@(posedge clk) 129 if(!rst_n) 130 begin 131 {matrix11, matrix12, matrix13} <= 24'd0; 132 {matrix21, matrix22, matrix23} <= 24'd0; 133 {matrix31, matrix32, matrix33} <= 24'd0; 134 end 135 else if(data_de==1'b1) 136 begin 137 {matrix11, matrix12, matrix13} <= {matrix12, matrix13, row1_data}; 138 {matrix21, matrix22, matrix23} <= {matrix22, matrix23, row2_data}; 139 {matrix31, matrix32, matrix33} <= {matrix32, matrix33, row3_data}; 140 end 141 else 142 begin 143 {matrix11, matrix12, matrix13} <= 24'd0; 144 {matrix21, matrix22, matrix23} <= 24'd0; 145 {matrix31, matrix32, matrix33} <= 24'd0; 146 end 147 148 149 150 151 152 153 154 155 endmodule
`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2021/01/13 23:18:52 // Design Name: // Module Name: ave_filter // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module ave_filter #( parameter COL=640, parameter ROW=480 ) ( input clk , input rst_n , input y_vs , input y_de , input [7:0] y_data , output ave_vs , output ave_de , output [7:0] ave_data ); wire matrix_de ; wire [7:0] matrix11 ; wire [7:0] matrix12 ; wire [7:0] matrix13 ; wire [7:0] matrix21 ; wire [7:0] matrix22 ; wire [7:0] matrix23 ; wire [7:0] matrix31 ; wire [7:0] matrix32 ; wire [7:0] matrix33 ; reg [3:0] matrix_de_r ; reg [15:0] one_line ; reg [15:0] second_line ; reg [15:0] third_line ; reg [15:0] add_line ; reg pre_ave_de ; reg [31:0] pre_ave_data0 ; wire [7:0] pre_ave_data ; matrix #( .COL(COL), .ROW(ROW) ) u1_matrix ( .clk (clk ), .rst_n (rst_n ), .data_de (y_de ), .data (y_data ), .matrix_de (matrix_de ), .matrix11 (matrix11 ), .matrix12 (matrix12 ), .matrix13 (matrix13 ), .matrix21 (matrix21 ), .matrix22 (matrix22 ), .matrix23 (matrix23 ), .matrix31 (matrix31 ), .matrix32 (matrix32 ), .matrix33 (matrix33 ) ); always@(posedge clk or negedge rst_n) if(!rst_n) matrix_de_r <= 4'd0; else matrix_de_r <= {matrix_de_r[2:0],matrix_de}; always@(posedge clk or negedge rst_n) if(!rst_n) one_line <= 'd0; else if(matrix_de==1'b1) one_line <= matrix11+matrix12+matrix13; else one_line <= 'd0; always@(posedge clk or negedge rst_n) if(!rst_n) second_line <= 'd0; else if(matrix_de==1'b1) second_line <= matrix21+matrix22+matrix23; else second_line <='d0; always@(posedge clk or negedge rst_n) if(!rst_n) third_line <= 'd0; else if(matrix_de==1'b1) third_line <= matrix31+matrix32+matrix33; else third_line <='d0; always@(posedge clk or negedge rst_n) if(!rst_n) add_line <= 'd0; else if(matrix_de_r[0]==1'b1) add_line <= one_line+second_line+third_line; else add_line <= 'd0; always@(posedge clk or negedge rst_n) if(!rst_n) pre_ave_de <= 1'b0; else if(matrix_de_r[1]==1'b1) pre_ave_de <= 1'b1; else pre_ave_de <= 1'b0; always@(posedge clk or negedge rst_n) if(!rst_n) pre_ave_data0 <= 'd0; else if(matrix_de_r[1]==1'b1) pre_ave_data0 <= add_line*7282; else pre_ave_data0 <= 'd0; assign pre_ave_data = pre_ave_data0[23:16]; move_cnter #( .COL(COL), .ROW(ROW), .DW (8 ) ) u1_move_cnter( .clk (clk ), .rst_n (rst_n ), .i_de (pre_ave_de ), .i_data (pre_ave_data ), .o_de (ave_de ), .o_data (ave_data ) ); assign ave_vs = y_vs; endmodule
`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2019/03/29 23:06:51 // Design Name: // Module Name: move_cnter // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module move_cnter #( parameter COL=640, parameter ROW=480, parameter DW =24 ) ( input clk , input rst_n , input i_de , input [DW-1:0] i_data , output reg o_de , output reg [DW-1:0] o_data ); reg [15:0] col_cnt ; reg [15:0] row_cnt ; reg [15:0] hcnt ; reg [15:0] vcnt ; reg cnt_de ; reg [7:0] cnt ; reg o_de_r ; reg o_de_r1 ; reg [DW-1:0] o_data_r ; reg [15:0] data_cnt ; wire o_de_r2 ; wire [DW-1:0] o_data_r2 ; always@(posedge clk or negedge rst_n) if(!rst_n) col_cnt <= 'd0; else if(col_cnt==COL-1) col_cnt <= 'd0; else if(i_de==1'b1) col_cnt <= col_cnt + 1'b1; else col_cnt <= col_cnt; always@(posedge clk or negedge rst_n) if(!rst_n) row_cnt <= 'd0; else if(col_cnt==COL-1&&row_cnt==ROW-1) row_cnt <= 'd0; else if(col_cnt==COL-1) row_cnt <= row_cnt + 1'b1; else row_cnt <= row_cnt; //去除第一行数据 always@(posedge clk or negedge rst_n) if(!rst_n) o_de_r1 <= 1'b0; else if(row_cnt>=1&&row_cnt<=ROW-1&&i_de) o_de_r1 <= 1'b1; else o_de_r1 <= 1'b0; always@(posedge clk or negedge rst_n) if(!rst_n) o_data_r <= 'd0; else if(row_cnt>=1&&row_cnt<=ROW-1&&i_de) o_data_r <= i_data; else o_data_r <= 'd0; //一帧数据计数完 always@(posedge clk or negedge rst_n) if(!rst_n) cnt_de <= 1'b0; else if(cnt=='d99) //实际波形为160个周期 cnt_de <= 1'b0; else if(col_cnt==COL-1&&row_cnt==ROW-1) cnt_de <= 1'b1; else cnt_de <= cnt_de; always@(posedge clk or negedge rst_n) if(!rst_n) cnt <= 'd0; else if(cnt=='d99) cnt <= 'd0; else if(cnt_de==1'b1) cnt <= cnt + 1'b1; else cnt <= cnt; always@(posedge clk or negedge rst_n) //最后一行数据补零的标志位 if(!rst_n) o_de_r <= 1'b0; else if(data_cnt==COL-1) o_de_r <= 1'b0; else if(cnt=='d99) o_de_r <= 1'b1; else o_de_r <= o_de_r; always@(posedge clk or negedge rst_n) if(!rst_n) data_cnt <='d0; else if(data_cnt==COL-1) data_cnt <= 'd0; else if(o_de_r==1'b1) data_cnt <= data_cnt + 1'b1; else data_cnt <= data_cnt; assign o_de_r2 = o_de_r||o_de_r1; assign o_data_r2 = o_de_r1?o_data_r:'d0; always@(posedge clk or negedge rst_n) if(!rst_n) hcnt <= 'd0; else if(hcnt==COL-1) hcnt <= 'd0; else if(o_de_r2==1'b1) hcnt <= hcnt + 1'b1; else hcnt <= hcnt; always@(posedge clk or negedge rst_n) if(!rst_n) vcnt <= 'd0; else if(hcnt==COL-1&&vcnt==ROW-1) vcnt <= 'd0; else if(hcnt==COL-1) vcnt <= vcnt + 1'b1; else vcnt <= vcnt; always@(posedge clk or negedge rst_n) if(!rst_n) o_de <= 1'b0; else o_de <= o_de_r2; //去掉了第一列的数据 always@(posedge clk or negedge rst_n) if(!rst_n) o_data <= 'd0; else if(hcnt>0&&hcnt<COL-1&&vcnt>0&&vcnt<ROW-1) o_data <= o_data_r2; else o_data <= 'd0; endmodule