【FPGA图像处理实战】 您所在的位置:网站首页 fpga实现图像处理 【FPGA图像处理实战】

【FPGA图像处理实战】

2024-06-29 09:54| 来源: 网络整理| 查看: 265

文章来源:FPGA入门到精通

图像处理中稍复杂点的算法,就需要行缓存,比如实现3*3窗口、6*6窗口的数据计算,行缓存的设计能力也是FPGA图像处理开发的基础技能。

本文将详细介绍使用FIFO来实现图像行缓存的设计,包括关键逻辑分析,verilog源代码实现分享。

一、行缓存功能的设计框架

图像数据一般都是按照从左到右,从上到下,一行行数据的方式发送传输的。

这里以3*3窗口为例,需要同时输出三行(上一行、当前行、下一行),如下图所示。

图1:视频图像.png

网上通常看见的行缓存实现,3*3窗口需要3个行缓存,这里我分享更加节省资源的方式,实际只需通过2个行缓存即可实现。

二、行缓存设计的关键思想

每一个行缓存fifo,都是在缓存完一行数据后,如果有新的数据输入,则同步输出一个数据出去。

这样当新的一行数据到来时,第1个行缓存刚好输出上一行数据,第2个行缓存输出当前行数据,刚到来的新的一行数据直接当做下一行数据输出即可。

有些特殊位置数据需要处理:以当前行为图像边界数据时,上一行和下一行数据实际不存在,需要直接给0或者复制当前行来处理。

这里以以3*3窗口为例,边界行处理逻辑如下:

第1个行缓存,是整个画面的第1行时, 上一行数据不存在,复制第1个行缓存或者直接为0输出。

第1个行缓存,是整个画面的最后第1行时, 下一行数据不存在,复制第1个行缓存输出。

三、FPGA实现代码

1、行缓存子模块实现

(1)FIFO IP 参数配置

Native Ports配置页:Read Mode 选择“First Word Fall Through”,设定合理的数据宽度和深度。

Data Counts配置页:选中“Data Count”

图2:参数配置1.png

图2:参数配置2.png

(2)行缓存子模块

通过对写入fifo的数据计数或利用fifo自带的data_count计数,在缓存完一行数据后,每输入一个数据,就输出一个数据。

module line_buffer(   input wire clk,   input wire reset,   input wire [10:0] img_width,   input wire valid_i,   input wire [23:0] data_i,   output wire valid_o,   output wire [23:0] data_o    );    //变量声明    reg [10:0] wr_data_cnt;    wire rd_en;    wire [11:0] fifo_data_count_w;    //写入数据计数    always@(posedge clk or posedge reset) begin        if(reset) begin            wr_data_cnt


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有