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、unsigned、signed转换为std_logic_vector
conv_integer (x) std_logic_vector、unsigned、signed转换为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文章来源:https://www.toymoban.com/news/detail-464360.html
left表示数组的左边界;
right表示数组的右边界;
low表示数组的下边界;
high表示数组的上边界;
length表示数组的长度。文章来源地址https://www.toymoban.com/news/detail-464360.html
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中的信号来说,其实就是值改变。
到了这里,关于VHDL语法(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!