[VHDL1]基本结构_命名规则_数据类型_运算符

程序基本结构,命名规则,数据类型,运算符

VHDL简介

  • VHDL: VHSIC(Very High Speed Integrated Circuit)Hardware Description Language
  • 于1982年,诞生于美国国防部赞助的VHSIC项目。1987年底,VHDL被IEEE和美国国防部确认为标准硬件描述语言 ,即IEEE std 1076-1987(简称87版)。 1993年和2000年,IEEE对VHDL进行了修订,公布了新版本的VHDL,即IEEE std 1076-1993(简称93版)和IEEE std 1076-2000。

VHDL程序的基本结构

  1. __ 库(Library)__:存放已经编译的实体、结构体、包集合和配置。
  2. 实体(Entity):描述所设计的系统的外部接口信号,定义电路设计中所有的输入和输出端口。
  3. 包集合(Package):存放各设计模块能共享的数据类型、常数和子程序等。
  4. 配置(Configuration):指定实体所对应的结构体。
  5. 结构体(Architecture):描述系统内部的结构和行为。
  • 一个简单的VHDL程序如下,下例描述了一个非门:
-- *********注释栏*********
-- NOT Gate Simulation
-- Filename:NOTGATE
-- *******所使用的库*******
Library   IEEE;
Use IEEE. std_logic_1164. all;
-- ********实体定义********
Entity notgate is
    port(
          A:in STD_LOGIC;
          F:out STD_LOGIC;
     );
End  notgate ;
-- ********结构体定义*******
Architecture  notgate _arch of notgate is
Begin
    F<= not  A
End notgate _arch 
  • 需要注意,对于VHDL的编译器和综合器来说,程序文字的大小写是不加区分的。
  • 程序中的注释使用双横线--
  • 若使用QuartusII软件,则要求源程序文件的名字与实体名、工程名必须一致。

库和程序包

  • VHDL的库和程序包的定义语法格式如下:
-- *******库的申明*******
-- ****LIBRARY  库名;****
LIBRARY IEEE;

-- *******USE用法1******
-- ***声明库内某个项目***
-- **USE 库名.程序包名.项目名; **
USE IEEE.STD_LOGIC_1164.STD_ULOGIC;

-- *******USE用法2******
-- ***声明库内所有项目***
-- **USE 库名.程序包名.ALL; **
USE IEEE.STD_LOGIC_1164.ALL;
  • 库的具体种类有:
  1. STD 库(默认库)
  2. IEEE库
  3. WORK库(默认库)
  4. 面向ASIC的库
  5. 用户定义库

实体(Entity)

  • 实体(Entity)的语法定义如下:
ENTITY  实体名  IS
        [GENERIC ( 类属表 );]
        [PORT ( 端口表 );]
        [实体说明部分;]
END  [ENTITY] [实体名];
  • 具体举例如下:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY black_box IS
    Generic (
        constant width : integer := 7
        );
    PORT(
    	clk, rst:  IN   std_logic;
    	d:	   IN 	    std_logic_vector(width DOWNTO 0);
    	q:	  OUT    std_logic_vector(width DOWNTO 0);
    	co:	  OUT    std_logic
    );
END black_box;

端口方向

  • 端口(PORT)的方向共有4种类型,分别如下:
  1. IN(输入):外部信号可进入实体内部,内部信号不能从该端口输出。
  2. OUT(输出):内部信号可以由该端口输出,外部信号不能从该端口输入。且该端口不能在实体内部反馈使用
  3. INOUT(双向):信号既可以输入到实体内部,也可从实体内部输出。可以用于内部反馈使用
  4. BUFFER(缓冲):信号可由实体内部对外输出,且可同时用于内部反馈使用

配置(Configuration)

  • 配置可以把特定的结构体关联到(指定给)一个确定的实体。
  • 配置语句的一般格式如下:
CONFIGURATION 配置名 OF 实体名 IS
   配置说明
END 配置名; 

结构体(Architecture)

  • 结构体,也称构造体,是用于描述设计实体的内部结构以及实体端口间的逻辑关系。
  • 结构体(Architecture)的语法定义如下:
