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

本文转载自:FPGA入门到精通

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

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

今天,我们就来搭建一个图像处理仿真测试工程,实现读写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 $fscanf(fd, "%c", data[i]);
$display("Read data is: %c", data[i]);
end
$fcolse(fd);

//写文件
fd = $fopen("./out.txt","rb");
for( i=0; i $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数据。

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

推荐使用SystemVerilog来编写激励,功能比verilog强,比如可以支持浮点数等,用来做验证非常的方便省事。

1、测试工程系统结构

参考前面两节的内容就可以写出完整的测试激励了。

完整的工程源码,暂不对外,星球内可领。

2、仿真测试结果

最新文章

最新文章