Verilog中的二维数组
Verilog中提供了两维数组来帮助我们建立内存的行为模型。具体来说,就是可以将内存宣称为一个reg类型的数组,这个数组中的任何一个单元都可以通过一个下标去访问。这样的数组的定义方式如下:
reg [wordsize : 0] array_name [0 : arraysize];
例如:
reg [7:0] my_memory [0:255];
其中 [7:0] 是内存的宽度,而[0:255]则是内存的深度(也就是有多少存储单元),其中宽度为8位,深度为256。地址0对应着数组中的0存储单元。
如果要存储一个值到某个单元中去,可以这样做:
my_memory [address] = data_in;
而如果要从某个单元读出值,可以这么做:
data_out = my_memory [address];
但要是只需要读一位或者多个位,就要麻烦一点,因为Verilog不允许读/写一个位。这时,就需要使用一个变量转换一下:(wolf点评:菜鸟易犯的错误,注意!)
例如:
data_out = my_memory[address];
data_out_it_0 = data_out[0];
这里首先从一个单元里面读出数据,然后再取出读出的数据的某一位的值。
初始化内存
初始化内存有多种方式,这里介绍的是使用readmemb和readmemb和readmemh系统任务来将保存在文件中的数据填充到内存单元中去。readmemb和readmemb和readmemh是类似的,只不过readmemb用于内存的二进制表示,而readmemb用于内存的二进制表示,而readmemh则用于内存内容的16进制表示。这里 以$readmemh系统任务来介绍。
语法
$readmemh(“file_name”, mem_array, start_addr, stop_addr);
注意的是:
file_name是包含数据的文本文件名,mem_array是要初始化的内存单元数组名,start_addr 和 stop_addr是可选的,指示要初始化单元的起始地址和结束地址。
下面是一个简单的例子:
module memory ();
reg [7:0] my_memory [0:255];
initial begin
$readmemh(“memory.list”, my_memory);
end
endmodule
这里使用内存文件memory.list来初始化my_memory数组。
而下面就是一个内存文件的例子。
// Comments are allowed (wolf点评:段注释也可以,空行空格不影响!)
CC // This is first address i.e 8‘h00
AA // This is second address i.e 8’h01
@55 // Jump to new address 8‘h55
5A // This is address 8’h55
69 // This is address 8‘h56
对于内存文件,要注意的是下列几点:
a、注释标记//在内存文件中是被允许的;
b、使用@符号将跳到新的目标地址,没有@符号就表示地址将顺序递增。
关于这个系统任务,有下列常见的用法:
1、顺序初始化所有的数组单元;
这种情况下,可以使用@符号来指示地址,也可以不使用它,而只在每一行存放要存放的数据。
这样数据将顺序按地址递增存放,从0地址开始。
2、只初始化部分的数组单元;
这种情况下,可以使用@符号来指示下一个要初始化的地址,然后对该地址单元进行初始化。例
如下列的内存文件就只初始化8’h00,8‘h01,8’h55和8‘h564个内存地址单元。
// Comments are allowed
CC // This is first address i.e 8’h00
AA // This is second address i.e 8‘h01
@55 // Jump to new address 8’h55
5A // This is address 8‘h55
69 // This is address 8’h56
3、只初始化数组的地址区间的一部分单元。
这个时候,还可以使用$readmemh任务的start_addr 和 stop_addr选项来指定初始化的范围。
例如,只初始化100到104这5个单元,就可以这么做:
内存文件memory.list定义为:
CC
AA
55
5A
69
-
Verilog
+关注
关注
28文章
1352浏览量
110511 -
数组
+关注
关注
1文章
417浏览量
26038
原文标题:Verilog中的二维数组及其初始化
文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
二维影像扫描引擎可以应用于哪些行业?
![<b class='flag-5'>二维</b>影像扫描引擎可以应用于哪些行业?](https://file1.elecfans.com/web3/M00/08/58/wKgZO2eu6a-AcnacAADhhPUT3x0743.png)
二维周期光栅结构(菱形)光波导的应用
二维扫码头有效扫描距离是多少,影响二维扫描头扫码的因素有哪些
![<b class='flag-5'>二维</b>扫码头有效扫描距离是多少,影响<b class='flag-5'>二维</b>扫描头扫码的因素有哪些](https://file1.elecfans.com/web3/M00/06/22/wKgZO2eHcO-AYC7xAAA34zSQjf4282.png)
一维/二维条码识读器可以应用于哪些行业?
![一<b class='flag-5'>维</b>/<b class='flag-5'>二维</b>条码识读器可以应用于哪些行业?](https://file1.elecfans.com/web3/M00/05/70/wKgZO2d_f2uAUBD6AACUsEpOSL8989.png)
RS232接口的二维影像扫描引擎,广泛用在医疗设备上扫一维二维码
![RS232接口的<b class='flag-5'>二维</b>影像扫描引擎,广泛用在医疗设备上扫一<b class='flag-5'>维</b><b class='flag-5'>二维</b>码](https://file1.elecfans.com/web3/M00/03/7D/wKgZO2dpGNeAS83xAAAwjNU-FX4369.png)
二维内嵌扫码模组用于自助储物柜,快速扫描各种一维二维条码
![<b class='flag-5'>二维</b>内嵌扫码模组用于自助储物柜,快速扫描各种一<b class='flag-5'>维</b><b class='flag-5'>二维</b>条码](https://file1.elecfans.com/web3/M00/01/07/wKgZPGdQCyCAQVnKAABZdApkdJs371.png)
指针数组和二维数组有没有区别
二维码识读设备有哪些类型
![<b class='flag-5'>二维</b>码识读设备有哪些类型](https://file1.elecfans.com/web2/M00/0A/5B/wKgZomcfMLaAeSZiAACWA45m3go735.png)
labview按行读取二维数组之后再按读取顺序重新组成二维数组如何实现?
请问labview是否无法向matlab传递3维数组
FPC软板二维码标识功能?简直是黑科技!
二维码扫码器/二维码读取设备嵌入园区闸机系统中的应用
![<b class='flag-5'>二维</b>码扫码器/<b class='flag-5'>二维</b>码读取设备嵌入园区闸机系统<b class='flag-5'>中</b>的应用](https://file1.elecfans.com/web2/M00/EC/C3/wKgaomZgCbyAOIjAAACxDkz0OQk688.png)
技术|二维PDOA平面定位方案
![技术|<b class='flag-5'>二维</b>PDOA平面定位方案](https://file1.elecfans.com/web2/M00/EC/7B/wKgaomZeuc6AZ8ZjAACBaHn6et8796.png)
评论