【FPGA图像处理实战】- FPGA图像处理仿真测试工程(读写BMP图片)

FPGA开发过程中“行为功能仿真”是非常必要的一个过程,如果仿真都没通过,则上板测试必定失败。

FPGA图像处理需要读写大量的图像数据,单看这些图像数据实际是没有规则的,如果直接上板测试,调试起来非常困难,数量量大,ILA只能抓一段时间的数据,不易确定问题原因。

所以FPGA图像处理开发中,创建一个正确的仿真测试激励非常关键,基本上只要满足时序要求,上板就大概率就能过,如果上板遇到问题,还可以拿到这张图片数据,仿真测试一下看看能否复现,如果能复现问题,再通过仿真调试解决这个问题就容易很多了。

今天,我们就来搭建一个图像处理仿真测试工程,实现读写bmp文件的功能。

一、SystemVerilog/Verilog读写文件函数

仿真测试激励(Testbench)中经常需要读写文件,这里介绍一下SystemVerilog/Verilog常用的操作文件的函数,写测试激励推荐使用SystemVerilog。

1、打开文件函数

函数定义:integer fd = $fopen(file_name,type)

函数返回值: fd不等于0,表示文件打开成功;fd等于0,表示文件打开失败。

函数参数:

(1)file_name是一个字符串。

(2)type有如下类型:

“r” or “rb”:只读 或 按二进制文件读取

“w” or “wb”:只写 或 按二进制文件写入

“a” or “ab”:打开文件追加从文件末尾(EOF)写或创建文件写

“r+” or “rb+”:打开文件,可读可写

“w+” or "wb+": 打开或创建文件写

"a+" "a+b" or "ab+" :追加,在文件末尾打开

示例:

integer fd;
fd = $fopen("./1280_720.bmp","rb");

2、关闭文件函数

养成一个良好的习惯,打开文件处理完后,记得关闭文件。

函数定义:$fclose(fd)

函数说明:fd就是调用$fopen返回的值。

3、读写文件函数

(1)writemem[b|h]/readmem[b|h]

writemem 表示写,readmem表示读。b 表示读写二进制文件,h表示读写十六进制文件。

所以对应的全名有:writememb/writememh/readmemb/readmemh。

读写文件函数调用形式如下:

(1)$readmemb("<数据文件名>",<存储器名>);

(2)$readmemb("<数据文件名>",<存储器名>,<起始地址>);

(3)$readmemb("<数据文件名>",<存储器名>,<起始地址>,<终止地址>);

其中存储器名就是数组型变量,起始地址和终止地址就是数组型变量的起始范围。

示例:

   reg [31:0]   mem[63:0] ;initial begin//读文件数据$readmemb("./data.hex", mem);$display("Read memory1: %h", mem[0]) ;//写文件数据$writememb("./data_bak.hex", mem);end

注意:

readmem[b|h]是将数据放在存储器数组中,所以存储器数组应该定义为reg型,而不是wire。

readmem[b|h]是不能操作二维数组,只能操作一维数组。

(2)$fscanf 和 $fwrite

$fscanf 按照指定格式从文件中读取数据。

函数定义:integer flag=$fscanf(fd,format,args);

函数参数:fd表示文件句柄;format表示数据格式,%d表示十进制整数,%c表示一字节8bit字符,%x表示十六进制整数;args表示存储器数组。

$fwrite 按照指定格式从文件中读取数据。

函数定义:integer flag=$fwrite(fd,format,args);

函数参数定义:与$fscanf一样。

示例:

parameter LEN = 1920;
integer i;
reg [7:0] data[LEN-1:0];
integer fd;initial begin//读文件fd = $fopen("./in.txt","rb");for( i=0; i<LEN; i=i+1 ) begin$fscanf(fd, "%c", data[i]);$display("Read data is: %c", data[i]);end $fcolse(fd);//写文件fd = $fopen("./out.txt","rb");for( i=0; i<LEN; i=i+1 ) begin$fwrite(fd, "%c", data[i]);end $fcolse(fd);    
end

4、文件定位函数

(1)获取文件位置函数 $ftell

integer pos = $ftell( fd ) ; 返回文件当前位置距离文件首部的偏移量,初始地址为 0,偏移量按照字节为一单位(8bits),配合 $fseek 使用。

