hex转mif文件 verilog

用FPGA来跑ARM M0核的时候,刚开始将Keil编译产生的hex文件拿来仿真下到板子上的时候,发现程序运行不正确。细细观察仿真波形发现,在Altera的ROM IP中直接调用Keil产生的hex文件,出来数据是不正确的。比较Quartus产生的HEX文件和标准的Hex文件,发现两者之间的格式不是完全一样。于是干脆直接将Keil产生的Hex文件转换成mif文件。

代码是用verilog写的,以调试通过,M0也运行正常。由于没有判断Extended LinearAddress Record,该程序只能转换小于64Kbyte的hex文件。

hex转mif代码如下。


//-----------------------------------------------------------------
//    Author:    wuzhangquan
//    Blog:      http://www.cnblogs.com/xinlukk/
//    Email:     [email protected]
//-----------------------------------------------------------------

//: 10 0000 00 F0FF0F20 B9010000 B1010000 AD010000 B8

`timescale  1ns/1ns
module  hex2mif;

parameter MEM_DEPTH = 16*1024;

integer fid;
integer i;
integer tf;

reg   [7:0] ch;
reg   [7:0]   len;
reg   [15:0]  ext_addr;
reg   [15:0]  addr;
reg   [7:0]   dtype;
reg   [7:0]   data;

reg   [7:0]   mem[0:MEM_DEPTH-1];

initial begin

  ch  = 0;
  ext_addr  = 0;
  addr  = 0;
  dtype = 0;
  data  = 0;

  for(i=0;i<MEM_DEPTH;i++)
    mem[i] = 0;

  fid=$fopen("rom.hex","rb");

  if(fid==0)  begin
          $display("Cann‘t find rom.hex!!");
          $finish;
  end

  ch  = $fgetc(fid);
  while(ch!=8‘hff)
    begin
        //$write("%c",ch);

        if(ch==":")
          begin
              ch  = $fgetc(fid);
              len[7:4] = asc2hex(ch);
              ch  = $fgetc(fid);
              len[3:0] = asc2hex(ch);
              //Get Addr
              ch  = $fgetc(fid);
              addr[15:12] = asc2hex(ch);
              ch  = $fgetc(fid);
              addr[11:8] = asc2hex(ch);
              ch  = $fgetc(fid);
              addr[7:4] = asc2hex(ch);
              ch  = $fgetc(fid);
              addr[3:0] = asc2hex(ch);
              //get Data type
              ch  = $fgetc(fid);
              dtype[7:4] = asc2hex(ch);
              ch  = $fgetc(fid);
              dtype[3:0] = asc2hex(ch);
              //DATA
              if(dtype==8‘h00)  begin //Data
                  for(i=0;i<len;i++)  begin
                      ch  = $fgetc(fid);
                      data[7:4] = asc2hex(ch);
                      ch  = $fgetc(fid);
                      data[3:0] = asc2hex(ch);
                      mem[ext_addr + addr] = data;
                      addr = addr + 1;
                      $fwrite(tf,"%h",data);
                  end
                  len = 0;
              end

              //CHECK
              //ch  = $fgetc(fid);
              //ch  = $fgetc(fid);

          end

        ch  = $fgetc(fid);
    end //while end

    $fclose(fid);
    fid = $fopen("rom.mif","w");

    $fdisplay(fid,"WIDTH=32;");
    $fdisplay(fid,"DEPTH=4096;");
    $fdisplay(fid,"ADDRESS_RADIX=HEX;");
    $fdisplay(fid,"DATA_RADIX=HEX;");

    $fdisplay(fid,"CONTENT BEGIN");

    for(i=0;i<(MEM_DEPTH/4);i=i+1)
          $fdisplay(fid,"%h : %h%h%h%h;",i,mem[i*4+3],mem[i*4+2],mem[i*4+1],mem[i*4]);

    $fdisplay(fid,"END;");

    $fclose(fid);  

//    fid = $fopen("rom.txt","w");
//
//    for(i=0;i<(MEM_DEPTH/4);i=i+1)
//          $fdisplay(fid,"%h%h%h%h",mem[i*4+3],mem[i*4+2],mem[i*4+1],mem[i*4]);
//
//    $fclose(fid);  

end

  function  [3:0] asc2hex;
    input   [7:0] din;
    begin
        if(din<="9")  asc2hex = din - "0";
        else if( (din>="A") && (din<="F"))  asc2hex = din - "A" + 4‘ha;
        else if( (din>="a") && (din<="f"))  asc2hex = din - "a" + 4‘ha;
        else  asc2hex = 0;
    end
  endfunction

endmodule
时间: 2024-11-06 03:18:20

hex转mif文件 verilog的相关文章

用matlab生成mif文件

module rom_ip( clk,data, rst_n ); input clk; input rst_n; output [7:0] data; reg [7:0] add; rom_ip_mif rom_ip_mif_inst ( .address ( add ), .clock ( clk ), .q ( data ) ); always @(posedge clk or negedge rst_n) if(!rst_n)begin add <= 8'd0; end else if(

生成mif文件的几种方法总结

mif文件就是存储器初始化文件,即memory initialization file,用来配置RAM或ROM中的数据.生成QuartusII11.0可用的mif文件,有如下几种方式: 方法1:利用Quartus自带的mif编辑器 优点:对于小容量RAM可以快速方便的完成mif文件的编辑工作,不需要第三方软件的编辑: 缺点:一旦数据量过大,一个一个的输入会使人崩溃: 使用方法:在quartus中,[file]/[new],选择Memory  Initialization file,弹出如下窗口:

FPGA学习笔记之mif文件生成方法总结

方法1:利用Quartus自带的mif编辑器 优点:对于小容量RAM可以快速方便的完成mif文件的编辑工作,不需要第三方软件的编辑: 缺点:一旦数据量过大,一个一个的输入会使人崩溃: 使用方法:在quartus中,[file]/[new],选择Memory  Initialization file,弹出如下窗口: Number of words:可寻址的存储单元数,对于8bit地址线,此处选择256: words size:存储单元宽度,8bit: 然后点击“OK”. 在表格中输入初始化数据:

如何生成各种mif文件,绝对经典!!!

mif文件生成模板,只需要5步,很简单!!!!! 先说明如何操作,1-2-3-4-5步,后面附上模板!!! 下面以汉字去模演示过程: 1.取模软件设置:注意这里是设置的输出数据的格式!!!!!!!!!! 2.生成字模,并保存 3.用Notepad++打开生成的txt文件,并去除干扰字符 4. 5. 6.附上模板 --MIF file template WIDTH=64; DEPTH=512; ADDRESS_RADIX=DEC; DATA_RADIX=HEX; CONTENT BEGIN 0 :

mif文件生成方法

mif文件就是存储器初始化文件,即memory initialization file,用来配置RAM或ROM中的数据.常见生成方法: Quartus自带的mif编辑器生成 mif软件生成 高级编程语言生成 前两种方法都有一定的缺陷,主要介绍第三种方法,按照mif文件格式,使用高级编程语言(Matlab.C)编写生成. 注意: mif文件都是ASCⅡ码,负数应该是用补码处理,否则负数在mif文件中会变成0. Matlab参考代码如下: clc;clear;close all; width = 1

mif文件C语言生成

1:正弦波 用函数 sin (x * π/180°) 1 /************************************************** 2 3 正弦波 mif 生成 4 5 ***************************************************/ 6 #include <stdio.h> 7 #include <math.h> 8 9 #define DEPTH 128 /*数据深度,即存储单元的个数,可更改*/ 10 #d

modelsim仿真rom.mif文件配置需要绝对路径

昨晚用modelsim仿真ROM,居然输出的数据全部都是000.这个在以前是没有过的.难道modelsim坏了?我试了一个以前的rom测试文件,居然显示正常.这就怪了.难道2个月没碰就这么生疏了? 然后开始找原因.最后看到一个帖子说,如果rom无输出,可能是IP核配置文件的,初始化文件需要使用绝对路径.然后我就把配置文件的初始化mif改成了绝对路径.居然就好了. 但是我查看了下以前的测试.也没有是绝对路径啊.唉~~~只能说modelsim还有待加强啊! modelsim仿真rom.mif文件配置

MIF文件编写小技巧

教大家一个简单的向MIF文件中导入数据的办法. 以2048点8位正弦波数据为例(最小值0,最大值200). 1.打开MATLAB,键入公式 clearx = 1:2048;y = floor(100*(sin(2*pi*x/2048)+1)); 2.打开工作区变量y 3.复制工作区数据 4.在Quartus II中新建mif文件 5.选择字数为2048 6.全选后粘贴 7.Ctrl+S保存

fpga rom 初始化mif文件生成

mif文件的格式 width= depth= address_radix= data_radix= content begin 00:    ; 01:   ; 02:   ; .... end; 所以只需要用matlab生成中间部分的数,然后添加头尾格式就可以了,当然文件后缀一定得是.mif matlab例子 clcclear alln=[1:1000];ratio=0.125;%ratio means fo/fs;sintemp=sin(2*pi*ratio*n);sinround=roun