以前一直没有把这个文件格式当做一个问题,最近有用到ROM才发现, 之前的格式是运气好,刚好事那么一回事。
今天在网上找到,这么一个方法,如图1.
首先注意变量Mem_width, 对应的注释是存储宽度。其次,到了第一个fprintf,“fid,‘memory_initialization_radix=%d;\n’,Mem_width;”对应的注释又变成ROM写入数值的进制。
在调用ROM IP核中, 也有数据位宽(图2)和数据进制(图3)两个参数。
但是,这两个参数和COE文件里面的存储位宽和进制不是对应的关系。
首先,COE文件里面就没有存储位宽的概念。其次COE文件中的参数进制,是我们COE文件中的数据进制,并不是“我们要以什么进制的形式存入ROM”。
再说到ROM,ROM中的data_width参数是输出端口的位宽,是要根据我们COE文件中的数据来决定,例如:设置为8位,那么能表示的无符号数就是0-255,如果COE文件中有超过255的数据,那就会造成数据截断。ROM中的radix参数,是默认值的进制,和COE文件中的数据进制并无关系。
最后,我COE生成的数据是10进制的,范围在-128-127,MATLAB的代码如下,ROM的数据位宽应设为9位,高位做符号位