ARCHITECTURE  结构体名 OF  实体名 IS
    -- **用于声明要用到的信号、数据类型、常数、子程序和元件等**
    [说明语句;]
BEGIN
    -- **用于具体描述结构体的功能和行为**
    [功能描述语句;]
END [ARCHITECTURE] [结构体名]
  • 以一个二选一选择器为例,举例如下:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY mux21a IS
PORT (a,b,s: IN   BIT;
          y: OUT  BIT
);
END mux21a;

-- **结构体**
ARCHITECTURE  one OF mux21a IS
BEGIN  
    P1:	PROCESS(a,b,s)
    	BEGIN
			if s=‘1’ then
				y<=a;
			else
				y<=b;
            end if;	
    END PROCESS P1;
END one; 

VHDL命名规则

标识符

  1. 有效的字符:包括26个大小写英文字母,数字0~9 以及下划线“_”。
  2. 任何标识符必须以英文字母开头。
  3. 必须是单一下划线“_”,且其前后都必须有英文字母或数字。
  4. 标识符中的英语字母不分大小写。
  5. 允许包含图形符号(如回车符、换行符等),也允许包含空格符。

下标名

  • 格式:标识符(表达式)
下例的两个下标名中一个是m,属不可计算,另一个是3,属可计算的。
SIGNAL  a, b : BIT_VECTOR (0 TO 3) ;
SIGNAL  m : INTEGER  RANGE 0 TO 3 ;
SIGNAL  y, z : BIT ;
y <= a(m) ;             -- 不可计算型下标表示
z <= b(3) ;              -- 可计算型下标表示

数字

  1. 整数:整数都是十进制的数,如:
5,  678,  0,  156E2(=15600),  45_234_287 (=45234287)
  1. 实数:实数也都是十进制的数,但必须带有小数点,如:
1.335,  88_670_551.453_909(=88670551.453909),  1.0,  44.99E-2(=0.4499)
  1. 以数制基数表示:用这种方式表示的数由五个部分组成。
SIGNAL d1,d2,d3,d4,d5, : INTEGER RANGE 0 TO 255;
d1 <= 10#170#;        -- (十进制表示,等于 170)
d2 <= 16#FE#;         -- (十六进制表示,等于 254)
d3 <= 2#1111_1110#;   -- (二进制表示,等于 254)
d4 <= 8#376#;         -- (八进制表示,等于 254)
d5 <= 16#E#E1;        -- (十六进制表示,等于2#1110000#,等于224)

字符串

  1. 文字字符串
"ERROR",  "Both S and Q equal to 1",  "X",  "BB$CC" 

  1. 数位字符串
    B:二进制基数符号,表示二进制位0或1,在字符串中的每位表示一个Bit。
    O:八进制基数符号,在字符串中的每一个数代表一个八进制数,即代表一个3位(BIT)的二进制数。
    X:十六进制基数符号(0~F),代表一个十六进制数,即一个4位的二进制数。
data1 <= B"1_1101_1110";          -- 二进制数数组,位矢数组长度是9
data2 <= O"15";                    -- 八进制数数组,位矢数组长度是6
data3 <= X"AD0";                   -- 十六进制数数组,位矢数组长度是12
data4 <= B"101_010_101_010";       -- 二进制数数组,位矢数组长度是12

数据对象

常量(CONSTANT)

  • 常量定义:
CONSTANT 常量名:数据类型:=初始值;
  1. 常量指在设计中不会变的值。如数字电路中的电源、地等常数。
  2. 可改善代码可读性,便于代码修改
  3. 必须在程序包、实体、构造体或进程的说明区域加以说明。
  4. 定义在程序包内的常量可供所含的任何实体、构造体所引用,定义在实体说明内的常量只能在该实体内可见,定义在进程说明性区域中的常量只能在该进程内可见。
  5. 一般要赋一初始值,而且只能赋值一次。
  6. 常量所赋的值应和定义的数据类型一致。举例如下:
CONSTANT Width : Integer := 8;
CONSTANT FBUS : BIT_VECTOR := "01011";
CONSTANT VCC : REAL := 5.0;
CONSTANT DELY : TIME := 25 ns;

变量(VARIABLE)

  • 变量定义:
