verilog中$readmemb和$readmemh的使用

菜鸟一枚,只是分享一下在学习的过程,和这两个系统函数的简单用法,

$readmemb和$readmemh用来从文件中读取数据到存储器中。

读取的内容只包括:空白位置(空格、换行、制表格(tab和form-feeds),注释行、二进制或十六进制的数字。

数字中不能包含位宽说明和格式说明,其中readmemb要求每个数字是二进制数,readmemh要求每个数字必须是十六进制数字。数字中不定值x或X,高阻值z或Z,和下划线(_)的使用方法和代表意义与一般Verilog HDL程序中的用法一致。

在Verilog语法中,一共有以下六种用法:

(1)$readmemb("<数据文件名>",<存储器名>);

(2)$readmemb("<数据文件名>",<存储器名>,<起始地址>);

(3)$readmemb("<数据文件名>",<存储器名>,<起始地址>,<终止地址>);

(4)$readmemh("<数据文件名>",<存储器名>);

(5)$readmemh("<数据文件名>",<存储器名>,<起始地址>);

(6)$readmemh("<数据文件名>",<存储器名>,<起始地址>,<终止地址>);

这里只说一下最简单的第一种和第四种(因为我也只了解这两种,哈哈)

(1)$readmemb的使用

先在Verilog代码目录下准备一个文件file1.txt,存入二进制数据:

1111 1010 0101 1x1z 1_1_ 1_111    

或者

1111

1010 

0101 

1x1z 

1_1_ 

1_111

存在一行每个用空格隔开,跟分行存,输出结果是一样的,但是若在一行中不用空格隔开会出错,编译器会试图

把一整行数据存在一个四位的存储单元中。

`timescale 10ns/1ns
module test;
reg[3:0] memory[0:7];//申请八个四位的存储单元
reg[4:0] n;
initial
	begin
		$readmemb("file1.txt",memory); //读取file1.txt中的数字到memory
	for(n=0;n<=7;n=n+1)   //把八个存储单元的数字都读取出来,若存的数不到八个单元输出x态,程序结果中会看到
		$display("%b",memory[n]);
	end
endmodule

编译,仿真,运行之后的输出结果:

# 1111
# 1010
# 0101
# 1x1z              不定态和高阻态输出依旧为不定态和高阻态
# 0011              文件中村的是1_1_,忽略下划线
# 1111               忽略下划线
# xxxx                文件中只有六个数据,剩下两个输出为不定态x
# xxxx

(2)$readmemh的使用

准一个文件file2.txt,存入十六进制数据:

1234 5678 9012

代码:

`timescale 10ns/1ns
module test;
reg set;
reg[15:0] memory[0:7];    //注意这里每个存储单元的长度为16位,因为每个数字是四位十六进制数,换算成二进制数是16位
reg[4:0] n;
initial
	begin
		$readmemh("file2.txt",memory);
	for(n=0;n<=7;n=n+1)
		$display("%h",memory[n]);
	end
endmodule

输出:

# 1234
# 5678
# 9012
# xxxx
# xxxx
# xxxx
# xxxx

# xxxx

若以后会了其他用法再来补充吧

  • 122
    点赞
  • 493
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值