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
  • 赋值运算符:<=,:=
  • 关联运算符:=>
  • 其他运算符:+,-,&
posted @ 2020-04-16 19:36  maurrinho  阅读(1281)  评论(0编辑  收藏  举报