【盘古100Pro+开发板实验例程】FPGA学习 | 3X3图像矩阵生成 | 图像实验指导手册

本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处(www.meyesemi.com)

1. 实验简介

实验目的:

      实现 3X3 图像矩阵对应 9 个像素点图像数据的读取。

实验环境:

      Window11

      PDS2022.SP6.4

      Modelsim10.6c

      MatlabR2023b(可以用别的版本)

硬件环境:

      MES2L676-100HP

2. 实验原理

      在数字图像处理中,部分算法需根据每个像素点及其周围一定范围内的像素点数据进行计算,图像矩阵的 生成至关重要。本系列图像处理实验主要采用 3X3 图像矩阵实现对应图像处理算法。

      例如一幅完整的 5X5 图像如下图所示,每个方格表示一个像素点,方格内的数字表示对应像素点的像素数据。

      3X3 图像矩阵的行对应图像一行中三个连续的像素点,3X3 图像矩阵的列对应图像一列中三个连续的像素点,矩阵的元素对应图像的像素数据。在 5X5 的图像中,按图像的扫描方式从左到右,从上到下地获取对应 3X3 图像矩阵的数据

      在图像处理算法中,若通过每个 3X3 图像矩阵计算中心像素点的像素数据,为保证图像分辨率不变,在图 像左侧两列和上方两行的位置对像素数据补“0”操作,如下图所示:

      基于以上分析,在图像数据按行输入的情况下,为获取 3X3 图像矩阵需同时输出三行图像中的数据,因此 采用 FPGA 的缓存资源(fifo/ram)将接收的每一行数据进行缓存,并且在输出 3X3 图像矩阵数据时输出当前 第 n 行对应位置的数据、第 n-1 行对应位置的数据以及第 n-2 行对应位置的数据。另外,为缓存第 n-1 行图像 数据和第 n-2 行图像数据,需调用 2 个 fifo 缓存模块,并且实现当前数据缓存到第 n-1 行图像数据缓存 fifo, 从第 n-1 行图像数据缓存 fifo 读出后再缓存到第 n-2 行图像数据缓存 fifo,确保 3X3 矩阵输出时读取两个 fifo可同时获得第 n-1 行和第 n-2 行的数据。FPGA 实现 3X3 图像矩阵具体方案框图如下:

按行输入的图像数据 video_data 在数据有效期间缓存到 fifo1,同时 fifo1 读出一行数据进入 fifo2 缓存, 且 fifo2 同时读出一行数据,若 fifo1 或 fifo2 为空则输出 0。数据输出过程如下图所示:

此外,实现同时输出连续三行图像数据后,需注意所输出的三个数据对应在一行中的位置保持一致。

3. 接口列表

以下为 matrix_3x3.v 模块的接口列表。

4. 工程说明

4.1. 代码模块说明

3X3 图像矩阵生成模块代码如下所示:

// 3x3 矩阵生成
module matrix_3x3
#(parameter IMG_WIDTH = 11'd1920,parameter IMG_HEIGHT = 11'd1080
)
(input wire video_clk,input wire rst_n,input wire video_vs,input wire video_de,input wire [7:0] video_data,  // 3x3 矩阵输出output wire matrix_de,output reg [7:0] matrix11,output reg [7:0] matrix12,output reg [7:0] matrix13,output reg [7:0] matrix21,output reg [7:0] matrix22,output reg [7:0] matrix23,output reg [7:0] matrix31,output reg [7:0] matrix32,output reg [7:0] matrix33
);// wire definewire [7:0] line3_data;  // 第三行数据wire [7:0] line2_data;  // 第二行数据wire [7:0] line1_data;  // 第一行数据wire wr_fifo_en;        // 写 FIFO 使能wire rd_fifo_en;        // 读 FIFO 使能// reg definereg [10:0] x_cnt;reg [10:0] y_cnt;// 列计数always @(posedge video_clk or negedge rst_n) beginif (!rst_n)x_cnt <= 11'd0;else if (x_cnt == IMG_WIDTH - 1)  // 计数一行x_cnt <= 11'd0;else if (video_de)  // 数据有效x_cnt <= x_cnt + 1'b1;elsex_cnt <= x_cnt;end// 行计数always @(posedge video_clk or negedge rst_n) beginif (!rst_n)y_cnt <= 11'd0;else if (y_cnt == IMG_HEIGHT - 1 && x_cnt == IMG_WIDTH - 1)  // 计数一帧y_cnt <= 11'd0;else if (x_cnt == IMG_WIDTH - 1)  // 数据有效y_cnt <= y_cnt + 1'b1;elsey_cnt <= y_cnt;end