(2)重定位函数$fseek

integer code = $fseek(fd, offset, type) ; 设置文件下一个输入或输出的位置

函数参数 :offset 为设置的偏移量,type 为偏移量的参考位置,具体如下:

--- 0: 以文件起始位置为基准

--- 1: 以文件当前位置为基准

--- 2: 以文件末尾为基准

二、BMP文件介绍

BMP(Bitmap)文件格式是一种图像文件格式,与常见的图像格式如 JPEG、PNG 等不同,它属于典型的位图格式。BMP 采用位映射存储格式,除了图像深度可选以外,不使用其他任何压缩。

1、BMP文件头

BMP文件头长度可变,但一般都是 54 字节,其中包括 14 字节的 Bitmap 文件头以及 40 字节的 DIB (Device Independent Bitmap) 数据头,或称位图信息数据头(BItmap Information Header)。



2、视频数据 Raw Bitmap Data

常见的数据格式是24bitRGB,具体到每一个像素是24bit数据,分别是B、G、R的形式排列。

三、图像处理仿真测试工程

1、图像处理仿真测试工程结构

2、参数定义

设定图像文件位置、图像大小、横向消影区、纵向消影区大小。

//`define pix_1920_1080
`define pix_1280_720`ifdef pix_1920_1080  `define INPUT_FILE "../../../../test_img/in/1920_1080.bmp"  //input image`define IMG_WIDTH 1920   //Image width`define IMG_HEIGHT  1080  //Image height`define H_BLANK 720   //横向消影区,仿真可自由设定`define V_BLANK 45 	//纵向消影区,仿真可自由设定
`endif`ifdef pix_1280_720  `define INPUT_FILE "../../../../test_img/in/1280_720.bmp"  //input image`define IMG_WIDTH 1280   //Image width`define IMG_HEIGHT  720  //Image height`define H_BLANK 480   //横向消影区,仿真可自由设定`define V_BLANK 30 	//纵向消影区,仿真可自由设定
`endif`define OUTPUT_FILE "../../../../test_img/out/result.bmp" //result image`define SEEK_SET 0
`define SEEK_CUR 1
`define SEEK_END 2

3、读图像文件

读取BMP文件数据,先读取BMP文件头,BMP的数据时按倒序存储,即从下到上,从左到右,读取出来存储时,需要存储到对应的位置。

    fdI = $fopen(`INPUT_FILE,"rb");if (fdI == `NULL) begin $display("> OPEN FAIL: The file not exist !!!");end else begin  $display("> OPEN file SUCCESS !");//读取bmp文件头		ret = $fread(bmp_head_r, fdI, 0, `LEN_HEADER);//读取图像RGB分量值//BMP倒序存储数据时,从下到上,从左到右for(i=`IMG_HEIGHT - 1;i >= 0;i=i-1) for(j=0;j <`IMG_WIDTH;j=j+1) beginidx = i*`IMG_WIDTH + j;imgB_r[idx] = $fgetc(fdI);//bimgG_r[idx] = $fgetc(fdI);//gimgR_r[idx] = $fgetc(fdI);//r                end$display("> Read b,g,r Successful !");end

4、写图像文件

写图像文件,先写入文件头信息,再按照倒序存储BGR数据,需要移动文件内的偏移量。

//写入文件头  for(i=0;i < `LEN_HEADER;i=i+1)   begin$fwrite(fdO, "%c", bmp_head_r[i]);end//移动到图片数据最后一行起始位置file_end_offset = `IMG_ALL + `LEN_HEADER - `IMG_WIDTH*3;$fseek(fdO, file_end_offset, `SEEK_SET);assign {R_o_w, G_o_w, B_o_w} = img_data_o;always @(posedge clk or posedge reset) beginif (reset) beginout_data_cnt_r <= 'b0;valid_o_r <= 'b0;end else beginvalid_o_r <= valid_o;if(valid_o) begin$fwrite(fdO, "%c", B_o_w);$fwrite(fdO, "%c", G_o_w);$fwrite(fdO, "%c", R_o_w);out_data_cnt_r <= out_data_cnt_r + 1'b1;end else if(valid_o_r) begin//行结束file_end_offset = file_end_offset - `IMG_WIDTH*3;$fseek(fdO, file_end_offset, `SEEK_SET);endendend