VARIABLE 变量名:数据类型:=初始值;
  1. 变量代表暂存某些值的载体、
  2. 仅用于进程和子程序,且必须在进程和子程序的说明性区域说明。声明在进程内,作用范围为该进程。
  3. 变量的赋值是直接的,非预设的,分配给变量的值立即成为当前值,变量不能表达“连线”或存储元件,不能设置传输延迟量。
  4. :=来给变量赋值。举例如下:
VARIABLE  A : INTEGER;       --定义A为整型变量
VARIABLE  B,C : INTEGER:=2; --定义B和C为整型变量,初始值为2

信号(SIGNAL)

  • 信号定义:
SIGNAL  信号名: 数据类型:=初始值;
  1. 信号代表物理设计中的某一条硬件连接线,可代表连线、内连元件、或端口。
  2. 信号通常在构造体、程序包和实体中说明。声明在进程外,作用范围为全局。
  3. 用“<=”来给信号赋值
  4. 信号在Package、Entity、Architecture 中声明举例如下:
SIGNAL  S1: STD_LOGIC := '0';--定义了一个标准位的单值信号S1,初始值为低电平
SIGNAL  S2,S3: BIT;  	  --定义了两个为BIT的信号S2和S3
SIGNAL  S4:  STD_LOGIC_VECTOR(15 DOWNTO 0); --定义了一个标准位矢量(数组、总线)信号,共有16个信号元素

信号与变量区别

  1. 信号的声明在进程外,作用范围为全局。变量的声明在进程内,作用范围为该进程。
  2. 信号用于电路的内部连接,变量用于内部数据的交换
  3. 使用<=对信号进行赋值,赋值过程在进程结束时赋值,赋值有延迟
  4. 使用:=对变量进行赋值,赋值过程在执行到该语句时立即赋值,赋值无延迟。

数据类型

VHDL预定义数据类型

  1. 布尔(BOOLEAN)
    取值为FALSE和TRUE,不是数值,不能运算,一般用于关系运算符。
--TYPE BOOLEAN IS (FALSE, TRUE);  
  1. 位(BIT)
    取值为0和1,用于逻辑运算。
--TYPE BIT IS ('0' , '1');   
  1. 位矢量(BIT_VECTOR)
    基于Bit类型的数组,用于逻辑运算。
--TYPE BIT_VECTOR IS ARRAY (Natural range<>) OF BIT;  
SIGNAL a:Bit_Vector(0 TO 7);
SIGNAL b:Bit_Vector ( 7 DOWNTO 0) ;
  1. 字符(CHARACTER)
    通常用‘’引起来,区分大小写。
--TYPE CHARACTER IS (NUL, SOH, STX, …, ‘ ’, ‘!’, …);  
  1. 整数(INTEGER)
    取值范围 -(2312^{31}-1) ~(2312^{31}-1),可用32位有符号的二进制数表示,要求用RANGE子句为所定义的数限定范围,以便根据范围来决定表示此信号或变量的二进制数的位数。
VARIABLE a: integer range -63 to 63;
  1. 实数(REAL)
    取值范围 -1.0E38 ~+1.0E38,仅用于仿真,不可被综合。
  2. 字符串(STRING)数据类型
    通常用" "引起来,区分大小写。
VARIABLE string_var : STRING (0 TO 3);
string_var := "a b c d";
  1. 错误等级(Severity Level)
    表示系统状态,仅用于仿真不可综合。
TYPE severity_level IS (NOTE、WARNING、ERROR、FAILURE);
  1. . 时间(TIME)
    物理量数据,包括整数和单位两个部分,用至少一个空格隔开,仅用于仿真不可综合。
TYPE time IS RANGE -2147483647 TO 2147483647 
    units 
        fs ;                    -- 飞秒,VHDL中的最小时间单位 
        ps = 1000 fs ;          -- 皮秒
        ns = 1000 ps ;          -- 纳秒
        us = 1000 ns ;          -- 微秒
        ms = 1000 us ;          -- 毫秒
        sec = 1000 ms ;         -- 秒
        min = 60 sec ;          -- 分
        hr = 60 min ;           -- 时
end units ;
  1. 标准逻辑位(STD_LOGIC)
