2、程序包的使用:
USE [库名.程序包名.项目名];
例如:USE IEEE. STD_LOGIC_1164. ALL; 3、常用的预定义程序包
STD_LOGIC_1164、STD_LOGIC_ARITH、STANDARD 三、实体说明
实体说明部分指定了设计单元的输入、输出端口或引脚,它是设计实体对外的一个通信界面,是一个器件的外部视图,是外界可以看到的部分。 一般格式:
ENTITY 实体名 IS
GENERIC(类属参数说明); PORT(端口说明); END 实体名; ?以“ENTITY 实体名 IS”开始,至“END实体名”结束。 1、类属参数说明: 在端口说明前,用于设置实体与外部电路间的静态参数,用来规定端口的大小、实体中子元件的数目等。
格式:GENERIC (参数名:数据类型:= 缺省值;
??
参数名:数据类型:= 缺省值); 2、端口说明:
用于描述实体和外部电路的接口信号,外部引脚信号的名称、数据类型和输入输出方向。
格式:PORT (端口名,端口名:端口方向 数据类型;
??
端口名,端口名:端口方向 数据类型); ? 端口名
设计者为接口取的名字。 ? 端口方向:
端口处的数据流动方式。
IN (输入端口):只允许信号流入端口,用于时钟输入、控制输入(装入、
复位、使能)、单向数据输入;
OUT (输出):只允许信号流出端口,用于不能反馈的输出; INOUT(输入输出双向端口):既可以输入,又可以输出;
BUFFER(缓冲端口):类似于输出端口,不同——可以用于输出信号到外
部,也可以用于端口信号的内部反馈。
LINKAGE:说明端口无指定方向,无论哪个方向的信号都可以连接。 ? 数据类型:
VHDL是一种强类型语言,需要对数据类型作明确的界定。提供10种数据类型,但端口描述中的数据类型一般只有两类:位(BIT)和位矢量类型(BIT_VECTOR)。若端口的数据类型定义为BIT,则其信号值是一个1位的二进制数,取值是0或1;若端口的数据类型定义为BIT_VECTOR,则其信号值是一组二进制数。 ?
3、例子
ENTITY comp IS
GENERIC(N : INTEGER := 8 );
PORT ( x, y : IN BIT_VECTOR ( 0 TO N-1); equal: OUT BIT); END comp; 四、结构体
结构体描述设计实体的逻辑结构和逻辑功能,是外界看不到的部分。每个实体可以有多个结构体,但同一结构体不能为不同的实体所共有。 格式:ARCHITECTURE 结构体名OF 实体名 IS 说明语句;
BEGIN
并行处理语句;
END 结构体名;?
? 说明语句
位于ARCHITECTURE 和BEGIN之间,对结构体内部的使用信号、常数、数据类型和函数进行说明。
例:ARCHITECTURE behav OF flips IS SIGNAL q : BIT;
BEGIN ??
END behav; ? 并行语句
位于BEGIN 与END之间,描述结构体的行为与连接关系。 并行执行,跟书写顺序无关
子结构描述:在规模较大的电路设计中,全部电路都用唯一的一个模块来描述是非常不方便的。为此,电路设计者总希望将整个电路分成若干个相对比较独立的模块来进行电路的描述。这样,一个结构体可以用几个子结构来构成。VHDL语言可以有以下三种形式的子结构描述语句:
进程(PROCESS) 模块(BLOCK)
子程序(SUBPROGRAM):过程(PROCEDURE)、函数(FUNCTION) 五、配置
描述层与层之间的连接关系以及实体与结构体之间的连接关系。设计者可以利用这种配置语句来选择不同的结构体,使其与要设计的实体相对应。
如果一个实体具有多个结构体,必须用配置语句进行说明,指定其中一个。 默认的配置方式:
CONFIGURATION 配置名 OF 实体名 IS FOR 所选结构体名 END FOR; END 配置名; 例:
CONFIGURATION my_config OF counter3 IS FOR my_arch
END FOR; END my_config;
第三节 VHDL的语言要素
一、语法规则 1、标识符
最常用的操作符,标识符的用法规定了VHDL书写符号的一般规则。可以是常数、变量、信号、端口、子程序或参数的名字。 1)短标识符 VHDL’87版
有效字符:英文字母、数字和下划线; 必须以英文字母开头;
下划线前后必须有英文字母或数字; 不能使用VHDL保留字;
不区分大小写:EDA= eda= Eda(一般保留字用大写,用户定义的符号小写)。 2)扩展标识符 VHDL’93版支持 用反斜杠来界定;
允许空格、图形符号; 可以用数字开头;
允许多个下划线相邻; 可以用保留字; 区分大小写;
\\te\\\\xe\\表示te\\xe;
注意:目前很多VHDL工具软件不支持扩展标识符。 2、数字 1)整数
十进制整数;如:012,12_3,2E3 前面可加0,中间不能加0;
相邻数字之间可插入下划线_,但不允许存在空格。 2)实数
十进制,但必须要有小数点,如1_2.0,2.5E2 3)以数制基数表示的数字
形式:基数#整数或者实数#E指数
2进制:2#11_11#,2#1011#E4,2#100.1111#E2 16进制:16#5A#,16#28_C#E4,16#22.8FF#E3 3、字符和字符串
字符:被单引号括起来的ASCII字符,数值、符号、字母。如'a'、'0'、'*'; 文字字符串:被双引号括起来的一串文字,如\、\!%\;
位矢量字符串:被双引号括起来的数字序列,其前冠以基数说明符(B、O、X);
B:在字符串中每一个位表示一个二进制数; O:在字符串中每一个数代表一个八进制数; X:在字符串中每一个数代表一个十六进制数;
如:B\,O\,X\; 4、下标名和下标段名
用于指示数组型变量或信号的某一元素或某几个元素,如a(3)、a(3 TO 5)。 5、其他 注释:‘--’,且只在该文本行有效; 分隔:‘;’为行分隔,VHDL的语句行可写在不同文本行中;
空格:除关键字、标识符自身中间不能插入空格外,其他地方可插入任意数目的空格。 二、数据对象
可以赋值的对象,在VHDL中,数据对象有三种:常量、变量和信号。前两种在计算机高级语言中都有相对应的,意义也类似。信号这一数据对象比较特殊,具有更多的硬件特征,是VHDL语言的特色之一。 1、常量
在VHDL程序中值一经定义,就不再发生变化的量。 常量在使用之前必须要进行说明,说明语句格式: CONSTANT 常量名:数据类型 := 表达式; ? 例:CONSTANT vcc : REAL := 5.0; CONSTANT delay: TIME := 10 ns;
* 常量赋值后不能变,赋的值要与数据类型一致;
* 常量的使用范围取决于它被定义的位置。在程序包中说明的常数为全局量;在实体说明部分的常数可以被该实体中任何结构体引用,在结构体中的常数能被其结构体内部任何语句采用,包括被进程语句采用;在进程说明中说明的常量只能在进程中使用。 2、变量
用做局部的数据存储 ? 说明语句的一般格式:
VARIABLE变量名:数据类型 [:= 初始值]; ? 例:VARIABLE x,y: INTEGER;
VARIABLE count: INTEGER RANGE 0 TO 255 := 10; * 局部量,只能在进程、函数或过程中使用。 * 赋值语句的一般格式 变量名:= 表达式;
例 x := 100.0; y := 1.5+x; 赋值立即生效,不能附加延时 3、信号
类似于电路内部的连接线,可以作为实体中语句模块间的信息交流通道。 说明语句的一般格式: ? SIGNAL信号名:数据类型 [:=初始值]; 例:SIGNAL ground: BIT : = '0';
SIGNAL en : STD_LOGIC_VECTOR(7 DOWNTO 0);
* 通常在结构体、程序包、实体中说明。全局信号在程序包中说明,它们被所有的实体分享。
* 赋值语句 信号名 <= 表达式 [AFTER 时间表达式]; 如:s1 <= s2 AFTER 10ns;
信号赋值可以有附加延迟:即s2经过10ns的延迟后,其值才赋值到s1中。 4、信号与变量的区别
? 信号是全局量,变量为局部量(只在进程、过程、函数中使用)。? ? 变量赋值立即发生,无延迟;信号赋值可以附加延时。 ? 变量赋值用“:=”,信号“<=”; 三、数据类型
VHDL是一种强类型语言,对数据对象的数据类型有严格的要求,要求是实体中的每一个常量、变量、信号等都必须具有确定的数据类型,只有相同数据类型的量才能相互传递和作用。
VHDL的数据类型包括两大类,一类是预定义数据类型,另一类是自定义数据类型。
1、预定义数据类型
是指已经在VHDL标准中预先定义的类型,可直接使用。STD库中的程序包STANDARD中定义,不必用USE语句说明。 a)整数类型(INTEGER)
范围:-(231-1)~(231-1)。
在使用整数时,VHDL综合器要求用RANGE子句为所定义的数限定范围,然后根据所限定的范围来决定表示此信号或变量的二进制数的位数,因为VHDL综合器无法综合未限定范围的整数类型的信号或变量。
如:SIGNAL tmp: INTEGER RANGE 0 TO 15; b) 自然数和正整数类型
都是整数的子类型
NATURAL:零和正整数 POSITIVE:正整数 c) 实数类型(REAL)
一般来讲,VHDL仿真器支持实数,而VHDL综合器不支持实数 d) 字符类型(CHARACTER)
单引号,如'A'。字符类型区分大小写。 e) 字符串类型(STRING)
双引号,如\f) 布尔类型(BOOLEAN)
常用来表示信号的状态,取值FALSE和TRUE两种。 不能进行算术运算,但可以进行关系运算。 g) 位类型(BIT)
取值为逻辑0、1,在程序中将值放在单引号中,'0'、'1'。 h) 位矢量型(BIT_VECTOR)
由逻辑0、1组成的矢量串,在程序中放在双引号中,例如\i) 时间型(TIME)
时间型数据常在仿真中用到,表示信号延时。
包含整数和单位两部分,特别要注意,整数和单位之间至少应留一个空格的位置。如1000 sec
j) 错误等级类型(SEVERITY LEVEL)
用于表示电子系统的工作状态,在仿真时给设计者提供电子系统的工作情况,分为NOTE、WARNING、ERROR、FAILURE四种状态 2、标准逻辑位类型、标准逻辑矢量类型
IEEE库、STD_LOGIC_1164中预定义的两种常用数据类型,使用时需要用