添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
逼格高的碗  ·  docker --link容器互联 - ...·  5 月前    · 
空虚的香烟  ·  磁力猫 -魔法猫咪.lol ...·  11 月前    · 
玩足球的篮球  ·  401 Unauthorized ...·  1 年前    · 

在开发FPGA的过程中,经常都会涉及到将数据写为mif、txt、coe文件,每次都去写相关代码,属实比较麻烦效率也很低,我就想着写一个函数,封装起来,要使用的时候直接调用。

.mif 和 .coe 是 FPGA 设计中常用的存储文件,用于 ROM、RAM 等存储器数据的加载,常见的还用在 DDS 信号发生器和 FIR 滤波器的设计中。

.txt 文件主要用于 Matlab 和 FPGA 的联合仿真,比如在之前的设计中,需要使用 Matlab 生成随机序列写入到 .txt 文件,然后 FPGA 仿真中在 Testbench 中读取该数据,处理后的数据再写入 .txt 文件,拿到 Matlab 里面读取后,可以很方面的进行对比和验证。

2. mif 文件

MIF(Memory Initialization File),内存初始化文件,用于 Altera / Intel 的 FPGA 器件的 RAM 或 ROM 配置。

图片 Altera ROM添加mif文件

(1)图像处理中,使用 ROM 存储图片或字体信息,进行图像的处理或者VGA显示的字模、固定图片等;

(2)数字信号处理中,使用 ROM 存储 FIR 滤波器等所需的滤波系数;

(3)DDS 信号发生器中,部分实现方式采用 ROM 存储一个周期的采样波形,通过以不同间隔的读取方式输出不同频率的波形;

MIF文件是一个文本文件,由两个部分组成:第一部分是元信息,第二部分是内存初始化数据,MIF文件的格式如下:

DEPTH = 16;//存储器的深度,就是存多少个数据
WIDTH = 8;//存储器的数据位宽,就是每个数据多少位
ADDRESS_RADIX = HEX;//设置地址基值的进制表示,可以设为BIN(二进制),OCT(八进制),DEC(十进制),HEX(十六进制)
DATA_RADIX = HEX;//设置数据基值的进制表示, 同上
CONTENT BEGIN//数据区开始
0 : 00,
1 : 01,
2 : 02,
3 : 03,
4 : 04,
5 : 05,
6 : 06,
7 : 07,
8 : 08,
9 : 09,
A : 0A,
B : 0B,
C : 0C,
D : 0D,
E : 0E,
F : 0F;

3. txt 文件

txt 文件广泛应用于 matlab 与 FPGA 的联合仿真中,特别是在 TestBench中,经常需要先使用 Matlab 将待仿真的输入数据制作成 .txt 文件,然后在 TestBench 中读取该 txt 文件作为输入数据,并将模块的输出数据写入新的 txt 文件,可以使用 Matlab 读取输出数据并进行绘图、数据比对等性能分析等。

TestBench中读取txt文件:

$readmemh({PATH,"test_data.txt"},test_data,0,NUM-1);

4. coe文件

.coe 与 .mif 一样,是存储文件,不同点在于 Altera 的 FPGA 使用 .mif 格式,Xilinx 的 FPGA 使用 .coe 格式。

图片Vivado ROM添加coe

COE文件是一种常用的存储器初始化文件格式,常用于Xilinx Vivado软件中。COE文件可以包含对存储器内容的初始化值以及一些元数据信息。COE文件主要由两个部分组成:第一部分是头信息,第二部分是内存初始化数据。

.coe 的格式如下:

MEMORY_INITIALIZATION_RADIX:定义数据类型,有效值为2(2进制)、10(10进制)、16(16进制)。

MEMORY_INITIALIZATION_VECTOR:定义存储数据,可以用空格、逗号分隔,回车符分隔。

memory_initialization_radix = 16;
memory_initialization_vector =
00, 01, 02, 03, 04, 05, 06, 07, 
08, 09, 0A, 0B, 0C, 0D, 0E, 0F;

5.可生成mif、txt、coe的Matlab函数

在开发FPGA的过程中,经常都会涉及到将数据写为mif、txt、coe文件,每次都去写相关代码,属实比较麻烦效率也很低,我就想着写一个函数,封装起来,要使用的时候直接调用。

