基于fpga的图像处理之3x3_5x5算子模板中值排序

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等
源码工程链接
https://download.csdn.net/download/m0_50111463/88529268
本文的思路框架:
①本文介绍3x3算子模块和5x5算子模块中,矩阵转化成串行数据后,对其排序,并获取矩阵中值数据;
②本例程中采用的FPGA设计技巧,可用于借鉴,一是采用for循环实现串行数据转化并行数据;二是采用两级for循环实现矩阵中数据的比较;
③本文比较采用纯逻辑方式进行比较,一个时钟输出数据,并且提供了3x3和5x5的矩阵算子模板使用的逻辑资源,需斟酌考虑使用,也就是所谓的面积和速度之间的平衡选择
1、排序算法(组合逻辑实现)
①通过for循环实现串行数据转换并行数据,用于下一级模块的比较,此处使用i计数;
②将i从最大值递减,确保当前矩阵最后一个数据输入;
③引入j,用于相邻的两组数据输入比较,将较小值赋值给中间值,进入下一级循环

   integer i, j;
    always@(*)
    begin  
        for (i = 0; i < MATRIX_DATA_NUM; i = i + 1)
            begin
                image_array[i+1] = i_image_matrix_data[i*SIGNAL_DATA_WIDTH +: SIGNAL_DATA_WIDTH];
            end

        for (i = MATRIX_DATA_NUM; i > 0; i = i - 1)
            begin
                for (j = 1 ; j < i; j = j + 1)
                    begin
                        if (image_array[j] < image_array[j + 1])
                            begin
                                image_sort_temp        = image_array[j];
                                image_array[j]        = image_array[j + 1];
                                image_array[j + 1]    = image_sort_temp;
                            end
                    end
            end
    end

2、不同算子模块的资源比较
3x3算子模块的中值排序资源使用
在这里插入图片描述
5x5算子模块的中值排序资源使用
在这里插入图片描述
3、中值排序算法仿真验证
在这里插入图片描述

`ifdef MATRIX_3x3
    parameter MATRIX_DATA_NUM        = 9                                        ;
    parameter SIGNAL_DATA_WIDTH     = 8                                        ;
    parameter MATRIX_DATA_WIDTH        = SIGNAL_DATA_WIDTH * MATRIX_DATA_NUM    ;
    reg                      [MATRIX_DATA_WIDTH-1:0]        i_image_matrix_data    ;    
    wire                    [SIGNAL_DATA_WIDTH-1:0]        o_image_median_data    ;    
    initial begin
        #(CLK_PERIOD_50M * 10000);
        i_image_matrix_data = {    8'd31,8'd22,8'd23,
                                8'd24,8'd25,8'd26,
                                8'd27,8'd28,8'd39};
        #(CLK_PERIOD_50M * 1000);
        i_image_matrix_data = {    8'd51,8'd42,8'd43,
                                8'd44,8'd45,8'd46,
                                8'd47,8'd48,8'd59};
        #(CLK_PERIOD_50M * 1000);
        $stop;
    end
`endif
    
`ifdef MATRIX_5x5
    parameter MATRIX_DATA_NUM        = 25                                    ;
    parameter SIGNAL_DATA_WIDTH     = 8                                        ;
    parameter MATRIX_DATA_WIDTH        = SIGNAL_DATA_WIDTH * MATRIX_DATA_NUM    ;
    reg                      [MATRIX_DATA_WIDTH-1:0]        i_image_matrix_data    ;    
    wire                    [SIGNAL_DATA_WIDTH-1:0]        o_image_median_data    ;    
    initial begin
        #(CLK_PERIOD_50M * 10000);
        i_image_matrix_data = {    8'd31,8'd22,8'd23,8'd42,8'd13,
                                8'd24,8'd25,8'd26,8'd55,8'd2,
                                8'd27,8'd28,8'd39,8'd68,8'd3,
                                8'd12,8'd38,8'd49,8'd78,8'd59,
                                8'd17,8'd15,8'd99,8'd18,8'd9};
        #(CLK_PERIOD_50M * 1000);
        i_image_matrix_data = {    8'd31,8'd22,8'd23,8'd42,8'd13,
                                8'd84,8'd25,8'd26,8'd55,8'd2,
                                8'd87,8'd78,8'd29,8'd68,8'd3,
                                8'd85,8'd71,8'd89,8'd78,8'd59,
                                8'd82,8'd72,8'd88,8'd18,8'd9};                            
        #(CLK_PERIOD_50M * 1000);
        $stop;
    end    
`endif

仿真结果
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小灰灰的FPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值