以上代码根据模块接口列表,定义模块端口及对输入数据进行行/列计数

// 3x3 矩阵 第一行和最后一行无法构成
assign wr_fifo_en = video_de && (y_cnt < IMG_HEIGHT-1);
assign rd_fifo_en = video_de && (y_cnt > 0);reg wr_fifo_en_1d;
reg [7:0] video_data_1d;always @(posedge video_clk or negedge rst_n) beginif (!rst_n) beginwr_fifo_en_1d <= 1'd0;video_data_1d <= 8'd0;endelse beginwr_fifo_en_1d <= wr_fifo_en;video_data_1d <= video_data;end
end// 通过两个 FIFO 与当前的输入一起构成 3x3 矩阵
assign line3_data = video_data_1d;// fifo1
fifo_line_buffer u1_fifo_line_buffer (.wr_clk      (video_clk),    // input.wr_rst      (~rst_n),       // input.wr_en       (wr_fifo_en),   // input.wr_data     (video_data),   // input [7:0].wr_full     (),             // output.almost_full (),             // output.rd_clk      (video_clk),    // input.rd_rst      (~rst_n),       // input.rd_en       (rd_fifo_en),   // input.rd_data     (line2_data),   // output [7:0].rd_empty    (u1_empty),     // output.almost_empty()              // output
);// fifo2
fifo_line_buffer u2_fifo_line_buffer (.wr_clk      (video_clk),    // input.wr_rst      (~rst_n),       // input.wr_en       (wr_fifo_en_1d),// input.wr_data     (line2_data),   // input [7:0].wr_full     (),             // output.almost_full (),             // output.rd_clk      (video_clk),    // input.rd_rst      (~rst_n),       // input.rd_en       (rd_fifo_en),   // input.rd_data     (line1_data),   // output [7:0].rd_empty    (),             // output.almost_empty()              // output
);

以上代码实现两级 fifo 对图像数据按行缓存。为确保三行数据输出保持同步,需注意 fifo 读出数据相较于 fifo 读使能信号延时 1 个时钟周期,因此 line3_data 数据需将当前输入数据延迟 1 个时钟周期,与 fifo 输出的 line2_data 和 line1_data 保持同步,并且 fifo1 输出数据写入 fifo2 时也需要将 fifo1 的读使能信号延时 1 个 时钟周期再作为 fifo2 的写使能信号。

// 数据延迟 de 延迟
reg video_de_d0;
reg video_de_d1;always @(posedge video_clk or negedge rst_n) beginif (!rst_n) beginvideo_de_d0 <= 1'd0;video_de_d1 <= 1'd0;endelse beginvideo_de_d0 <= video_de;video_de_d1 <= video_de_d0;end
end// 矩阵数据生成
always @(posedge video_clk or negedge rst_n) beginif (!rst_n) begin{matrix11, matrix12, matrix13} <= 24'd0;{matrix21, matrix22, matrix23} <= 24'd0;{matrix31, matrix32, matrix33} <= 24'd0;endelse if (video_de_d0) begin{matrix11, matrix12, matrix13} <= {matrix12, matrix13, line1_data};{matrix21, matrix22, matrix23} <= {matrix22, matrix23, line2_data};{matrix31, matrix32, matrix33} <= {matrix32, matrix33, line3_data};endelse begin{matrix11, matrix12, matrix13} <= 24'd0;{matrix21, matrix22, matrix23} <= 24'd0;{matrix31, matrix32, matrix33} <= 24'd0;end
end// 矩阵数据有效输出
assign matrix_de = video_de_d1;
assign matrix_vs = video_vs;endmodule

以上代码实现 3X3 图像矩阵的生成。三行数据同时输出,每一行的数据按“打拍”方式移位实现矩阵的位 置的移动,需注意输出数据在生成矩阵时产生 1 个时钟周期的延时,因此最终数据的矩阵有效信号 matrix_de 也需延时 1 个时钟周期。

