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和readmemh系统任务来将保存在文件中的数据填充到内存单元中去。readmemb和readmemh是类似的,只不过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

定义:FPGA中的二维数组其实并不是真正意义上的数组,而是由多个寄存器组成的ROM或者RAM
定义一个深度为100,宽度32的ROM/RAM 数组,即有100组宽度为32的寄存器

reg    [31:0] memory  [0:99] ; //前面[31:0]表示位宽,memory 是此存储的名字,[0:99]表示0到99共100个组

//当要调用其中的一组数据的特定部分,可以使用  存储名 [组数] [要调用的位数]
//例如,调用第55组的高8位
assign   DATA = memory[54][31:24]

  • 3
    点赞
  • 17
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

mail-mail

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值