本文转载自: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
$display("Read data is: %c", data[i]);
end
$fcolse(fd);
//写文件
fd = $fopen("./out.txt","rb");
for( i=0; 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、仿真测试结果