VHDL语法(二)

1,VHDL中可被赋值的对象

  VHDL中可以被赋值的对象有三种:signal,variable,constant。

  • signal即信号,它具有特定的物理意义,一般对应电路中特定的物理连线或存储单元。signal 在 architecture 语法声明与定义部分声明,在语句部分使用。声明语法如下:
signal <signal_name>:<type>:=<value>;	--有初始值
signal <signal_name>:<type>				--无初始值
//多个同类型信号的声明
signal <signal_name_list>:<type>;		--多个信号名之间用逗号隔开

  entity语法中port语法结构中的 in,out,buffer,inout 都是 signal 类型。library里的package语法中也可以声明signal。

  • variable 即变量,它不具有特定的物理含义,一般用来表示暂存某些值的载体。当要在程序中使用variable 变量,需要在 process 语法的敏感量列表与 begin 关键字之间声明一个 variable,然后就能在 process 的语句体中使用,声明语法如下:
variable<name>:<type>:=<value>; 	--有初始值
variable<name>:<type>;				--无初始值
//声明多个同类型变量
variable<variable_name_list>:<type>; -- 多个变量之间用逗号隔开

//function 和 procedure语法结构中也可以声明 variable.
  • constant 即常量,具有特定的物理意义,通常对应数字电路中的电源或地。constant能出现在所有 signal 和 variable 出现的场合中,声明语法如下:
constant <name>:<type>:=<value>;
//注:常量不能单独赋值,只能在声明的同时初始化

2,命名规则

  • 标识符中只能包含字符、数字和下划线;
  • 标识符必须以字符开头。

3,VHDL数据类型

  • std_logic:逻辑数据类型
signal a:std_logic;
a <= '1';
  • std_logic_vector:标准逻辑数组类型,也叫逻辑向量类型。
//定义3个位宽为3的数据
signal a,b,c:std_logic_vector(2 downto 0);
c <= a and b;

//逻辑向量的常数要用双引号括起来,并且逻辑向量的位宽必须大于1.
signal a:std_logic_vector(3 downto 0);
a <= B"1100";

//逻辑向量不支持十进制常数赋值,要用十进制常数对逻辑向量赋值,必须使用转换函数
a <= conv std_logic_vector(11,4);

//boolean 布尔代数类型,定义如下
type BOOLEAN is (FALSE,TRUE);

//bit 比特类型,也叫位类型
type BIT is('0','1');

//bit_vector 比特数组、位数组类型或比特向量。
type BIT_VECTOR is array (NATURAL range <>) of BIT;
  • 数值数据类型
    • integer 整数类型,一般用在entity中generic语法中定义的参数,for语句中的循环变量。但是integer不能按位访问。
    • real 实数类型,不常用;
    • signed & unsigned :有符号数和无符号数类型,一般直接用 std_logic_vector 替代。
  • 枚举数据类型 enum,一般用于状态机中的状态的定义,语法如下:
type <enum_type_name> is (<element1>,<other elements>);

//假如有两个状态机状态:idle  work
type myStateType is (idle,work);
signal stateBuf:myStateType;
myStateType <= work;
  • 数组数据类型array
//语法如下
type<array_type_name> is array(<index_range>) of <element_type>;

//定义一个共有8个元素的数组,且元素类型是32位逻辑向量
typearrayofVector32 is array(7 downto 0)of std_logic_vector(31 downto 0);
  • 记录数据类型record,定义如下
type <record_name is record
	<element_name>:<element_type>;
	<other elements>
end record;

type byteWord is record
	byte:std_logic_vector(7 downto 0);
	word:std_logic_vector(15 downto 0);
end record;
signal tmp:byteWord	

tmp.byte <=X"FO";
tmp,word<='1'&0"77007";
  • 子类型
    子类型的关键字是subtype,就是对已经存在的基本数据类型作一些范围限制,形成了新的一种数据类型。语法如下:
subtype <subtype_name is<type><range_definition>;

//例如,要定义一个大于或等于9小于或等于99的整数集合,可以这样描述:
subtypeingAnd99 is integer range 9 to 99;
  • 数据类型转换函数
conv_std_logic_vector(x,y)	integer、unsignedsigned转换为std_logic_vector

conv_integer (x)			std_logic_vector、unsignedsigned转换为integer

to_std_logic_vector(x)		bit_vector转换为std_logic_vector

to_bit_vector(x)			std_logic_vector转换为bit_vector

to_std_logic(x)				bit转换为std_1ogic

to_bit(x)					std_logic转换位bit
  • 数值类属性 :'left, 'right, 'low, 'high, 'length

    left表示数组的左边界;
    right表示数组的右边界;
    low表示数组的下边界;
    high表示数组的上边界;
    length表示数组的长度。

signal A:std_logic_vector(7 downto 0);
signal B:std_logic_vector(0 to 3);

A'left =7;A'right =0;A low =0;A high=7;A length=8;
B'left =0;B'right =3;B'low =0;B'high=3;B'length=4;
  • signal 属性 :'event属性是一个针对信号量的属性,它是附着在信号量上,而不是信号的类型上的。它
    的值为布尔型,如果刚好有事件发生在该属性所附着的信号上,则其取值为Ture,否则为False。有事件发生,对于FPGA中的信号来说,其实就是值改变。
  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值