0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Verilog中的二维数组说明

电子工程师 来源:FPGA设计论坛 作者:FPGA设计论坛 2020-09-28 11:35 次阅读

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

    文章

    1322

    浏览量

    109218
  • 数组
    +关注

    关注

    1

    文章

    406

    浏览量

    25580

原文标题:Verilog中的二维数组及其初始化

文章出处:【微信号:gh_9d70b445f494,微信公众号:FPGA设计论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Labview调用Halcon识别二维

    *附件:Labview调用Halcon识别二维码.zip Labview调用Halcon识别二维码 可一次识别多个二维码 使用Labview 2020编辑,halcon的版本是 19.11,32位
    发表于 02-21 16:31

    LabVIEW开发二维激光振镜扫描控制系统

    LabVIEW开发二维激光振镜扫描控制系统 本项建立一个二维激光振镜扫描控制系统,涵盖了光学系统和激光器的选择以及振镜驱动器的设计。项目的核心工作包括振镜驱动器的硬件电路设计、上位机控制软件的编写
    发表于 12-22 11:00

    将一维数组转为二维python

    将一维数组转为二维数组是一个常见的问题,特别是在处理数据时。一维数组是由一个连续的数据块组成,而二维数组
    的头像 发表于 11-23 14:54 1657次阅读

    python如何定义二维数组

    在Python中,可以通过使用列表嵌套的方式来定义二维数组。具体步骤如下: Step 1: 创建一个空的二维列表 要创建一个空的二维数组
    的头像 发表于 11-21 15:12 554次阅读

    python怎么创建二维数组

    如何创建二维数组在Python中是一个常见的问题。在Python中,我们可以使用嵌套的列表(list of lists)或者使用NumPy库来创建二维数组。在本文中,我们将详细介绍这两
    的头像 发表于 11-21 15:10 946次阅读

    使用Arduino可以连接摄像头做二维码识别吗?

    使用Arduino可以连接摄像头做二维码识别吗
    发表于 11-10 07:56

    可以用单片机生成二维码吗?

    可以用单片机生成二维码吗 有没有具体的实例
    发表于 10-27 08:05

    用Labview将二维数组保存至Excel

    #Labview用Labview将二维数组保存至Excel
    发表于 09-21 14:57 8次下载

    二维数组存储最小元素是怎么实现的?

    二维数组存储最小元素是怎么实现的?  在计算机编程中,数组是一种非常重要的数据结构之一。它用于存储一系列相同类型的变量,这些变量被放入单一的数组中并通过一个唯一的编号(称为
    的头像 发表于 09-13 11:17 285次阅读

    C语言—二维数组介绍

    定义一个两行三列的二维数组,总共有6个元素
    的头像 发表于 09-11 14:51 504次阅读
    C语言—<b class='flag-5'>二维</b><b class='flag-5'>数组</b>介绍

    OpenHarmony应用实现二维码扫码识别

    本文转载自《OpenHarmony应用实现二维码扫码识别》,作者zhushangyuan_ 概念介绍 二维码的应用场景非常广泛,在购物应用,消费者可以直接扫描商品二维码,浏览并购买产
    发表于 08-23 17:00

    verilog每日一练】reg型存储器应用(二维数组

    verilog将变量ram_in的数值赋值给ram的arraysize为1的单元
    发表于 08-23 14:08

    verilog每日一练】reg型存储器声明(二维数组

    声明一个位宽为8,深度为32的二维数组变量ram
    发表于 08-22 09:45

    labview如何将多次执行的二维数组拼接起来?

    想把循环分别为1、2、3执行后的结果拼接成1个2数组,纵向排列,最后的结果就是第1列是1-24,宽度是8的数组,将红框里的数据纵向拼接起来。 产生数组的方式是下面的框图,谁有好的思
    发表于 06-09 10:01

    使用VCS观察Verilog二维数组仿真值的方法

    FIR设计过程中,不可避免使用到reg/wire的二维数组
    的头像 发表于 06-06 11:12 2338次阅读
    使用VCS观察<b class='flag-5'>Verilog</b><b class='flag-5'>二维</b><b class='flag-5'>数组</b>仿真值的方法