用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. Spring XML文件配置

    singleton不能创建多对象(默认) <?xml version="1.0" encoding="UTF-8"?> <beans xmln ...

  2. Linux安装jdk-8u161-linux-x64

    最基本的操作,有一些细节需要处理,这次主要列出来步骤,其实步骤在网上一搜就有,这里只是根据个人的操作进行一些整合和注意事项的提醒罢了. 1.卸载原先的java jdk 这一步的目的是,很多Linux版 ...

  3. jQuery-4.动画篇---动画切换的比较(toggle与slideToggle以及fadeToggle的比较)

    jQuery中toggle与slideToggle以及fadeToggle的比较 操作元素的显示和隐藏可以有几种方法.例如: 改变样式display为none 设置位置高度为0 设置透明度为0 都能达 ...

  4. @RequestParam 和 @ PathVariable 的区别

    @RequestParam 和 @ PathVariable 的区别http://localhost:8080/Springmvc/user/page.do?pageSize=3&pageNo ...

  5. java高级进阶

  6. 20155219付颖卓 Exp3 免杀原理与实践

    1.基础问题回答 (1)杀软是如何检测出恶意代码的? 杀毒软件有一个病毒的特征码库,通过识别恶意代码的特征码或者特征片段检测恶意代码 杀毒软件通过动态检测对象文件的行为来识别恶意代码,如果他的行为在一 ...

  7. SimpleDateFormat将月/日/年 时分秒转换为年-月-日 时:分:秒

    String expirTime = ”12 / 27 / 2018 12: 00: 00 AM”;SimpleDateFormat in = new SimpleDateFormat("M ...

  8. Python变量和常量

    1.什么是变量 变量:核心在于变和量儿字,变->变化,量->状态如何定义? x=1 变量名 变量赋值符号:= 变量值:1 其中变量名又称为标识符: 1. 可以是字母,数字,下划线的任意组合 ...

  9. Notepad++ 配置python

    Notepad++配置: 1. 运行命令配置 单击运行,出现对话框 在弹出的窗口里填入:cmd /k cd "$(CURRENT_DIRECTORY)" &  python ...

  10. Sublime3安装及配置

    1.官网下载 2.安装后输入密钥 ----- BEGIN LICENSE -----sgbteamSingle User LicenseEA7E-11532598891CBB9 F1513E4F 1A ...