基于fpga的图像处理之3x3_5x5算子模板设计

这篇具有很好参考价值的文章主要介绍了基于fpga的图像处理之3x3_5x5算子模板设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等
源码工程链接
https://download.csdn.net/download/m0_50111463/88529239
本文的思路框架:
①本文采用支持3x3算子模块和5x5算子模块的生成,用于后一级别的算法输入
②本例程中采用的FPGA设计技巧,可用于借鉴,一是generate if参数定义;二是调用xilinx和altera的sync fifo和async fifo原语实现不同平台同步fifo和异步fifo的功能,省去ip核的调用,简化代码移植

一、算子模板基础知识

在图像处理过程中,需要对图像进行滤波操作,在进行滤波操作通常使用算子模板,即扫描窗模板,一般有 3x3、5x5 等模板形式
3x3算子模板
基于fpga的图像处理之3x3_5x5算子模板设计
5x5算子模板
基于fpga的图像处理之3x3_5x5算子模板设计

二、FPGA设计思路

使用 FIFO 来缓存图像的行数据,如果取 3x3 的模板,那么至少需要两个深度大于图像行数据的长度的 FIFO,通过首尾相连的形式来缓存两行数据,等第三行数据到来之时,同时输出三行数据。
同理如果是5x5的模板,需要四个深度大于行数据长度的FIFO,通过收尾相连的形式来缓存四行数据,等第五行数据到来之时,同时输出五行数据。其余类推即可。
3x3模板设计及部分代码分析
基于fpga的图像处理之3x3_5x5算子模板设计
代码实现功能分析:
基于fpga的图像处理之3x3_5x5算子模板设计
基于fpga的图像处理之3x3_5x5算子模板设计

三、FPGA设计技巧

1、generate if参数定义,未选择部分,eda软件会自动优化掉,不会造成逻辑资源浪费。

2、调用xilinx和altera的sync fifo和async fifo原语实现不同平台同步fifo和异步fifo的功能,省去ip核的调用,简化代码移植
①xilinx sync fifo和async fifo的原语调用

