【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; 数组 链表 > 数组 链表 红黑树「链表 和 链表 红黑树 都是为了解…

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

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

<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.参考…

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

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

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

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

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;以及一些常用的消息格式选项。通过更丰富的示例代码和深入的解析&…

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: …

【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…

算法通关村第十七关-黄金挑战跳跃问题

大家好我是苏麟 , 今天说说跳跃问题 . 跳跃游戏 描述 : 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff…

HBase-架构与设计

HBase架构与设计 一、背景二、HBase概述1.设计特点2.适用场景2.1 海量数据2.2 稀疏数据2.3 多版本数据2.4 半结构或者非结构化数据 三、数据模型1.RowKey2.Column Family3.TimeStamp 四、HBase架构图1.Client2.Zookeeper3.HMaster4.HRegionServer5.HRegion6.Store7.StoreFile8.…

Elasticsearch:什么是机器学习?

机器学习定义 机器学习 (ML) 是人工智能 (AI) 的一个分支&#xff0c;专注于使用数据和算法来模仿人类的学习方式&#xff0c;并随着时间的推移逐渐提高准确性。 计算机科学家和人工智能创新者 Arthur Samuel 在 20 世纪 50 年代首次将其定义为 “赋予计算机无需明确编程即可学…

【基于openGauss5.0.0简单使用DBMind】

基于openGauss5.0.0简单使用DBMind 一、环境说明二、初始化tpch测试数据三、使用DBMind索引推荐功能四、使用DBMind实现SQL优化功能 一、环境说明 虚拟机&#xff1a;virtualbox操作系统&#xff1a;openEuler 20.03 TLS数据库&#xff1a;openGauss-5.0.0DBMind&#xff1a;d…

2022年第十一届数学建模国际赛小美赛A题翼龙如何飞行解题全过程文档及程序

2022年第十一届数学建模国际赛小美赛 A题 翼龙如何飞行 原题再现&#xff1a; 翼龙是翼龙目中一个已灭绝的飞行爬行动物分支。它们存在于中生代的大部分时期&#xff1a;从三叠纪晚期到白垩纪末期。翼龙是已知最早进化出动力飞行的脊椎动物。它们的翅膀是由皮肤、肌肉和其他组…

云服务器与nas实现在冷热资源访问,nginx代理

在实际项目中&#xff0c;我们的文件存储是一个必不可少的环节&#xff0c;本博主了解到现在的存储方案有 购买纯系统的云服务器&#xff0c;自己安装个mino,再使用nginx代理给web使用购买OSS服务&#xff0c;现在有云厂商都有提供&#xff0c;储存价格也挺便宜的&#xff0c;…

13款趣味性不错(炫酷)的前端动画特效及源码(预览获取)分享(附源码)

文字激光打印特效 基于canvas实现的动画特效&#xff0c;你既可以设置初始的打印文字也可以在下方输入文字可实现激光字体打印&#xff0c;精简易用。 预览获取 核心代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&q…