4.2. 代码仿真

      在 modelsim 平台,matrix_3x3 模块的仿真激励模块 matrix_tb.v 生成 5x5 的图像数据源,仿真分析结果如下:

5x5 的图像数据源符合以下图像示意图:

3X3 图像矩阵的生成符合预期。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/917714.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/917714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【通用视觉框架】基于OpenCvSharp+WPF+YOLO开发的仿VisionMaster的通用视觉框架软件,全套源码,开箱即用

【通用视觉框架】基于OpenCvSharpWPFYOLO开发的仿VisionMaster的通用视觉框架软件&#xff0c;全套源码&#xff0c;开箱即用 基于OpenCvSharp、WPF和YOLO的组合&#xff0c;构建一个兼具图像处理能力、可视化交互和实时检测的工业级视觉框架。其核心是将底层算法与上层界面无…

微信小程序转Vue2组件智能提示词

角色 小程序转Vue2组件工程师&#xff08;ElementUI专精&#xff09; 核心能力 技术专长&#xff1a;作为世界顶尖前端工程师&#xff0c;专注于将小程序组件&#xff08;.wxml/.wxss/.js/.json&#xff09;精准转换为Vue2ElementUI组件&#xff0c;转换逻辑零偏差&#xff0c;…

JVM 学习总结

文章目录内存结构程序计数器什么是程序计数器&#xff1f;核心作用&#xff1a;为什么需要程序计数器&#xff1f;实现原理主要特点示例&#xff1a;PC 寄存器如何工作总结Java 虚拟机栈什么是 Java 虚拟机栈&#xff1f;栈帧的内部结构主要特点总结线程诊断本地方法栈堆堆内存…

目标检测检出率,误检率,ap,map等评估python代码

1.deepseek版本import numpy as np from collections import defaultdictdef calculate_iou(box1, box2):"""计算两个边界框的交并比&#xff08;IoU&#xff09;:param box1: [x1, y1, x2, y2]:param box2: [x1, y1, x2, y2]:return: IoU"""# 计…

python的高校班级管理系统

前端开发框架:vue.js 数据库 mysql 版本不限 后端语言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 数据库工具&#xff1a;Navicat/SQLyog等都可以 在高校教…

Scrapy 工作流程深度解析:引擎驱动的完美协作

一、Scrapy 核心组件全景图 #mermaid-svg-KWCKN9n4urijbSws {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-KWCKN9n4urijbSws .error-icon{fill:#552222;}#mermaid-svg-KWCKN9n4urijbSws .error-text{fill:#552222;…

PCIe Base Specification解析(七)