generate
    if(ASYNC_CLK == 1)
        begin : ASYNC_FIFO    
            xpm_fifo_async #(
                .CDC_SYNC_STAGES(3),       // DECIMAL
                .DOUT_RESET_VALUE("0"),    // String
                .ECC_MODE("no_ecc"),       // String
                .FIFO_MEMORY_TYPE(FIFO_MEMORY_TYPE), // String
                .FIFO_READ_LATENCY(FIFO_READ_LATENCY),     // DECIMAL
                .FIFO_WRITE_DEPTH(FIFO_DEPTH),   // DECIMAL
                .FULL_RESET_VALUE(1),      // DECIMAL
                .PROG_EMPTY_THRESH(5),    // DECIMAL
                .PROG_FULL_THRESH(PROG_FULL_THRESH),     // DECIMAL
                .RD_DATA_COUNT_WIDTH(COUNT_WIDTH),   // DECIMAL
                .READ_DATA_WIDTH(WRITE_DATA_WIDTH),      // DECIMAL
                .READ_MODE(FIFO_READ_MODE),         // String
                .RELATED_CLOCKS(0),        // DECIMAL
                .SIM_ASSERT_CHK(0),        // DECIMAL; 0=disable simulation messages, 1=enable simulation messages
                .USE_ADV_FEATURES("1707"), // String
                .WAKEUP_TIME(0),           // DECIMAL
                .WRITE_DATA_WIDTH(WRITE_DATA_WIDTH),     // DECIMAL
                .WR_DATA_COUNT_WIDTH(COUNT_WIDTH)    // DECIMAL
            )
            xpm_fifo_inst (
                .almost_empty            (),    //unused                       
                .almost_full            (),    //unused
                .data_valid                (),
                .dbiterr                (),            
                .dout                    (o_rd_data                ),                 
                .empty                    (o_rd_empty                ),                
                .full                    (o_wr_full                ),                  
                .overflow                (),          
                .prog_empty                (o_rd_arempty            ),      
                .prog_full                (o_wr_awfull            ),        
                .rd_data_count            (o_rd_cnt                ),
                .rd_rst_busy            (),    
                .sbiterr                (),            
                .underflow                (),        
                .wr_ack                    (),   //unused                
                .wr_data_count            (o_wr_cnt                ),
                .wr_rst_busy            (),    
                .din                    (i_wr_data                ),                    
                .injectdbiterr            (1'b0),
                .injectsbiterr            (1'b0),
                .rd_clk                    (i_rd_clk                ),              
                .rd_en                    (i_rd_en                ),                
                .rst                    (i_wr_rst || i_rd_rst    ),                    
                .sleep                    (1'b0),                
                .wr_clk                    (i_wr_clk                ),              
                .wr_en                    (i_wr_en                )                            
            );
        end
   // End of xpm_fifo_async_inst instantiation
    else begin : SYNC_FIFO
            xpm_fifo_sync #(
                .DOUT_RESET_VALUE("0"),    // String
                .ECC_MODE("no_ecc"),       // String
                .FIFO_MEMORY_TYPE(FIFO_MEMORY_TYPE), // String
                .FIFO_READ_LATENCY(FIFO_READ_LATENCY),     // DECIMAL
                .FIFO_WRITE_DEPTH(FIFO_DEPTH),   // DECIMAL
                .FULL_RESET_VALUE(1),      // DECIMAL
                .PROG_EMPTY_THRESH(5),    // DECIMAL
                .PROG_FULL_THRESH(PROG_FULL_THRESH),     // DECIMAL
                .RD_DATA_COUNT_WIDTH(COUNT_WIDTH),   // DECIMAL
                .READ_DATA_WIDTH(WRITE_DATA_WIDTH),      // DECIMAL
                .READ_MODE(FIFO_READ_MODE),         // String
                .SIM_ASSERT_CHK(0),        // DECIMAL; 0=disable simulation messages, 1=enable simulation messages
                .USE_ADV_FEATURES("1707"), // String
                .WAKEUP_TIME(0),           // DECIMAL
                .WRITE_DATA_WIDTH(WRITE_DATA_WIDTH),     // DECIMAL
                .WR_DATA_COUNT_WIDTH(COUNT_WIDTH)    // DECIMAL
            )
            xpm_fifo_inst (
                .almost_empty            (),    //unused                       
                .almost_full            (),    //unused
                .data_valid                (),   
                .dbiterr                (),            
                .dout                    (o_rd_data                ),                  
                .empty                    (o_rd_empty                ),                
                .full                    (o_wr_full                ),                  
                .overflow                (),          
                .prog_empty                (o_rd_arempty            ),      
                .prog_full                (o_wr_awfull            ),        
                .rd_data_count            (o_rd_cnt                ),
                .rd_rst_busy            (),    
                .sbiterr                (),            
                .underflow                (),        
                .wr_ack                    (),    //unused                
                .wr_data_count            (o_wr_cnt                ),
                .wr_rst_busy            (),    
                .din                    (i_wr_data                ),                    
                .injectdbiterr            (1'b0),
                .injectsbiterr            (1'b0),
                .rd_en                    (i_rd_en                ),                
                .rst                    (i_wr_rst                ),                    
                .sleep                    (1'b0),                
                .wr_clk                    (i_wr_clk                ),              
                .wr_en                    (i_wr_en                )                 
            );
         end
endgenerate

②altera sync fifo和async fifo的原语调用

generate     
    if(ASYNC_CLK == 1)
        begin  : ASYNC_FIFO    
            dcfifo dcfifo_component (
                .rdclk             (i_rd_clk        ),
                .wrclk             (i_wr_clk        ),
                .wrreq             (i_wr_en        ),
                .data             (i_wr_data        ),
                .rdreq             (i_rd_en        ),
                .wrempty         (o_rd_empty        ),
                .wrfull         (o_wr_full        ),
                .q                 (o_rd_data        ),
                .rdempty         (o_rd_arempty    ),
                .rdfull         (o_wr_awfull    ),
                .wrusedw         (o_wr_cnt        ),
                .rdusedw         (o_rd_cnt        ),
                .aclr             (                )
            );
            defparam
                dcfifo_component.intended_device_family = DEVICE,
                dcfifo_component.lpm_numwords = FIFO_DEPTH,
                dcfifo_component.lpm_showahead = FIFO_READ_MODE,
                dcfifo_component.lpm_type = "dcfifo",
                dcfifo_component.lpm_width = DATA_WIDTH,
                dcfifo_component.lpm_widthu = ADDR_WIDTH,
                dcfifo_component.overflow_checking = "ON",
                dcfifo_component.rdsync_delaypipe = 3,
                dcfifo_component.underflow_checking = "ON",
                dcfifo_component.use_eab = "ON",
                dcfifo_component.wrsync_delaypipe = 3;            
        end
   // End of xpm_fifo_async_inst instantiation
    else begin : SYNC_FIFO    
            scfifo    scfifo_component(
                .clock             (i_wr_clk        ),
                .sclr             (i_wr_rst        ),
                .wrreq             (i_wr_en        ),
                .data            (i_wr_data        ),
                .rdreq             (i_rd_en        ),
                .usedw             (o_wr_cnt        ),
                .empty             (o_rd_empty        ),
                .full             (o_wr_full        ),
                .q                 (o_rd_data        ),
                .almost_empty     (o_rd_arempty    ),
                .almost_full     (o_wr_awfull    ),
                .aclr            (                )
            );
            defparam
                scfifo_component.add_ram_output_register = "OFF",
                scfifo_component.almost_empty_value = 2,
                scfifo_component.almost_full_value = PROG_FULL_THRESH,
                scfifo_component.intended_device_family = DEVICE,
                scfifo_component.lpm_numwords = FIFO_DEPTH,
                scfifo_component.lpm_showahead = FIFO_READ_MODE,
                scfifo_component.lpm_type = "scfifo",
                scfifo_component.lpm_width = DATA_WIDTH,
                scfifo_component.lpm_widthu = ADDR_WIDTH,
                scfifo_component.overflow_checking = "ON",
                scfifo_component.underflow_checking = "ON",
                scfifo_component.use_eab = "ON";    
         end
endgenerate      

③xilinx和altera平台fifo选择

generate
    if(DEVICE_CHOODE == "xilinx")
        begin : XILINX    
            xilinx_fifo #(
                .DATA_WIDTH      (DATA_WIDTH        ),
                .ASYNC_CLK         (ASYNC_CLK        ),
                .ADDR_WIDTH      (ADDR_WIDTH        ),
                .READ_MODE         (READ_MODE        )//0:STA fifo  1:FWFT
            )xilinx_fifo_init(
                .i_wr_clk        (i_wr_clk        ),
                .i_wr_rst        (i_wr_rst        ),
                .i_wr_en        (i_wr_en        ),
                .i_wr_data        (i_wr_data        ),
                .o_wr_cnt        (o_wr_cnt        ),
                .o_wr_full        (o_wr_full        ),
                .o_wr_awfull    (o_wr_awfull    ),    
                .i_rd_clk        (i_rd_clk        ),
                .i_rd_rst        (i_rd_rst        ),
                .i_rd_en        (i_rd_en        ),
                .o_rd_data        (o_rd_data        ),
                .o_rd_cnt        (o_rd_cnt        ),
                .o_rd_empty        (o_rd_empty        ),
                .o_rd_arempty    (o_rd_arempty    )    
            );        
        end
    else begin : ALTERA
                altera_fifo #(
                    .DATA_WIDTH      (DATA_WIDTH        ),
                    .ASYNC_CLK         (ASYNC_CLK        ),
                    .ADDR_WIDTH      (ADDR_WIDTH        ),
                    .READ_MODE         (READ_MODE        )//0:STA fifo  1:FWFT
                )altera_fifo_init(
                    .i_wr_clk        (i_wr_clk        ),
                    .i_wr_rst        (i_wr_rst        ),
                    .i_wr_en        (i_wr_en        ),
                    .i_wr_data        (i_wr_data        ),
                    .o_wr_cnt        (o_wr_cnt        ),
                    .o_wr_full        (o_wr_full        ),
                    .o_wr_awfull    (o_wr_awfull    ),    
                    .i_rd_clk        (i_rd_clk        ),
                    .i_rd_rst        (i_rd_rst        ),
                    .i_rd_en        (i_rd_en        ),
                    .o_rd_data        (o_rd_data        ),
                    .o_rd_cnt        (o_rd_cnt        ),
                    .o_rd_empty        (o_rd_empty        ),
                    .o_rd_arempty    (o_rd_arempty    )    
                );        
            end
endgenerate

④xilinx vivado平台开发及仿真验证
基于fpga的图像处理之3x3_5x5算子模板设计
基于fpga的图像处理之3x3_5x5算子模板设计
⑤altera quartus平台开发及仿真验证

基于fpga的图像处理之3x3_5x5算子模板设计
基于fpga的图像处理之3x3_5x5算子模板设计文章来源地址https://www.toymoban.com/news/detail-451340.html

到了这里,关于基于fpga的图像处理之3x3_5x5算子模板设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于FPGA的数字图像处理【1.0】

            最近几年图像处理与机器视觉的发展非常迅速,图像处理领域也被认为是未来几十年最有前途的领域之一。         随着现代图像及视频处理技术的不断发展,人们对图像处理提出了新的要求,图像处理系统的硬件体积越来越小,实时性也越来越好。特别是最

    2024年04月14日
    浏览(36)
  • 基于fpga的图像处理之图像灰度化处理(Vivado+Modelsim+Matlab联合仿真验证)

    微信公众号上线,搜索公众号 小灰灰的FPGA ,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 源码工程链接 https://download.csdn.net/download/m0_50111463/88529260

    2024年02月10日
    浏览(58)
  • 基于FPGA的车牌识别,其中包括常规FPGA图像处理算法

    基于FPGA的车牌识别,其中包括常规FPGA图像处理算法:         rgb转yuv,        sobel边缘检测,        腐蚀膨胀,        特征值提取与卷积模板匹配。 有bit流可以直接烧录实验。 保证无错误,完好,2018.3vivado版本,正点达芬奇Pro100t,板卡也可以自己更改移植一下。 所

    2024年04月14日
    浏览(48)
  • 图像处理Sobel 算子

      Sobel算子是一种常用的图像处理算法,用于边缘检测。它利用了图像中灰度值的变化来识别边缘的位置。在OpenCV中,Sobel算子通常用于图像梯度计算,其中包括水平方向和垂直方向的梯度。这两个方向的梯度合并后可以得到图像的边缘信息。 原理:   Sobel算子的原理基

    2024年02月04日
    浏览(45)
  • 基于FPGA的运动目标检测跟踪系统项目,FPGA项目,FPGA图像处理(已实现)

      1.项目简介 基于FPGA的运动目标检测跟踪系统项目,FPGA项目,FPGA图像处理 FPGA项目 采用帧间差分法作为核心算法,该项目涉及图像采集,颜色空间转换,帧间差分核心算法,腐蚀等形态学处理,目标定位,目标标识,图像显示等模块。 通过该项目可以学习到以下两方面内容

    2024年02月07日
    浏览(46)
  • 我在Vscode学OpenCV 图像处理三(图像梯度--边缘检测【图像梯度、Sobel 算子、 Scharr 算子、 Laplacian 算子、Canny 边缘检测】)

    这里需要区分开边缘检测和轮廓检测 边缘检测并非万能,边缘检测虽然能够检测出边缘,但边缘是不连续的,检测到的边缘并不是一个整体。图像轮廓是指将边缘连接起来形成的一个整体,用于后续的计算。 OpenCV 提供了查找图像轮廓的函数 cv2.findContours(),该函数能够查找图

    2024年02月04日
    浏览(56)
  • 模式识别与图像处理课程实验一:图像处理实验(颜色算子实验、Susan、Harris角点检测实验、 sobel边缘算子检测实验)

    要求编写一个包含颜色算子,Susan,Harris,角点,sobel边缘算子的程。 实验的程序如下 运行结果如下 实验原图 实验结果图 实验的程序如下 运行结果如下 实验原图 实验结果图 实验的程序如下 运行结果如下 实验原图 实验结果图 Susan角点检测程序如下 运行结果如下 实验原图

    2024年02月02日
    浏览(47)
  • 图像处理之梯度及边缘检测算子

    梯度是一个量变化的速度,在数学中通常使用求导、求偏导获取梯度或者某一方向上的梯度。 在数字图像中梯度可以看为像素值分别在x,y方向上的变化速度,因为数字图像的离散型,以及像素是最小处理单元的特性,求数字图像的梯度时,不需要求导,只需要进行加减运算即

    2024年02月16日
    浏览(41)
  • 图像处理与计算机视觉--第五章-图像分割-Canny算子

    2.1.Canny算子简单介绍 Canny算子是一种非常常用的边缘检测算子,其效果图如下所示: 2.2.Canny算子边缘检测指标 Canny算子是基于边缘检测来实现的,那么边缘检测的指标如下所示: (1)好的信噪比,即将非边缘点判定为边缘点的概率要低。 (2)高定位,检测出的边缘要在实际边缘中

    2024年02月07日
    浏览(53)
  • 图像处理之LoG算子(高斯拉普拉斯)

    LoG算子是由拉普拉斯算子改进而来。拉普拉斯算子是二阶导数算子,是一个标量,具有线性、位移不变性,其传函在频域空间的原点为0。所有经过拉普拉斯算子滤波的图像具有零平均灰度。但是该算子的缺点是对噪声具有敏感性,因此在实际应用中,一般先要对图像进行平滑

    2024年02月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包