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

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

//-----------------------------------------------------------------
// Author: wuzhangquan
// Blog: http://www.cnblogs.com/xinlukk/
// Email: wuzhangquan@foxmail.com
//----------------------------------------------------------------- //: 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

hex转mif文件 verilog的更多相关文章

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

    mif文件就是存储器初始化文件,即memory initialization file,用来配置RAM或ROM中的数据.生成QuartusII11.0可用的mif文件,有如下几种方式: 方法1:利用Q ...

  2. FPGA工程中用C语言对文件进行处理_生成mif文件

    本博客中有用verilog处理文件数据的代码,本博文采用C 处理文件中的数据. 有时候要生成一个mif文件—— altera memory  initial file.本次工程中我得到的是一个大型的数 ...

  3. 使用matlab生成sine波mif文件

    使用matlab生成sine波mif文件 作者:lee神 在使用altera 的FPGA中的rom过程中常常会使用到.mif文件或.hex文件.对于初学者,无论mif还是hex都是很令人疑惑的东西,这 ...

  4. 用matlab生成mif文件

    在FPGA中,rom模块的初始化文件分为两种,一种是hex文件,另外一种是mif文件,这两种文件都可以通过Quartus进行手工创建,进行手工输入数据,也可以借助于专用的文件编辑器完成编辑. 在此介绍 ...

  5. 使用MATLAB一键制作mif文件

    本文档主要讲解实现一个16384(2^14)点的14位正弦波数据mif格式文件的生成,使用此文件,我们便可以在FPGA上基于直接数字合成(DDS)原理生成标准的正弦波,即实现信号发生器的功能.关于DD ...

  6. fpga rom 初始化mif文件生成

    mif文件的格式 width= depth= address_radix= data_radix= content begin 00:    ; 01:   ; 02:   ; .... end; 关 ...

  7. mif文件C语言生成

    1:正弦波 用函数 sin (x * π/180°) /************************************************** 正弦波 mif 生成 ********** ...

  8. mif文件生成方法

    mif文件就是存储器初始化文件,即memory initialization file,用来配置RAM或ROM中的数据.常见生成方法: Quartus自带的mif编辑器生成 mif软件生成 高级编程语 ...

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

    mif文件生成模板,只需要5步,很简单!!!!! 先说明如何操作,1-2-3-4-5步,后面附上模板!!! 下面以汉字去模演示过程: 1.取模软件设置:注意这里是设置的输出数据的格式!!!!!!!!! ...

随机推荐

  1. 2017年java面试题库【归类篇】

    一.Java基础 1.String类为什么是final的. 2.HashMap的源码,实现原理,底层结构. 3.说说你知道的几个Java集合类:list.set.queue.map实现类咯... 4. ...

  2. Gravatar 头像使用

    Gravatar :如果在Gravatar的服务器上放置了你自己的头像,那么在任何支持Gravatar的blog或者留言本上留言时,只要提供你与这个头像关联的email地址,就能够显示出你的Grava ...

  3. Window 下载Android系统源代码

    第一步:使用命令下载manifest文件夹 git clone https://aosp.tuna.tsinghua.edu.cn/ 第二步:进入文件夹,打开default.xml文件并找到自己要下载 ...

  4. Oracle数据仓库套件

    OBIEE RPD:定义不同分析的主题角度,确定相应的事实表和维度表 报表层:选取需要的维度和度量,根据筛选器选取需要的数据 可视化:用图形展示数据,支持常见的图形:如折线图,饼图,堆叠图等. ODI ...

  5. firefox support.mozilla.org 的管理员没有正确配置好此网站。为避免您的信息失窃,Firefox 并未与此网站建立连接。

    1.在地址栏输入:"about:config"-我了解此风险: 2.右键-新建-布尔: 3.在框内输入:security.enterprise_roots.enabled-确定-搜 ...

  6. shell脚本-2

    http://www.runoob.com/linux/linux-shell-variable.html 字符串可以用单引号,也可以用双引号,也可以不用引号.单双引号的区别跟PHP类似. 单引号字符 ...

  7. 三大前端框架(react、vue、angular2+)父子组件通信总结

    公司业务需要,react.vue.angular都有接触[\无奈脸].虽然说可以拓展知识广度,但是在深度上很让人头疼.最近没事的时候回忆各框架父子组件通信,发现很模糊,于是乎稍微做了一下功课,记录于此 ...

  8. linux中mysql配置文件和jdk环境变量

    mysql配置文件 [client]default-character-set = utf8mb4 [mysql]socket = /var/lib/mysql/mysql.sockdefault-c ...

  9. 阿里云ECS Centos7 系统安装图形化桌面

    阿里云官网默认的Linux Centos7系统镜像,都是没有安装桌面环境的,用户如果要使用桌面,需要自己在服务器上进行安装. 本教程以MATE桌面安装为例 1.登录服务器,执行命令安装桌面环境. 先安 ...

  10. OSI七层网络模型浅析

    OSI七层网络模型(从下往上): 物理层(Physical):设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的 环境.可以理解为网络传输的物理媒体部分,比如网卡,网线,集线器,中继器,调 ...