vhdl用户自定义数据类型(全面了解VHDL的标识符)

VHDL和其他软件编程语言一样,也有严格的标识符、数据对象、数据类型定义,准确、熟练掌握基本的数据定义,对初学者是非常必要的,我来为大家科普一下关于vhdl用户自定义数据类型?以下内容希望对你有帮助!

vhdl用户自定义数据类型(全面了解VHDL的标识符)

vhdl用户自定义数据类型

VHDL和其他软件编程语言一样,也有严格的标识符、数据对象、数据类型定义,准确、熟练掌握基本的数据定义,对初学者是非常必要的。

基本标识符

基本标志符有:A~Z,a~z,0~9,以及下划线“_”。VHDL不区分大小写。标志符必须以字母开头,不能以下划线为结尾,不能出现连续的两个或多个下划线。以下是一些有效的基本标志符:DRIVE_BUS、addr_bus、decoder_38、RAM18。

数据对象

数据对象也可认为是数值的载体,共有3种形式的数据对象:常量(constant)、变量(variable)、信号(signal)。

1. 常量

常量是设计者给某一常数名赋予固定值的量,一旦赋值就不会发生变化。一般格式为:

constant 常数名:数据类型∶=表达式;

对常量赋值用“∶=”常量声明的例子如下:

constant width:integer∶=8; --常数名width,数据类型integer整数,赋值8 constant VCC:real∶=3.3; --常数名VCC,数据类型real实数,赋值3.3

2. 变量

变量是可以改变值的量,可以在进程和子程序中说明,可以是任意数据类型。变量的赋值是立即生效的。一般格式为:

variable 变量名:数据类型 ∶= 初始值或表达式;

对变量赋值用“∶=”表示。变量声明的示例如下:

variable temp:std_iogic∶='0'; --变量名temp,数据类型std_iogic标准逻辑位赋初始值0 variable a,b:bit_vector(0 to 7); --变量名a,b,数据类型bit_vector(0 to 7)是位矢量 b∶="10101010"; --位矢量赋值 a(3 to 6)∶=('1','1','0','1'); --段赋值 a(0 to 5)∶=b(2 to 7); a(7)∶='0'; --位赋值

3. 信号

信号是电子电路内部硬件连接的抽象,可以将结构体中分离的并行语句连接起来,并且能通过端口与其他的模块连接。可以随着时间改变值,不像变量赋值立即生效,允许产生延时。信号通常在实体、结构体和程序包中说明,但不能在进程中说明,只能在进程中使用。对信号赋值使用“<=”表示,允许产生延时,这和实际元件的传输延时特性吻合。

表3.2 标准数据类型

特别提示:常用的数据类型包括整数、实数、位、位矢量。整数可以用十进制、二进制、八进制、十六进制表示,例如,十进制125,用二进制写为2#11111111#,八进制写为8#377#,十六进制写为16#FF#。布尔量用于关系运算,如a>b成立,结果为真true。

2. 用户自定义的数据类型

VHDL允许用户自定义数据类型,一般书写格式为:

type 数据类型名 is 数据类型定义;

VHDL常用的用户自定义类型包括枚举类型、整数类型、数组类型、子类型等。

1)枚举类型

把数据类型中的各个元素都列举出来,方便、直观,提高了程序可阅读性。书写格式为:

type 数据类型名称 is(元素1,元素2,…);

其中,数据类型名称和元素都是标志符。例如:

type color is(blue,green,yellow,red);

数据类型名称是color,(元素1,元素2,…)是(blue,green,yellow,red)。枚举类型中所列举的元素在程序编译过程通常是自动编码,编码顺序是默认的,左边第一个元素编码为0,以后的依次加1。编码过程中自动将每一个元素转变成位矢量,位矢量的长度将由所列举元素的个数决定。如上例4个元素,位矢量的长度为2,编码默认值为blue="00"; green="01"; yellow="10"; red="11"。在信号定义时就可以使用这种数据类型,例如:

type color is(blue,green,yellow,red); signal p: color; --信号p是color数据类型

2)整数类型、实数类型

自定义的整数类型、实数类型是标准数据类型的整数、实数的子类型,是根据特殊需要自定义的数据类型,以便编译过程降低逻辑电路的复杂性和提高芯片资源的利用率。书写格式为:

type 数据类型名称 is integer range 整数范围; type 数据类型名称 is real range 实数范围;

例如:

type percent is integer range -100 to 100;

percent是数据类型名称,它的数据类型是integer整数,range 整数范围是-100~100。

type current is real range -1.5 to 3.0;

current是数据类型名称,它的数据类型是real实数,range 实数范围是-1.5~3.0。

3)数组(array)类型

数组是将相同类型的数据即数组元素集合在一起所形成的一个新的数据类型。数组类型分限定数组和非限定数组两种,书写格式为:

type 数组类型名 is array 范围 of 数组元素的数据类型; type数组类型名 is array(range <>)of数组元素的数据类型;

其中范围是用整数指明数组的上下界,是一个限定数组,例如:

type stb is array(7 downto 0)of bit; variable addend: stb; --变量addend定义为stb数组

stb是数组类型名。(7 downto 0)是数组的上下界,数组有8个元素,数组的下标排序是7、6、5、4、3、2、1、0,各元素的排序是stb(7)、stb(6)、stb(5)、stb(4)、stb(3)、stb(2)、stb(1)、stb(0),每一个元素的数据类型是bit。范围由“range <>”指定,这是一个没有范围限制的数组,是一个非限定数组。在这种情况下,具体范围由信号说明语句来确定。例如:

type bit_vector is array(integer range <>)of bit;

bit_vector是一个非限定数组,每一个元素的数据类型是bit。

variable my_vector:bit_vector(5 downt to -5);

变量my_vector定义为bit_vector数组,数组的下标排序是5、4、3、2、1、0、-1、-2、-3、-4、-5。

4)子类型

子类型说明语句就是对已经存在的基本数据类型作一些范围限制,便形成了一种新的数据类型。子类型subtype的语句格式如下所示:

subtype 子类型名 is 基本数据类型 range 约束范围

用子类型说明语句的好处在于编译过程中可以根据子类型的约束范围,有效地推知参与的寄存器的最合适的数目,节省芯片资源。例如:

Type nat is integer range 0 to 999; --自定义整数类型nat是整数,范围是0-999 subtype a_nat is nat ragne 0 to 255; --子类型a_nat是nat类型,范围是0-255

3. IEEE标准数据类型std-logic和std-logic-vector

在IEEE库的程序包std_logic_1164中定义了两个非常重要的数据类型,即标准逻辑位std-logic数据类型和标准逻辑矢量std-logic-vector数据类型。

std-logic定义了9种不同的值,增加了不定状态'X'、高阻状态'Z'。不定状态方便了系统仿真,高阻状态方便了双向总线的描述。

  • 'U'——初始值
  • 'X'——不定,未知
  • '0'——0
  • '1'——1
  • 'Z'——高阻
  • 'W'——弱信号不定,未知
  • 'L'——弱信号0
  • 'H'——弱信号1
  • '—'——不可能情况

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页