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

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

3天内不再提示

VHDL和Verilog中数组定义、初始化、赋值方法

FPGA设计论坛 来源:FPGA设计论坛 作者:FPGA设计论坛 2022-09-23 14:20 次阅读

VHDL和Verilog数组的定义、初始化、赋值的方法不只一种,以下是本人常用的方法,可能不是最方便的,但是比较好理解,文中包含了源代码和modelsim仿真,供大家参考学习。

1. VHDL数组定义、初始化、赋值

1)VHDL数组定义方法:通过TYPE定义个matri_index的数组,数组包含50个数据,数据位数为16;申明了receive_data和send_data两个matri_index的数据。

--define a 16 bit array

constant

matrix_num:

integer := 49; TYPE

matrix_index is array (matrix_num downto 0) of std_logic_vector(15 downto 0);signal

receive_data, send_data:

matrix_index;signal

send_cnt:

STD_LOGIC_VECTOR(7 downto 0);

2)VHDL数组初始方法:实际应用里,通常需要在上电复位过程中对变量进行初始化,如果数组个数少时,直接赋初始值即可,但是数组个数多时,可以用循环实现赋值,通常的循环语句有FOR LOOP和WHILE LOOP。

(注意变量i申明的位置,需要在process内部,注意变量的赋值方式)

process(clk,reset_n)

--循环变量定义并初始化

variable i: integer := 0;

begin

if (reset_n = ‘0’)then

i := 0;

--利用while loop循环赋值

while(i《=matrix_num) loop

receive_data(i) 《=X“0000”;

i := i+1;

end loop;

elsif (rising_edge(clk)) then

--CONV_std_logic_vector(A,位宽)

将无符号的无符号整数转换为std_logic_vector

--CONV_INTEGER(A)

将std_logic_vector转换为整数

--直接赋值方式

send_cnt《= X“02”;

send_data(0) 《= X“0000”;

send_data(1) 《= X“0000”;

send_data(CONV_INTEGER(send_cnt)) 《= X“0000”;

end if;end process;

3)VHDL数组赋值

赋值语句分信号赋值语句和变量赋值语句两种。每一种都有下面三个基本组成部分:赋值目标:是所赋值的受体,它的基本元素只能是信号或变量。

赋值符号:是赋值符号只有两种。一种是信号赋值符号”《=”;另一种是变量赋值符号”:=”。赋值源:赋值源是赋值的主体,它可以是一个数值,也可以是一个逻辑或运算表达式。

可以直接赋值,如果变量为矢量时,需要将矢量转为整型。(不管三七二十一,建议程序中增加以下包,否则类型转换用不了)

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;--CONV_std_logic_vector(A,位宽)

将无符号的无符号整数转换为std_logic_vector--CONV_INTEGER(A)

将std_logic_vector转换为整数 --直接赋值方式

send_cnt《= X“02”;send_data(0) 《= X“0000”;send_data(1) 《= X“0000”; send_data(CONV_INTEGER(send_cnt)) 《= X“0000”;

4)VHDL数组test代码

LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all; --this is commentENTITY array_test IS PORT( reset_n

: IN STD_LOGIC;

clk

: IN STD_LOGIC );

END array_test; ARCHITECTURE behavioural OF array_test IS--define a 16 bit array

constant

matrix_num:

integer := 49; TYPE

matrix_index is array (matrix_num downto 0) of std_logic_vector(15 downto 0);signal

receive_data, send_data:

matrix_index;signal

send_cnt:

STD_LOGIC_VECTOR(7 downto 0);BEGIN process(clk,reset_n)

--循环变量定义并初始化

variable i: integer := 0;

begin

if (reset_n = ‘0’)then

i := 0;

--利用while loop循环赋值

while(i《=matrix_num) loop

receive_data(i) 《=X“0000”;

i := i+1;

end loop;

elsif (rising_edge(clk)) then

--CONV_std_logic_vector(A,位宽)

将无符号的无符号整数转换为std_logic_vector

--CONV_INTEGER(A)