U: Uninitialized;
X: Forcing Unkown;     
0: Forcing 0 
1: Forcing 1               
Z: High Impedance        
W: Weak Unknown
L: Weak 0                   
H: Weak 1                   
-: Don’t care
  1. 标准逻辑矢量(STD_LOGIC_VECTOR)
    能够在数字器件中实现的是"-、0、1、Z"四种状态。在条件语句中,必须要全面考虑Std_Logic的所有可能取值情况,否则综合器可能会插入不希望的锁存器。
  2. 无符号型(UNSIGNED)
    十进制的8可以作如下表示:UNSIGNED'("1000")
  3. 有符号型(SIGNED)
    SIGNED'("0101") 代表 +5,5
    SIGNED'("1011") 代表 –5

用户自定义数据类型

  • VHDL允许用户自行定义新的数据类型,如枚举类型(ENUMERA-TION TYPE)、整数类型(INTEGER TYPE)、数组类型(ARRAY TYPE)、记录类型(RECORD TYPE)、时间类型(TIME TYPE)、实数类型(REAL TYPE)等。
  • 枚举类型举例:
TYPE M_STATE IS (STATE1,STATE2,STATE3,STATE4,STATE5); 
SIGNAL  CURRENT_STATE,NEXT_STATE:M_STATE;

数据类型转换

  • VHDL为强定义类型语言,不同类型的数据不能进行运算和直接赋值。
  1. 类型标记法
Variable A: integer;   Variable B: real;
A= integer (B);   B=real (A);
  1. 函数法
  • 在“STD_LOGIC_1164”、“STD_LOGIC_ARITH”和 “STD_LOGIC_UNSIGNED”的程序包中提供的数据类型变换函数。
Conv_interger (A);--由std_logic转换为integer型
  1. 常数/ 常量转换法
Type conv_table is array(std_logic) of bit;
Constant table: conv_table:=(‘0’|’L’=>’0’, ‘1’|’H’=>’1’, others=>’0’);
Signal a: bit; signal b: std_logic;
A<=table(b);        -- 将std_logic型转换为bit型

VHDL运算符

  • 算术运算符: +, -, *, /, MOD, REM ,SLL ,SRL ,SLA, SRA ,ROL ,ROR ,**,ABS
  • 关系运算符: =, /=,<, > , <=, >=
  • 逻辑运算符: AND,OR,NAND,NOR,XNOR,NOT,XOR
  • 赋值运算符: <=,:=
  • 关联运算法: =>
  • 其他运算符: +,-,&

算数运算符

运算符 功能 运算符 功能
+ SLL 逻辑左移
- SRL 逻辑右移
* SLA 算数左移
/ SRA 逻辑右移
** 乘方 ROL 循环逻辑左移
MOD 取模 ROR 循环逻辑右移
REM 取余 ABS 取绝对值

取模/取余

  • 取余运算(a REM b)的符号与__a__相同,其绝对值小于b的绝对值。如: (-5) REM 2=(-1), 5 REM 2=(1)
  • 取模运算(a MOD b)的符号与__b__相同,其绝对值小于b的绝对值。如: (-5) MOD 2=1, 5 MOD (- 2)=(-1)

移位操作符

  • 移位运算符的左边为一维数组,其类型必须是BIT或BOOLEAN,右边必须是整数移位次数为整数的绝对值。
运算符 功能描述
SLL 将位向量左移,右边移空位补零
SRL 将位向量右移,左边移空位补零
SLA 将位向量左移,右边第一位的数值保持原值不变
SRA 将位向量右移,左边第一位的数值保持原值不变
ROL 自循环左右移位
ROR 自循环左右移位

关系运算符

运算符 功能描述
= 等于
/= 不等于
< 小于
> 大于
<= 小于等于
>= 大于等于

逻辑运算符

运算符 功能描述
AND
OR
NAND 与非
NOR 或非
XOR 异或
XNOR 异或非
NOT

运算符优先级

运算符 功能描述
NOT, ABS, ** 最高优先级
*, /, MOD, REM
+(正号), -(负号)
+, -, &
SLL, SLA, SRL, SRA, ROL, ROR
=, /=, <, <=, >, >=
AND, OR, NAND, NOR, XOR, XNOR 最低优先级