FPGA实现中值滤波(采用shift_ram的ip核)

这篇文章详细描述了一个Verilog设计,实现了中值滤波模块,包括3x3滤波子模块和sort模块。它涉及到信号处理步骤,如使用filter_3x3模块对图像数据进行处理,然后通过sort函数对像素进行降序排列和取中值,最后同步行场信号。设计包括了时钟同步和信号复制功能,展示了中值滤波在图像处理中的应用。
摘要由CSDN通过智能技术生成

实现代码

中值滤波模块中还包含着filter_3x3模块和sort模块,而filter_3x3模块中又需要用到shift_ram的ip核模块。


module Median
//========================< 端口 >==========================================
(
input   wire                clk                     ,
input   wire                rst_n                   ,
//input ---------------------------------------------
input   wire                Y_de                    ,
input   wire                Y_hsync                 ,
input   wire                Y_vsync                 ,
input   wire    [15:0]      Y_data                  ,
//output --------------------------------------------
output  wire                median_de               ,
output  wire                median_hsync            ,
output  wire                median_vsync            ,
output  wire    [15:0]      median_data
);
//========================< 信号 >==========================================
//filter_3x3 ----------------------------------------
wire 	  [15:0]     filter_11,filter_12,filter_13    ;
wire 	  [15:0]     filter_21,filter_22,filter_23    ;
wire 	  [15:0]     filter_31,filter_32,filter_33    ;
//median --------------------------------------------
wire    [15:0]              max_data1               ;
wire    [15:0]              mid_data1               ;
wire    [15:0]              min_data1               ;
wire    [15:0]              max_data2               ;
wire    [15:0]              mid_data2               ;
wire    [15:0]              min_data2               ;
wire    [15:0]              max_data3               ;
wire    [15:0]              mid_data3               ;
wire    [15:0]              min_data3               ;
wire    [15:0]              max_min_data            ;
wire    [15:0]              mid_mid_data            ;
wire    [15:0]              min_max_data            ;
//同步 ----------------------------------------------
reg     [ 3:0]              Y_de_r                  ;
reg     [ 3:0]              Y_hsync_r               ;
reg     [ 3:0]              Y_vsync_r               ;
//==========================================================================
//==    3x3矩阵模块例化,耗费1clk
//==========================================================================
filter_3x3 filter_3x3_inst(
    .clk      (clk      ),
    .rst_n    (rst_n    ),
	.gray_de  (Y_de     ),	 
    .iData    (Y_data   ),

    .oData_11 (filter_11), .oData_12 (filter_12), .oData_13 (filter_13),
    .oData_21 (filter_21), .oData_22 (filter_22), .oData_23 (filter_23),
    .oData_31 (filter_31), .oData_32 (filter_32), .oData_33 (filter_33)
);
//==========================================================================
//==    中值滤波,耗费3clk
//==========================================================================
//每行像素降序排列,clk1
//---------------------------------------------------
//第1行
sort u1
(
    .clk                    (clk                    ),
    .rst_n                  (rst_n                  ),
    .data1                  (filter_11              ), 
    .data2                  (filter_12              ), 
    .data3                  (filter_13              ),
    .max_data               (max_data1              ),
    .mid_data               (mid_data1              ),
    .min_data               (min_data1              )
);

//第2行
sort u2
(
    .clk                    (clk                    ),
    .rst_n                  (rst_n                  ),
    .data1                  (filter_21              ),
    .data2                  (filter_22              ),
    .data3                  (filter_23              ),
    .max_data               (max_data2              ),
    .mid_data               (mid_data2              ),
    .min_data               (min_data2              )
);

//第3行
sort u3
(
    .clk                    (clk                    ),
    .rst_n                  (rst_n                  ),
    .data1                  (filter_31              ),
    .data2                  (filter_32              ),
    .data3                  (filter_33              ),
    .max_data               (max_data3              ),
    .mid_data               (mid_data3              ),
    .min_data               (min_data3              )
);

//三行的最小值取最大值
//三行的中间值取中间值
//三行的最大值取最小值,clk2
//---------------------------------------------------
//min-max
sort u4
(
    .clk                    (clk                    ),
    .rst_n                  (rst_n                  ),
    .data1                  (min_data1              ),
    .data2                  (min_data2              ),
    .data3                  (min_data3              ),
    .max_data               (min_max_data           ),
    .mid_data               (                       ),
    .min_data               (                       )
);

//mid-mid
sort u5
(
    .clk                    (clk                    ),
    .rst_n                  (rst_n                  ),
    .data1                  (mid_data1              ),
    .data2                  (mid_data2              ),
    .data3                  (mid_data3              ),
    .max_data               (                       ),
    .mid_data               (mid_mid_data           ),
    .min_data               (                       )
);

//max-min
sort u6
(
    .clk                    (clk                    ),
    .rst_n                  (rst_n                  ),
    .data1                  (max_data1              ), 
    .data2                  (max_data2              ), 
    .data3                  (max_data3              ),
    .max_data               (                       ),
    .mid_data               (                       ),
    .min_data               (max_min_data           )
);

//前面的三个值再取中间值,clk3
//---------------------------------------------------
sort u7
(
    .clk                    (clk                    ),
    .rst_n                  (rst_n                  ),
    .data1                  (max_min_data           ),
    .data2                  (mid_mid_data           ), 
    .data3                  (min_max_data           ),
    .max_data               (                       ),
    .mid_data               (median_data            ),
    .min_data               (                       )
);
//==========================================================================
//==    信号同步(打四拍)
//==========================================================================
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        Y_de_r    <= 4'b0;
        Y_hsync_r <= 4'b0;
        Y_vsync_r <= 4'b0;
    end
    else begin  
        Y_de_r    <= {Y_de_r[2:0],    Y_de};
        Y_hsync_r <= {Y_hsync_r[2:0], Y_hsync};
        Y_vsync_r <= {Y_vsync_r[2:0], Y_vsync};
    end
end

assign median_de    = Y_de_r[3];
assign median_hsync = Y_hsync_r[3];
assign median_vsync = Y_vsync_r[3];
    


endmodule

 

使能信号和行场同步信号,均打了四拍。 

IP核设置 

中值滤波结果

输入图片:

中值滤波后的输出图片: 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值