将std_logic_vector转换为整数

--直接赋值方式

send_cnt《= X“02”;

send_data(0) 《= X“0000”;

send_data(1) 《= X“0000”;

send_data(CONV_INTEGER(send_cnt)) 《= X“0000”;

end if;end process; END behavioural;

5)modesim 仿真结果

19cb6500-3b04-11ed-9e49-dac502259ad0.png

2. Verilog数组定义、初始化、赋值

1)Verilog数组定义方法:reg[n-1 : 0]

定义了存储器中每个寄存器单元的大小,即存储单元是一个n位的寄存器;存储器后面的[m-1 : 0]则定义了该存储器中有多少个这样的寄存器。

reg[n-1 : 0] 存储器名 [m-1 : 0];或者 reg[n : 1] 存储器名 [m : 1];

//define a 16 bit array parameter wordsize = 16, memsize = 49;reg [wordsize-1 : 0] send_data[memsize-1 : 0], receive_data[memsize-1 : 0];integer i = 0;reg [7:0] send_cnt

;2)Verilog数组初始方法:实际应用里,通常需要在上电复位过程中对变量进行初始化,如果数组个数少时,直接赋初始值即可,但是数组个数多时,可以用循环实现赋值,通常的循环语句有FOR和WHILE。

(注意变量的赋值方式)

always@(posedge clk, reset_n)beginif(!reset_n) beginwhile(i 《=memsize)beginreceive_data[i] 《= 16‘h0000;i = i+1;

//阻塞赋值endendelse begin

//直接赋值方式send_cnt 《= 8’h02;send_data[0] 《= 16‘h0000;send_data[1] 《= 16’h0000;send_data[send_cnt] 《=16‘h0000;

//不需要类型转换endend

3)Verilog数组赋值不像VHDL那样,可以直接赋值。

//直接赋值方式send_cnt 《= 8’h02;send_data[0] 《= 16‘h0000;send_data[1] 《= 16’h0000;send_data[send_cnt] 《=16‘h0000;

//不需要类型转换

4)Verilog数组test代码

module verilog_test(clk,reset_n);inputclk;inputreset_n; // /////define a 16 bit array parameter wordsize = 16,

memsize = 49;reg [wordsize-1 : 0] send_data[memsize-1 : 0],

receive_data[memsize-1 : 0];integer i = 0;reg [7:0] send_cnt; always@(posedge clk, reset_n)beginif(!reset_n) beginwhile(i 《=memsize)beginreceive_data[i] 《= 16’h0000;i = i+1;

//非阻塞赋值endendelse begin

//直接赋值方式send_cnt 《= 8‘h02;send_data[0] 《= 16’h0000;send_data[1] 《= 16‘h0000;send_data[send_cnt] 《=16’h0000;

//不需要类型转换endendendmodule

5)modelsim仿真结果

1a079606-3b04-11ed-9e49-dac502259ad0.png

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1326

    浏览量

    109302
  • vhdl
    +关注

    关注

    30

    文章

    815

    浏览量

    127684
  • 数组
    +关注

    关注

    1

    文章

    409

    浏览量

    25595

原文标题:FPGA学习-VHDL和Verilog中数组定义、初始化、赋值方法

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