注意:

BMP位图的每一行像素所占字节数必须被4整除。若不能倍4整除,则每一行的末尾需要“补”1至3个字节的“00”。

整个文件大小也需要是4字节的整数倍,不足需要补零,当然不补零也不影响正常显示。

四、仿真测试结果

仿真图:

效果图:

五、源码下载

https://pan.quark.cn/s/f0e7a72caa26

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

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

相关文章

看图学源码之— HashMap源码分析

简介&#xff1a; 是基于 哈希表 实现的&#xff0c;存放 k-v 键值对&#xff0c;非同步的方式&#xff08;未加 synchronized &#xff09;非线程安全的&#xff0c;hashmap 无序的数据结构&#xff1a; 数组 链表 > 数组 链表 红黑树「链表 和 链表 红黑树 都是为了解…

vue中字典的使用

1.引入字典 dicts: [order_status,product_type],2.表单中使用 select下拉 <el-form-item label"订单状态" prop"orderStatus"><el-select v-model"form.orderStatus" clearable placeholder"请输入订单状态" :disabled"…

新版Win10通过netplwiz设置自动登录时找不到“要使用本计算机,用户必须输入用户名和密码”选项的解决方法

众所周知&#xff0c;Windows系统有个传统艺能&#xff0c;就是通过“netplwiz”或者“control userpasswords2”设置免密码自动登录。前段时间在调整一台虚拟机的配置时&#xff0c;突然惊奇的发现&#xff0c;在设置免密码登录的时候居然找不到需要去掉勾选的复选框了。如下图…

QT+Unity3D 超详细(将unity3D与QT进行连接,并实现信息传递)

QTUnity3D连接 在QT中连接unity3D&#xff0c;首先要有一个unity.exe执行文件。在这里不提供unity执行文件的编写&#xff0c;只提供QT这边与unity3D连接和信息传递。 创建项目 创建一个新的项目&#xff0c;我创建的项目名称如下。 下图是我建立新项目的文件。APP文件就是…

Metasploit的安全防御和逃逸

预计更新 第一章 Metasploit的使用和配置 1.1 安装和配置Metasploit 1.2 Metasploit的基础命令和选项 1.3 高级选项和配置 第二章 渗透测试的漏洞利用和攻击方法 1.1 渗透测试中常见的漏洞类型和利用方法 1.2 Metasploit的漏洞利用模块和选项 1.3 模块编写和自定义 第三章 Me…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux文件管理(1)》(25)

《Linux操作系统原理分析之Linux文件管理&#xff08;1&#xff09;》&#xff08;25&#xff09; 8 Linux文件管理8.1 Linux 文件系统概述8.2 EXT2 文件系统8.2.1 EXT2 文件系统的构造8.2.2 EXT2 超级块&#xff08;super block&#xff09;8.2.3 组描述符8.2.4 块位图 8.3 EX…

智能优化算法应用:基于社交网络算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于社交网络算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于社交网络算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.社交网络算法4.实验参数设定5.算法结果6.参考…

[ffmpeg] avcodec_alloc_context3 解析

背景 ffmpeg 通过 avcodec_alloc_context3 解析编码器&#xff0c;本文主要来解析一下&#xff0c;这个函数主要做了什么。 具体代码分析 主要是创建了 AVCodecContext ,并给结构体参数赋予初值。 初值设置主要分成两块&#xff0c;1. 所有编码器都相同的部分&#xff1b;2.…

用23种设计模式打造一个cocos creator的游戏框架----(七)代理模式

1、模式标准 模式名称&#xff1a;代理模式 模式分类&#xff1a;结构型 模式意图&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。 结构图&#xff1a; ​ 适用于&#xff1a; 远程代理&#xff1a;也称为大使&#xff0c;这是最常见的类型&#xff0c;在分…

2022年第十一届数学建模国际赛小美赛C题人类活动分类解题全过程文档及程序