文章目录3.6 Data Integrity Mechansisms3.6.1 Introduction3.6.2 LCRC, Sequence Number, and Retry Management (TLP Transmitter)3.6.2.1 LCRC and Sequence Number Rules (TLP Transmitter)3.6.2.2 Handling of Received DLLPs3.6.3 LCRC and Sequence Number (TLP Receive…

Windows 11 使用Windows Hello使用人脸识别登录失败,重新录入人脸识别输入PIN后报Windows Hello安装程序白屏无响应的问题解决

Windows 11 使用Windows Hello使用人脸识别登录失败&#xff0c;重新录入人脸识别输入PIN后报Windows Hello安装程序白屏无响应的问题解决&#xff1a;遇到此种情况时&#xff1a;1、在“开始”右键——设置——账号——登录选项2、需要在PIN这里先进行删除此登录选项&#xff…

qq scheme

QQ intent scheme跳转 1.跳转指定说说(root) 2.跳转指定说说(非root) 3. 跳转聊天框 4. 跳转用户主页 5. 跳转加群 6. 跳转指定用户空间 1.跳转指定说说(root) 该方法需root权限 app.startActivity({className: "com.qzone.reborn.base.QZoneTransparentShellActivi…

C语言基础_随机数、数组、函数、指针

0、随机数&#xff1a; 要用C语言产生随机数&#xff0c;首先在预处理程序部分要引入stdlib.h头文件&#xff0c;然后就可以用rand()在后续程序中生成随机数了。如果不设置随机数种子srand()&#xff0c;后面生成的随机数序列就是以41开头的一个固定序列&#xff0c;因此一般以…

PHP‑ORT扩展构建纯PHP机器学习的推荐系统

结合 PHP‑ORT 构建推荐系统的核心思想是&#xff1a;使用 ONNX 格式的机器学习模型&#xff0c;在 PHP 中本地执行推理&#xff0c;实时给出推荐结果。下面是一个完整的架构设计与实现路径&#xff0c;适合你快速上手。&#x1f3af; 场景目标 你想在一个 PHP 网站中实现推荐功…

PromptPilot搭配Doubao-seed-1.6:定制你需要的AI提示prompt

目录 一、PromptPilot 二、基于产品评价的用户情感分析 2.1 使用PromptPiolt工具进行提示词生成 2.2 基于prompt的模型调试 2.3 基于prompt的批量数据测评 2.4 基于多轮对话的prompt测试 如今&#xff0c;我们正身处一个 AI 技术飞速迭代的时代。人工智能早已不再是实验室…

MSPM0开发学习笔记:二维云台结合openmv实现小球追踪

文章目录前言一、硬件选择二、原理介绍&#xff08;UART&#xff09;三、硬件连线三、软件代码1、视觉部分代码&#xff08;Openart&#xff09;2、控制部分代码&#xff08;MSPM0&#xff09;&#xff08;1&#xff09; UART部分&#xff08;2&#xff09; 计算函数部分&#…

【CTF-WEB-SQL】SQL注入基本流程(sql-labs的Less11)(用burp抓取post然后用sqlmap盲注)

题目 从第11less开始&#xff0c;就是POST表单了burp抓取数据包将抓取到的数据包存放到桌面&#xff0c;保存为post.txt数据包内容如下&#xff1a;POST /Less-11/ HTTP/1.1 Host: 223.112.39.132:44537 Content-Length: 39 Cache-Control: max-age0 Accept-Language: zh-CN,zh…

WPF 与 Winform :Windows 桌面开发该用谁?

WPF 与 Winform :Windows 桌面开发该用谁? 一、 WPF 与 Winform的概念 WPF:颜值与实力并存的 “后起之秀” Winform:简单直接的 “老前辈” 二、WPF 与 Winform 的核心差异 1. 设计理念:分离 vs 耦合 2. 布局系统:灵活适配 vs 固定坐标 3. 视觉效果:绚丽动画 vs 朴素原生…

【Git学习】入门与基础

目录 Git的安装 Git 配置用户信息 Git 初始化本地仓库 Git 工作区、暂存区和版本库 Git 跟踪文件 Git 修改文件 Git 删除文件 Git 撤销本地文件的修改 Git 取消暂存 Git 跳过暂存区 Git 版本回退 Git 撤销提交 Git 设置忽略文件 Git 比较文件差异 Git 代码托管平台…

idea添加gitlab访问令牌

1.按下图所示顺序操作gitlab,获取到对应的token;2.填写对应的gitlab地址和第一步获取的token

人工智能领域、图欧科技、IMYAI智能助手2025年5月更新月报

2025年5月IMYAI平台技术动态与模型更新综述 摘要&#xff1a; 本文整理了2025年5月期间IMYAI平台发布的主要技术更新、新模型上线信息及功能调整公告&#xff0c;涵盖DeepSeek、Gemini、Claude、即梦、Suno等模型动态及平台功能优化。 正文&#xff1a; 一、 模型更新与上线Dee…

机器人权利:真实还是虚幻,机器人权利研究如何可能,道德权利与法律权利

一、机器人权利&#xff1a;真实还是虚幻&#xff1f;机器人权利的讨论源于技术进步对传统法律与伦理体系的冲击&#xff0c;其真实性取决于技术发展阶段与社会接受度的互动。当前&#xff0c;机器人权利仍呈现“虚幻与真实交织”的特征&#xff1a;技术基础&#xff1a;从工具…

通信小白产品学习碎片01

1. 云中继&#xff08;Cloud Media Relay&#xff09; 运营商在Volte/Vonr场景中引入的核心网关键功能&#xff0c;用于优化媒体流的传输路径&#xff0c;解决跨运营商、跨地域通信时的网络绕行问题。 传统&#xff1a;A终端—>A核心网—>跨网互联点—>B核心网—>…