function [result]=gen_coe_txt_mif(data_in,width,depth,path)
type = extractAfter(path,'.');
data_in = data_in * 2 ^ (width-1);
q = quantizer([width,0]);
hexStr = num2hex(q,data_in);
x = strings(depth,1);
for addr1 = 1:depth
    x(addr1) = hexStr(addr1,:);
fid=fopen(path,'wt');  %打开或者新建文件,存放位置和文件名任意
switch(type)
    case 'coe'
        fprintf(fid,'memory_initialization_radix=16;\n');
        fprintf(fid,'memory_initialization_vector=');
        for addr2 = 1:depth-1
             fprintf(fid,'\n %s,',x(addr2));%开始写数据了
        fprintf(fid,'\n %s;',x(depth));
        fclose(fid);
    case 'txt'
        for addr2 = 1:depth
             fprintf(fid,'%s\n',x(addr2));%开始写数据了
        fclose(fid);
    case 'mif'
        fprintf(fid,'DEPTH=%d;\n',depth);
        fprintf(fid,'WIDTH=%d;\n',width);
        fprintf(fid,'ADDRESS_RADIX = HEX;\n');
        fprintf(fid,'DATA_RADIX = HEX;\n');
        fprintf(fid,'CONTENT BEGIN');
        for addr2 = 1:depth-1
             fprintf(fid,'\n %x:%s,',addr2-1,x(addr2));%开始写数据了
        fprintf(fid,'\n %x:%s;',depth-1,x(depth));
        fprintf(fid,'\n END;');
        fclose(fid);
    otherwise
        disp(type_error');
result = 1;

函数调用形式为:

result = gen_coe_txt_mif(data_in,width,depth,path)

result为返回值,成功返回1,实际调用时可以不写。然后data_in是数据;width是数据位宽;depth数据深度;path是文件存放的路径。下面来举例说明:

  • 生成coe文件
  • N = 16;
    t = linspace( 0, 2*pi,N);%选取采样点
    y = sin(t);
    gen_coe_txt_mif(y,16,N,'D:/FPGA/gen_coe_mif_txt/LFM.coe');
    memory_initialization_radix=16;
    memory_initialization_vector=
     0000,
     340f,
     5f1f,
     79bc,
     7f4c,
     6ed9,
     4b3c,
     1a9c,
     e563,
     b4c3,
     9126,
     80b3,
     8643,
     a0e0,
     cbf0,
     ffff;
    
  • 生成txt文件 只需要修改文件路径中,存储文件的后缀名为txt即可。
  • N = 16;
    t = linspace( 0, 2*pi,N);%选取采样点
    y = sin(t);
    gen_coe_txt_mif(y,16,N,'D:/FPGA/gen_coe_mif_txt/LFM.txt');
    
  • 生成mif文件 只需要修改文件路径中,存储文件的后缀名为mif即可。
  • N = 16;
    t = linspace( 0, 2*pi,N);%选取采样点
    y = sin(t);
    gen_coe_txt_mif(y,16,N,'D:/FPGA/gen_coe_mif_txt/LFM.txt');
    DEPTH=16;
    WIDTH=16;
    ADDRESS_RADIX = HEX;
    DATA_RADIX = HEX;
    CONTENT BEGIN
     0:0000,
     1:340f,
     2:5f1f,
     3:79bc,
     4:7f4c,
     5:6ed9,
     6:4b3c,
     7:1a9c,
     8:e563,
     9:b4c3,
     a:9126,
     b:80b3,
     c:8643,
     d:a0e0,
     e:cbf0,
     f:ffff;
    

    制作和写文章不易,觉得有用的话不妨赞赏一下,如果经济条件不允许可以点个免费的赞和在看呀!!!十分感谢!!!

    赞(1) 打赏
    未经允许不得转载:KULYA的个人博客 » FPGA仿真必备——Matlab生成mif,txt,coe

    kulya

    上一篇
    下一篇

    评论 抢沙发

    请求次数:53 次,加载用时:3.694 秒,内存占用:5.76 MB

    觉得文章有用就打赏一下文章作者

    非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

    支付宝扫一扫

    微信扫一扫