2022年第十一届数学建模国际赛小美赛 C题 人类活动分类 原题再现&#xff1a; 人类行为理解的一个重要方面是对日常活动的识别和监控。可穿戴式活动识别系统可以改善许多关键领域的生活质量&#xff0c;如动态监测、家庭康复和跌倒检测。基于惯性传感器的活动识别系统用于通过…

Vue3计算属性与监听属性和生命周期

文章目录 一、计算属性与监视1、computed函数2、watch函数3、watchEffect函数 二、生命周期1、与 2.x 版本生命周期相对应的组合式 API2、新增的钩子函数3、代码实例 一、计算属性与监视 1、computed函数 与computed配置功能一致只有getter有getter和setter 2、watch函数 与…

Kubernetes入门笔记——(2)k8s设计文档

​k8s最初源自谷歌的Brog项目&#xff0c;架构与其类似&#xff0c;主要包括etcd、api server、controller manager、scheduler、kubelet和kube-proxy等组件 etcd&#xff1a;分布式存储&#xff0c;保存k8s集群的状态 api server&#xff1a;资源操作的唯一入口&#xff0c;…

Kafka 的消息格式:了解消息结构与序列化

Kafka 作为一款高性能的消息中间件系统&#xff0c;其消息格式对于消息的生产、传输和消费起着至关重要的作用。本篇博客将深入讨论 Kafka 的消息格式&#xff0c;包括消息的结构、序列化与反序列化&#xff0c;以及一些常用的消息格式选项。通过更丰富的示例代码和深入的解析&…

【Java】Java8重要特性——Lambda函数式编程以及Stream流对集合数据的操作

【Java】Java8重要特性——Lambda函数式编程以及Stream流对集合数据的操作 前言Lambda函数式编程Stream流对集合数据操作&#xff08;一&#xff09;创建Stream流&#xff08;二&#xff09;中间操作之filter&#xff08;三&#xff09;中间操作之map&#xff08;四&#xff09…

2023年山东省职业院校技能大赛信息安全管理与评估二三阶段样题

2023年山东省职业院校技能大赛信息安全管理与评估二三阶段 样题 第二阶段 模块二 网络安全事件响应、数字取证调查、应用程序安全 一、竞赛内容 Geek极安云科专注技能竞赛技术提升&#xff0c;基于各大赛项提供全面的系统性培训&#xff0c;拥有完整的培训体系。团队拥有曾…

docker部署elasticsearch8.x

docker部署elasticsearch8.x 提示1 注意版本差别1.1 docker修改配置1.1.2 docker使用vim报命令不存在的解决办法1.1.3 docker 容器内报错 E: List directory /var/lib/apt/lists/partial is missing. - Acquire ( : No such file or directory) 或者其他权限 PermissionError: …

Flinksql bug :Illegal mixing of types in CASE or COALESCE statement

报错信息 org.apache.flink.table.api.ValidationException: SQL validation failed. From line 66, column 23 to line 68, column 46: Illegal mixing of types in CASE or COALESCE statement org.apache.calcite.runtime.CalciteContextException: From line 66, column 2…

【Delphi】一个函数实现ios,android震动功能 Vibrate(包括3D Touch 中 Peek 震动等)

一、前言 我们在开发移动端APP的时候&#xff0c;有时可能需要APP能够提供震动功能&#xff0c;以便提醒操作者&#xff0c;特别是ios提供的3D Touch触感功能&#xff0c;操作者操作时会有触感震动&#xff0c;给操作者的感觉很友好。那么&#xff0c;在Delphi的移动端FMX开发中…

团建策划信息展示服务预约小程序效果如何

团建是中大型企业商家每年举办的员工活动&#xff0c;其形式多样化、具备全部参与的娱乐性。但在实际策划流程及内容时&#xff0c;部分公司便会难以入手&#xff0c;术业有专攻&#xff0c;这个时候团建策划公司便会发挥效果。 如拓展训练、露营、运动会、体育竞技等往往更具…

【算法】算法题-20231207

这里写目录标题 一、共同路径二、数字列表排序三、给定两个整数 n 和 k&#xff0c;返回 1 … n 中所有可能的 k 个数的组合。 一、共同路径 给你一个完整文件名组成的列表&#xff0c;请编写一个函数&#xff0c;返回他们的共同目录路径。 # nums[/hogwarts/assets/style.cs…