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

news/2024/10/19 0:20:32/

本文的思路框架:
①本文采用支持3x3算子模块和5x5算子模块的生成,用于后一级别的算法输入
②本例程中采用的FPGA设计技巧,可用于借鉴,一是generate if参数定义;二是调用xilinx和altera的sync fifo和async fifo原语实现不同平台同步fifo和异步fifo的功能,省去ip核的调用,简化代码移植

一、算子模板基础知识

在图像处理过程中,需要对图像进行滤波操作,在进行滤波操作通常使用算子模板,即扫描窗模板,一般有 3x3、5x5 等模板形式
3x3算子模板
在这里插入图片描述
5x5算子模板
在这里插入图片描述

二、FPGA设计思路

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

三、FPGA设计技巧

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

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

generateif(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 instantiationelse begin : SYNC_FIFOxpm_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             (                ));defparamdcfifo_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 instantiationelse 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            (                ));defparamscfifo_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选择

generateif(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    )    );        endelse begin : ALTERAaltera_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平台开发及仿真验证
在这里插入图片描述
在这里插入图片描述
⑤altera quartus平台开发及仿真验证

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/news/89848.html

相关文章

三天吃透Java面试八股文(2023最新整理)

文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Java的特点 Java是一门面向对象的编程语言。面…

探究javascript对象和数组的异同,及函数变量缓存技巧

javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象。这篇重点要提到的,就是任何jser都不陌生的Object和Array。 有段时间曾经很诧异,到底两种数据类型用来存储数据有什么不同。于是,我打算探究探究。 一、掌握三…

【TellMeCode】使用VSCODE + ChatGPT辅助分析推测源码

【TellMeCode】使用VSCODE ChatGPT辅助分析推测源码 0x00 功能简介 根据代码上下文相关信息,如工作区文件夹名称,代码所在路径等一系列信息,提供给大模型更多元和尽可能多的信息,利用其自身优势去检索相关的文档和博客&#xf…

IP协议-服务类型字段

服务类型(Type of Service)字段是比较复杂的一个字段,该字段经过多次标准变更。 IPv4报文 一、最初标准(RFC 791) RFC 791定义TOS字段总共占用8bit,分为IP Precedence优先级(3bit)、…

Dockerfile(1) - FROM 指令详解

FROM 指明当前的镜像基于哪个镜像构建dockerfile 必须以 FROM 开头&#xff0c;除了 ARG 命令可以在 FROM 前面 FROM [--platform<platform>] <image> [AS <name>]FROM [--platform<platform>] <image>[:<tag>] [AS <name>]FROM […

完美解决vue3 keep-alive多个路由使用同一个组件的缓存问题

之前页面少的话 用keep-live结合router-view&#xff0c;使用keep-live的include属性就可以自己决定keep-live缓存那些组件不缓存那些组件&#xff0c;直到遇到个问题。 平时写的代码如下&#xff1a; <router-view v-slot"{ Component, route }"><keep-al…

java面试应聘时的满分回答参考模板

java面试应聘时的满分回答参考模板 1、请你自我介绍一下自己好吗?2、你觉得你个性上最大的优点是什么?3、说说你最大的缺点?4、你对薪资的要求?5、你对加班的看法?6、如果通过这次面试我们录用了你,但工作一段时间却发现你根本不适合这个职位,你怎么办?7、谈谈你对跳槽…

第3章 单元测试-测验题-作业

在单元测试中&#xff0c;&#xff08;B &#xff09;是用来代替被测模块的子模块的。 驱动模块桩模块通讯模块代理模块在下面列举的测试覆盖中&#xff0c;&#xff08;D &#xff09;是最强的逻辑覆盖准则。 语句覆盖条件覆盖判定覆盖条件组合覆盖一个判定中的复合条件表达式…