如何使用verilog输出bmp文件?

如何使用verilog输出bmp文件?,verilog,binaryfiles,Verilog,Binaryfiles,我被要求使用bmp文件中的数据作为verilog模块的模拟输入,并将模拟输出写入新的bmp文件,以便他们可以比较两个不同的bmp文件,以检查verilog模块的正确性。 我的阅读很成功,但在写作上遇到了一些问题。 模块testsub1; 整数fout; 首字母 开始 fout=$fopen(“C:/Users/gyz/Pictures/testout1.bmp”,“wb”); $fwrite(fout,“%u”,8'h42); $fclose(fout); 结束 端模 输出应该是8'h42。

我被要求使用bmp文件中的数据作为verilog模块的模拟输入,并将模拟输出写入新的bmp文件,以便他们可以比较两个不同的bmp文件,以检查verilog模块的正确性。 我的阅读很成功,但在写作上遇到了一些问题。

模块testsub1;
整数fout;
首字母
开始
fout=$fopen(“C:/Users/gyz/Pictures/testout1.bmp”,“wb”);
$fwrite(fout,“%u”,8'h42);
$fclose(fout);
结束
端模
输出应该是8'h42。但实际产出是

不必要的零发生。我猜这是因为verilog每次至少写入16n位的行二进制,n>=1。因此,我将第六行更改为
$fwrite(fout,“%u”,24'h424d5f),结果变为
还有一个多余的零。如何使程序每次只输出8位。

在这个问题下,dave_59的解决方案运行良好

您可以使用%c写出一个字节。您可以使用位流转换将数据转换为字节数组,然后执行foreach(字节数组[i])
$fwrite(fd,“%c”,字节数组[i])

如果您有大量数据,您可能希望通过使用
%u
写出4个字节的倍数,并使用
%c
写出剩余字节的倍数来优化此功能


顺便说一句:我刚刚在Vivado 2017.2中尝试了“%u”,这会导致系统出现致命错误。谢谢。这个问题的答案确实解决了我的问题。尽管我仍然感到困惑,%c或%c在IEEE verilog标准中表示以ASCII字符格式显示。它如何输出二进制文件?但它确实有效,再次感谢您的帮助。“%c”输出8位值。大多数情况下,它用于输出可打印字符,并且它可以是任何8位值,这一点在解释各种输出格式的许多文本中经常被遗忘。另外,如果您查看C中的printf解释。