verilog读取的二进制与十六进制文件的格式问题

 今天一个上午的时间,都被这个问题所困扰,在网上查询十六进制文件的一般格式,都是这么说的,文件由一条条的记录组成,每条记录都有固定的几个部分组成。具体的格式如下:
: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_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

你可能感兴趣的:(FPGA)