数字逻辑课程的自由设计中,我编写了一个3x3开窗的中值滤波器,处理一副128*128像素值的图像,并且最终可以在FPGA上板实现。
中值滤波的本质就是对于一个n*n的窗口,将其内部的值进行排序,取中位数作为中间的点的值。通过中值滤波可以很好的减弱图片的噪声,并且报纸边缘不变。
中值滤波的硬件实现主要分为三个模块:开窗模块、中值计算模块与存储器模块。
【1】开窗模块主要需要利用循环同步计数器来实现,分别进行列和位置的循环,从而达到最终开窗的目的。
开窗模块的代码如下:
`timescale 1ns / 1ps // // Q为0~127计数的循环计数器,pos为1~128的循环计数器 // // clk为输入时钟, rst_n为低电平有效的reset信号,en为高电平有效的使能端 // // module Counter14(clk, rst_n, en, mm, aa, bb, cc, dd, ee, ff, gg, hh, jj); input clk, rst_n, en; output [13:0]mm,aa,bb,cc,dd,ee,ff,gg,hh,jj; wire [13:0]m_,Q_,a2,b2,c2,d2,e2,f2,g2,h2,j2; wire [15:0]m,Q,pos,pos2,a,b,c,d,e,f,g,h,j; wire [6:0]i; wire posm_w; not not1(posm_w, pos2[7]); assign Q_ = Q[13:0]; // 13位0~127计数器 // assign shamt2 = shamt[13:0];// 13位移位数据 assign mm = m[13:0]; assign a2 = a[13:0]; assign b2 = b[13:0]; assign c2 = c[13:0]; assign d2 = d[13:0]; assign e2 = e[13:0]; assign f2 = f[13:0]; assign g2 = g[13:0]; assign h2 = h[13:0]; assign j2 = j[13:0]; wire Q0, Q1, Q2, Q3, Q4, Q5; wire m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12; wire [15:0]a_,b_,c_,d_,e_,f_,g_,h_,j_; wire [13:0]ya,yb,yc,yd,ye,yf,yg,yh,yj; T_trigger t1(.clk(clk), .rst_n(rst_n), .EN(en), .Q(Q[0]), .QN(Q0)); T_trigger t2(.clk(Q0), .rst_n(rst_n), .EN(en), .Q(Q[1]), .QN(Q1)); T_trigger t3(.clk(Q1), .rst_n(rst_n), .EN(en), .Q(Q[2