`timescale 1ns/1ns
module Median_Filter_top(
//system
clk , //像素时钟的同步,coms_clk , vga_clk
rst_n , //复位信号
//coms or vga
pre_vs , //前行同步
pre_hs , //前场同步
pre_en , //前数据有效
pre_img_Y , //数据灰度图像
//output
post_vs , //输出行同步
post_hs , //输出场同步
post_en , //输出数据有效
post_img_Y //输出数据灰度图像
);
//************************* input and output ***************************//
//system
input clk ; //像素时钟的同步,coms_clk , vga_clk
input rst_n ; //复位信号
//coms or vga
input pre_vs ; //前行同步
input pre_hs ; //前场同步
input pre_en ; //前数据有效
input [7:0] pre_img_Y ; //数据灰度图像
output post_vs ; //输出行同步
output post_hs ; //输出场同步
output post_en ; //输出数据有效
output [7:0] post_img_Y ; //输出数据灰度图像
//************************* main code ********************************//
wire [7:0] matrixp11,matrixp12,matrixp13;
wire [7:0] matrixp21,matrixp22,matrixp23;
wire [7:0] matrixp31,matrixp32,matrixp33;
wire matrix_vs ;
wire matrix_hs ;
wire matrix_en ;
Generate_Matrix_3x3_8bit Generate_Matrix_3x3_8bit(
//system
.clk (clk ), //像素时钟的同步,coms_clk , vga_clk
.rst_n (rst_n ), //复位信号
//coms or vga
.pre_vs (pre_vs ), //前行同步
.pre_hs (pre_hs ), //前场同步
.pre_en (pre_en ), //前数据有效
.pre_img_Y (pre_img_Y ), //数据灰度图像
.matrixp11 (matrixp11 ),
.matrixp12 (matrixp12 ),
.matrixp13 (matrixp13 ),
.matrixp21 (matrixp21 ),
.matrixp22 (matrixp22 ),
.matrixp23 (matrixp23 ),
.matrixp31 (matrixp31 ),
.matrixp32 (matrixp32 ),
.matrixp33 (matrixp33 ),
.matrix_vs (matrix_vs ),
.matrix_hs (matrix_hs ),
.matrix_en (matrix_en )
);
wire [7:0] median_data;
Median_Filter_3X3 Median_Filter_3X3(
//system
.clk (clk ), //像素时钟的同步,coms_clk , vga_clk
.rst_n (rst_n ), //复位信号
//coms or vga
.matrixp11 (matrixp11 ),
.matrixp12 (matrixp12 ),
.matrixp13 (matrixp13 ),
.matrixp21 (matrixp21 ),
.matrixp22 (matrixp22 ),
.matrixp23 (matrixp23 ),
.matrixp31 (matrixp31 ),
.matrixp32 (matrixp32 ),
.matrixp33 (matrixp33 ),
.median_data (median_data )
);
//行-列-行 3个时钟的延迟
reg [2:0] matrix_vs_r;
reg [2:0] matrix_hs_r;
reg [2:0] matrix_en_r;
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
matrix_vs_r <= 'd0;
matrix_hs_r <= 'd0;
matrix_en_r <= 'd0;
end
else begin
matrix_vs_r <= {matrix_vs_r[1:0],matrix_vs};
matrix_hs_r <= {matrix_hs_r[1:0],matrix_hs};
matrix_en_r <= {matrix_en_r[1:0],matrix_en};
end
end
assign post_vs = matrix_vs_r[2] ;
assign post_hs = matrix_hs_r[2] ;
assign post_en = matrix_en_r[2] ;
assign post_img_Y = (post_en) ? median_data:8'd0;
endmodule
1 `timescale 1ns/1ns
2 module Median_Filter_top_tb;
3
4
5
6
7 //system
8 reg clk ; //像素时钟的同步,coms_clk , vga_clk
9 reg rst_n ; //复位信号
10 //coms or vga
11 reg pre_vs ; //前行同步
12 reg pre_hs ; //前场同步
13 reg pre_en ; //前数据有效
14 reg [7:0] pre_img_Y ; //数据灰度图像
15
16 wire post_vs ; //输出行同步
17 wire post_hs ; //输出场同步
18 wire post_en ; //输出数据有效
19 wire [7:0] post_img_Y ; //输出数据灰度图像
20
21 initial clk = 1;
22 always #5 clk = ~clk;
23
24 initial begin
25 rst_n = 0;
26 pre_vs =0 ;
27 pre_hs = 0;
28 pre_en = 0;
29 pre_img_Y = 0;
30 #51;
31 rst_n = 1;
32 pre_vs = 1;
33 #20;
34 pre_hs = 1;
35 #20;
36 pre_en = 1;
37 #60;
38 pre_en = 0;
39 #20;
40 pre_hs = 0;
41 #20;
42 pre_hs = 1;
43 #20;
44 pre_en = 1;
45 #60;
46 pre_en = 0;
47 #20;
48 pre_hs = 0;
49 #20;
50 pre_hs = 1;
51 #20;
52 pre_en = 1;
53 #60;
54 pre_en = 0;
55 #20;
56 pre_hs = 0;
57 #20;
58 pre_hs = 1;
59 #20;
60 pre_en = 1;
61 #60;
62 pre_en = 0;
63 #20;
64 pre_hs = 0;
65 #20;
66 pre_hs = 1;
67 #20;
68 pre_en = 1;
69 #60;
70 pre_en = 0;
71 #20;
72 pre_hs = 0;
73 $stop;
74 end
75
76 reg [7:0] shiftin;
77 always@(posedge clk or negedge rst_n ) begin
78 if(!rst_n)
79 shiftin <= 'd1;
80 else if(pre_en)
81 shiftin <= shiftin + 1'b1;
82 else
83 shiftin <= shiftin;
84 end
85
86
87 Median_Filter_top Median_Filter_top(
88 //system
89 .clk (clk ), //像素时钟的同步,coms_clk , vga_clk
90 .rst_n (rst_n ), //复位信号
91 //coms or vga
92 .pre_vs (pre_vs ), //前行同步
93 .pre_hs (pre_hs ), //前场同步
94 .pre_en (pre_en ), //前数据有效
95 .pre_img_Y (shiftin ), //数据灰度图像
96 //output
97 .post_vs (post_vs ), //输出行同步
98 .post_hs (post_hs ), //输出场同步
99 .post_en (post_en ), //输出数据有效
100 .post_img_Y (post_img_Y ) //输出数据灰度图像
101
102 );
103
104
105
106
107 endmodule