用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. ElasticSearch CPU和内存占用高的优化记录

    公司最近使用ElasticSearch作为数据报表汇总引擎.上线三个月累计数据800万,但是今天突然大面积出现查询超时,上服务器查看服务运行情况,发现cpu使用率高达300% mem 使用率也到了90 ...

  2. WEB学习笔记13-高可读性的HTML之精简HTML代码/过时的块状元素和行内元素

    <a id="more-intro">点击此处 <img src="down-arrow.png" /></a> (1)删除 ...

  3. spring cloud_1_mm_ribbon

    ji接上文 ribbon做请求分发负载均衡 ribbon 配置: server.port=9999 spring.application.name=ribbon-consumer #stores.ri ...

  4. 20164322韩玉婷 -----EXP4 恶意代码分析

    1.实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,sys ...

  5. 第四次Scrum冲刺----Life in CCSU

    一.第四次Scrum任务 小组GitHub地址链接 个人GitHub地址链接:https://github.com/2505486985/FirstScrum 继续上次完成的任务,这次完成校园服务中的 ...

  6. 只有mdf文件和ldf文件--怎么恢复数据库

    1.将mdf和ldf放到你电脑的路径中. 2.执行以下语句 USE master; GO CREATE DATABASE DBName ON (FILENAME = 'C:\Program Files ...

  7. 我的linux部署nginx步骤记录

    http://www.runoob.com/linux/nginx-install-setup.html 安装prce找不到GCC c++文件 解决方法: yum install gcc-c++^C ...

  8. Merging one UE4 project into another.

    Merging can be done by right clicking on folder in the content directory in the editor and selecting ...

  9. node连接mongodb(简略版)

    1.先通过配置启动mongodb,然后新建db.js     已经对相对应的数据库操作增删改查封装完成. //这个模块里面封装了所有对数据库的常用操作 var MongoClient = requir ...

  10. 在Django中运行ExtJS 事例

    网上关于ExtJS的事例挺多的,但是在Django中使用ExtJS挺少的,当然了,一些大牛觉得ExtJS运用在页面上是很简单的事,但是对于菜鸟来说,实在有点困难. 我这个例子是用在了sublime3这 ...