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

    文章

    1340

    浏览量

    109904
  • vhdl
    +关注

    关注

    30

    文章

    816

    浏览量

    128037
  • 数组
    +关注

    关注

    1

    文章

    412

    浏览量

    25873

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

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

收藏 人收藏

    评论

    相关推荐

    基于旋转平移解耦框架的视觉惯性初始化方法

    精确和鲁棒的初始化对于视觉惯性里程计(VIO)至关重要,因为不良的初始化会严重降低姿态精度。
    的头像 发表于 11-01 10:16 58次阅读
    基于旋转平移解耦框架的视觉惯性<b class='flag-5'>初始化</b><b class='flag-5'>方法</b>

    TMS320C6000 McBSP初始化

    电子发烧友网站提供《TMS320C6000 McBSP初始化.pdf》资料免费下载
    发表于 10-26 10:10 0次下载
    TMS320C6000 McBSP<b class='flag-5'>初始化</b>

    如何避免自动初始化组件被截断的情况?

    大小const数组用来占用这个区域,避免链接时将执行代码链接到此区域。 但编译的时候,链接脚本会把合适大小的执行代码填补0x08000000 ~ 0x08003FFF 区域,导致链接时把自动初始化组件给截断了。 请教各位大神,有没有解决
    发表于 09-13 08:06

    Keil变量不被初始化方法

    有些时候在我们的应用过程要求变量有连续性,或者现场保留,例如Bootloader跳转,某种原因的复位过程我们有些关键变量不能被初始化,在不同的编译环境下有不同的设置,本文就这个操作做总结,分别
    的头像 发表于 08-30 11:47 438次阅读
    Keil<b class='flag-5'>中</b>变量不被<b class='flag-5'>初始化</b><b class='flag-5'>方法</b>

    在一个.c文件定义一个数组遇到的疑问求解

    的时候没有指定数组的大小,只是做了初始化,而且这个初始化可以看到,而且自己可以定义初始化的值,并且初始化
    发表于 05-14 07:03

    深入探索KUKA KRL数组应用

    如果 CHAR 类型数组的所有数组元素都拥有相同的字符串,则不必单独初始化每个数组元素。忽略右侧的数组下标。(对于一维
    的头像 发表于 04-18 10:37 1061次阅读
    深入探索KUKA KRL<b class='flag-5'>中</b>的<b class='flag-5'>数组</b>应用

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

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

    MCU单片机GPIO初始化该按什么顺序配置?为什么初始化时有电平跳变?

    GPIO初始化时有时钟配置、模式配置、输出配置、复用配置,那么在编写初始化代码时,到底该按什么顺序执行呢?如果顺序不当那初始化过程可能会出现短暂的电平跳变。
    的头像 发表于 02-22 11:07 1369次阅读
    MCU单片机GPIO<b class='flag-5'>初始化</b>该按什么顺序配置?为什么<b class='flag-5'>初始化</b>时有电平跳变?

    labview运行后如何初始化

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

    自动初始化机制原理详解

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

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

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

    oracle sql 定义变量并赋值

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

    在ubuntu20.04如何初始化rosdep

    初始化rosdep 输入以下的命令,先对其初始化一下 sudo rosdep init 如果出现以下界面,那么恭喜你,你可以省下一些麻烦了,直接跳到第7步就行了: 如果出现了以下几种错误,也不要担心
    的头像 发表于 12-01 16:22 824次阅读
    在ubuntu20.04<b class='flag-5'>中</b>如何<b class='flag-5'>初始化</b>rosdep

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

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

    实战经验 | Keil、IAR、CubeIDE 变量不被初始化方法

    关键词:不被初始化,编译环境 目录预览 1、前言 2、IAR 实现变量不初始化方法 3、Keil 实现变量不被初始化方法 4、CubeIDE
    的头像 发表于 11-24 18:05 3676次阅读