收藏 人收藏

    评论

    相关推荐

    在一个while的循环里面,怎么样可以通过控件去让其中的数组值全部初始化

    这种方式是让所有的数据都初始化了,我只需要部分数据初始化,就是所有的数组,大佬们求帮助!
    发表于 04-18 21:19

    STM32F103RC变量初始化问题求解

    Test0变量的值一直是0x03,并且无法被初始化其他值。 例如:ArryTest[7]的地址为0x20000200,Test0 的地址为0x2000020e,则Test0 的值无法被修改,一直为0x03. 有哪位朋友遇到过这样的问题没有?
    发表于 04-10 07:35

    字符型、指针型等变量等该如何初始化

     对于数值类型的变量往往初始化为0,但对于其他类型的变量,如字符型、指针型等变量等该如何初始化呢?
    的头像 发表于 03-18 11:02 208次阅读

    verilog同步和异步的区别 verilog阻塞赋值和非阻塞赋值的区别

    Verilog是一种硬件描述语言,用于设计和模拟数字电路。在Verilog中,同步和异步是用来描述数据传输和信号处理的两种不同方式,而阻塞赋值和非阻塞赋值是两种不同的
    的头像 发表于 02-22 15:33 369次阅读

    labview运行后如何初始化

    LabVIEW是一款强大的图形化编程软件,在运行之前通常需要进行一些初始化操作。本文将详细介绍LabVIEW运行前的初始化过程,并提供了一些常用的初始化方法。 创建新项目: 在LabV
    的头像 发表于 12-28 17:24 927次阅读

    例说Verilog HDL和VHDL区别

    VerilogVHDL之间的区别将在本文中通过示例进行详细说明。对优点和缺点的VerilogVHDL进行了讨论。
    的头像 发表于 12-20 09:03 658次阅读
    例说<b class='flag-5'>Verilog</b> HDL和<b class='flag-5'>VHDL</b>区别

    自动初始化机制原理详解

    自动初始化机制是指初始化函数不需要被显式调用,只需要在函数定义处通过宏定义的方式进行申明,就会在系统启动过程中被执行。这篇文章就来探索一下其中的奥秘, 简单理解其原理!
    的头像 发表于 12-16 09:33 398次阅读
    自动<b class='flag-5'>初始化</b>机制原理详解

    C语言编程时,各种类型的变量该如何初始化

    不同的方式。 1. 声明和赋值分开初始化: 这种方式将变量的声明与赋值分开,在声明时分配内存空间,再在后续代码中进行赋值。 ```c int number; // 声明时分配了内存空间
    的头像 发表于 12-07 13:53 582次阅读

    oracle sql 定义变量并赋值

    赋值可以通过使用PL/SQL语句块或使用SQL*Plus工具来实现。下面将详细介绍这两种方法以及它们的具体用法。 使用PL/SQL语句块定义赋值变量: 在Oracle SQL中,P
    的头像 发表于 12-06 10:46 734次阅读

    C语言中的数组格式与初始化

    多少存储空间。 数组格式与初始化     格式:   元素类型 数组名[元素个数];        比如:   int[3];       数组元素有顺序之分,每个元素都有一个唯一的下
    的头像 发表于 11-26 16:12 478次阅读
    C语言中的<b class='flag-5'>数组</b>格式与<b class='flag-5'>初始化</b>

    python如何定义二维空数组

    行和列的数量,并将它们初始化为0。然后,可以使用一个for循环来逐行创建一个空的一维列表,并使用另一个for循环来向空的二维列表中添加这些一维列表。 下面是一个示例代码,创建一个3行4列的空二维数组
    的头像 发表于 11-21 15:12 678次阅读

    关于ds1302的初始化问题

    用ds1302写时钟的过程,发现每一次上电后,时间都被赋了初值,每次上电ds1302都被被初始化,通过百度知道需要判断秒的第8位是否为1,来使得ds1302只初始化一次,从而实现掉电保持的功能,但是不成功,我不知道是不是代码的
    发表于 10-25 06:06

    Shell脚本程序开发-数组(四)

    数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组
    的头像 发表于 10-22 17:50 290次阅读
    Shell脚本程序开发-<b class='flag-5'>数组</b>(四)

    数组定义 什么是数组

    数组 数组是内置类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。 在初始化后长度是固定的,无法修改其长度。当作为方法的参数传入时将复制一份
    的头像 发表于 10-09 09:39 1337次阅读

    verilog/systemverilog中隐藏的初始化说明

    Verilog和SystemVerilog中经常需要在使用变量或者线网之前,期望变量和线网有对应的初始
    的头像 发表于 08-25 09:47 618次阅读
    <b class='flag-5'>verilog</b>/systemverilog中隐藏的<b class='flag-5'>初始化</b>说明