今天一个上午的时间,都被这个问题所困扰,在网上查询十六进制文件的一般格式,都是这么说的,文件由一条条的记录组成,每条记录都有固定的几个部分组成。具体的格式如下:
:10008000AF5F67F0602703E0322CFA92007780C361
:1000900089001C6B7EA7CA9200FE10D2AA00477D81
:0B00A00080FA92006F3600C3A00076CB
:00000001FF
第一行,":"符号表明记录的开始. 后面的两个字符表明记录的长度,这里是10h. 后面的四个字符给出调入的地址,这里是0080h. 后面的两个字符表明记录的类型;0 数据记录 1 记录文件结束 2 扩展段地址记录 3 开始段地址记录 4 扩展线性地址记录 5
开始线性地址记录后面则是真正的数据记录, 最后两位是校验和检查,它加上前面所有的数据和为0.最后一行特殊,总是写成这个样子.
扩展Intel Hex的格式(最大1M): 由于普通的Intel的Hex记录文件只能记录64K的地址范围,所以大于64K的地址数据要靠扩展Intel Hex格式的文件来记录.对于扩展形式Hex文件,在每一个64K段的开始加上扩展的段地址规定,下面的数据地址均在这个段内,除非出现新的段地址定义.
一个段地址 定义的格式如下:
起始符 长度 起始地址 扩展段标示 扩展段序号 无用 累加和
: 02 0000 02 3000 EC
尝试了很多遍,却发现这种文件格式是verilog不能读出来的,总是提示一个这样的warning:Too many digits......
后来再从网上找了找,发现verilog中所说的十六进制文件格式并不是这样,如下:
Verilog提供了$readmemb和$readmemh命令来读ASCII格式文件,以初始化存储器内容。这个命令也可以在仿真中用来初始化Xilinx的BlockRAM或者SelectRAM元件。其语法格式如下:
$readmemb (“<design.mif>”,design_instance);
MIF是由coregen生成的存储器初始化文件,其内容由用户来定义。
在 Model Sim 6.1b裡面 若是要讀一個檔案到記憶體里模擬
可以使用 $readmem or $readmemh
$readmem 為一個BIT的格式的讀檔函式
$readmemh 則為一個 HEX格式的的讀檔函式
使用方法為 $readmem("filename",memory);
會讀進filename檔名的檔案,檔案格式則為
@xx YY
@xx 為記憶體定址使用HEX
YY 則為記憶體的內容依據 BIT/HEX 格式配置與實際記憶體大小
Example
memory 為 8BITS且使用 $readmem 則輸入檔案內容如下
@00 1100_0000 0101_1101
@02 0001_1000 1111_0000
使用 $readmemh 則為
@00 C0 5D
@02 18 F0
當為 16BITS 且使用 $readmemh 則輸入檔案內容如下
@00 AA55 CC11
@02 4E67 5A3C
本文介绍了在Verilog中遇到的十六进制文件格式问题,指出网上常见的Intel Hex格式并不适用于Verilog的$readmemh命令。正确的格式应包含地址和数据,如@example AA 55。此外,还提到了Model Sim中的$readmem和$readmemh函数的使用方法。
1715

被折叠的 条评论
为什么被折叠?



