VHDL语言基础
VHDL语言基础
1 数据对象
数据对象包括常量、变量、信号和文件四种类型
1.1 常量
常量是对某一常量名赋予一个固定的值,而且只能赋值一次。通常赋值在程序开始前进行,该值的数据类型则在声明语句中指明
--定义常量语句:
--Constant 常数名:数据类型:=表达式
Constant Vcc:real:=5.2; --指定Vcc的数据类型是实数,赋值为5.0V
Constant bus_width:integer:=8; --定义总线宽度为常数8
常量所赋的值应和定义的数据类型一致;
常量在程序包、实体、构造体或进程的说明性区域必须加以说明。定义程序包内的常量课提供所包含的任何实体、构造体所引用,定义在实体说明内的常量只能在该实体内可见,定义在进程说明内的常量只能在该实体内可见,定义在进程说明区域中的常量只能在该进程内可见
1.2 变量
变量只能在进程语句、函数语句和过程语句结构中使用。变量的赋值是直接的,非预设的。变量不能表达“连线”或储存原件,不能设置传输延迟量
--定义变量语句
--Variable 变量名:数据类型:=初始值;
Variable count:integer 0 to 255:=20; --定义count整数变量,变化范围0-255,初始值为20
--变量赋值语句
--目标变量名:=表达式;
x:=10.0; --实数变量赋值为10.0
Y:=1.5+x; --运算表达式赋值,表达式必须与目标变量的数据类型相同
A(3 to 6):=("1101") --位矢量赋值
1.3 信号
信号表示逻辑门的输入或输出,类似于连接线,也可以表达存储元件的状态。信号通常在构造体、程序包和实体中说明
--信号定义语句
--Signal 信号名:数据类型:=初始值
Signal clock:bit:='0'; --定义时钟信号,初始值为0
Signal count:BIT_VECTOR(3 DOWNTO 0); --定义count为4位位矢量
--信号赋值语句
目标信号名<=表达式;
x<=9;
Z<=x after 5 ns; --在5ns后将x的值赋给z
2 数据类型
2.1 VHDL的预定义数据类型
类型 | 定义 | 说明 |
---|---|---|
布尔(Boolean) | TYPE BOOLEAN IS (FALSE,TRUE); | 取值为FALSE和TRUE,不是数值,不能运算,一般用于关系运算符 |
位(Bit) | TYPE BIT IS ('0','1'); | 取值为0和1,用于逻辑运算 |
位矢量(Bit_Vector) | TYPE BIT_VECTOR IS ARRAY(Natural range<>) OF BIT; | 基于Bit类型的数组,用于逻辑运算 |
字符(Character) | TYPE CHARACTER IS (NUL,SOH,STX,...,'','!',...); | 通常用''引号引起来,区分大小写 |
字符串(String) | VARIABLE string_var:STRING(1 TO 7); string_var:="A B C D"; |
通常用""引起来,区分大小写 |
整数(Integer) | variable a:integer range -63 to 63 | 取值范围 -(\(2^{31}\) -1)~(\(2^{31}\)-1) 要求用RANGE子句为所定义的数限定范围,以便根据范围决定此信号或变量的二进制位数 |
实数(Real) | - | 取值范围-1.0E38~+1.0E38,仅可用于仿真不可综合 |
时间(Time) | - | 物理量数据,完整的包括整数和单位两个部分,用至少一个空格隔开,仅可用于仿真不可综合 |
错误等级(Severity Level) | TYPE severity_level IS (NOTE、WARNING、ERROR、FAILURE); | 表示系统状态,仅可用于仿真不可用于综合 |
2.2 IEEE预定义标准逻辑位与矢量
标准逻辑类型对数字逻辑电路的逻辑特性描述更加完整、真实,因此在VHDL程序中,对逻辑信号的定义通常采用标准逻辑类型
-
标准逻辑位(Std_Logic)
符号 说明 'U' Undefined(未初始化) 'X' Forcing Unknown(强未知) '0' Forcing 0(强0) '1' Forcing 1(强1) 'Z' High Impedance(高阻) 'W' Weak Unknown(弱未知) 'L' Weak 0(弱0) 'H' Weak 1(弱1) '-' Don't Care(忽略) -
标准逻辑位矢量(Std_Logic_Vector)
基于Std_Logic类型的数组
使用Std_Logic和Std_Logic_Vector要调用IEEE库中的Std_Logic_1164程序包;就综合而言,能够在数字器件中实现的是“-、0、1、Z”四种状态。在条件语句中,必须要全面考虑Std_Logic的所有可能取值情况,否则综合器可能会插入不希望的锁存器
2.3 用户自定义
TYPE 数据类型名 IS 数据类型定义 OF 基本数据类型
或
TYPE 数据类型名 IS 数据类型定义
数组:
type value_type is array (127 downto 0) of integer;
type matrix_type is array (0 to 15,0 to 31) of std_logic;
枚举:
type states is (idle,decision,read,write);
type boolean is(false,true);
type bit is ('0','1');
SUBTYPE 子类型名 IS 基本数据类型定义 RANGE 约束范围
subtype digit is integer range 0 to 9;
3 数据类型转换
VHDL为强定义类型语言,不同类型的数据不能进行运算和直接赋值
- 类型标记法
Variable A:integer; Variable B:real; A=integer(B); B=real(A);
- 函数法
Conv-integer(A); --由std_logic转换为integer类型,在std_logic_unsigned包
- 常数转化法/常量转换法
type conv_table is array(std_logic) of bit; Constant:conv_table=('0'|'L'=>'0','1'|'H'=>'1',others=>'0'); --具有转化表性质的常数 Signal a:bit; Signal b;std_logic; A<=table(b);
属性
属性提供的是关于信号、类型等的指定特性
- 'event:若属性对象有事件发生,则生成布尔值“true”,常用来检查时钟边沿是否有效
--上升沿 Clock'EVENT AND Clock-'1'
- 'range:生成一个限制性数组对象的范围
'range:"0 to n"; 'reverse_range:"n downto 0";
- 'left:生成数据类型或数据子类型的左边界
'right,'high,'low,'length
运算符
- 算数运算符:+,-,*,/,MOD,REM,SLL,SRL,SLA,SRA,ROL,ROR,**,ABS
- 关系运算符:=,/=,<,>,<=,>=
- 逻辑运算符:AND,OR,NAND,NOR,XNOR,NOT,XOR
- 赋值运算符:<=,:=
- 关联运算符:=>
- 其他运算符:+,-,&