1.1 历史
1.2 产生原因
2 VHDL的基本结构
2.1 库和程序包
2.1.1 库
2.1.2 程序包
2.2
VHDL的全称为VHSIC硬件描述语言(VHSIC Hardware Description Language),VHSIC: Very High Speed Integrated Circuit
1980 – 美国国防部设立一个基金,在VHSIC项目之下开设了一个子课题,研究标准的硬件描述语言,1982诞生VHDL。
1987 – IEEE 将其修正为 IEEE 标准:1076
1993 – 修正了VHDL语言,升级至IEEE 1076-1993
为什么使用VHDL ?原理图图形化设计缺点?
答:
大型设计,原理图连接太复杂,检查错误太困难
通过使用高级语言对你的设计做描述,可以分析语法错误,综合后效率可能更高,时间成本更好。
VHDL的基本设计单元结构:程序包说明、实体说明、结构体说明三部分。
库是专门用于存放预先编译好的程序包的地方,对应一个文件目录,程序包的文件就放在此目录中,其功能相当于共享资源的仓库,所有已完成的设计资源只有存入某个“库”内才可以被其他实体共享。库的说明总是放在设计单元的最前面,表示该库资源对以下的设计单元开放。库语句格式如下:
常用的库有IEEE库、STD库和WORK库:
库的作用范围:
库说明语句的作用范围从一个实体说明开始到它所属的构造体、配置为止。当一个源程序中出现两个以上的实体时,两条作为使用库的说明语句应在每个实体说明语句前重复书写。
程序包是用VHDL语言编写的一段程序,可以供其他设计单元调用和共享,相当于公用的“工具箱”,各种数据类型、子程序等一旦放入了程序包,就成为共享的“工具”,类似于C语言的头文件,使用它可以减少代码的输入量,使程序结构清晰。在一个设计中,实体部分所定义的数据类型、常量和子程序可以在相应的结构体中使用,但在一个实体的声明部分和结构体部分中定义的数据类型、常量及子程序却不能被其他设计单元使用。因此,程序包的作用是可以使一组数据类型、常量和子程序能够被多个设计单元使用。
程序包分为包头和包体两部分。包头(也称程序包说明)是对包中使用的数据类型、元件、函数和子程序进行定义,其形式与实体定义类似。包体规定了程序包的实际功能,存放函数和过程的程序体,而且还允许建立内部的子程序、内部变量和数据类型。包头、包体均以关键字PACKAGE开头。程序包格式如下:
调用程序包的通用模式为:
常用预定义程序包有以下四个:
实体描述了设计单元的输入输出接口信号或引脚,是设计实体经封装后对外的一个通信界面。
注意:
类属说明的书写格式是:
其他
类属 GENERIC 参量是一种端口界面常数,常以一种说明的形式放在实体或块结构体前的说明部分。比较常见的情况是利用类属来动态规定一个实体的端口的大小,或设计实体的物理特性,或结构体中的总线宽度,或设计实体中底层中同种元件的例化数量等等。一般在结构体中,类属的应用与常数是一样的,其中的常数名是由设计者确定的类属常数名,数据类型通常取 INTEGER 或TIME 等类型,设定值即为常数名所代表的数值,但需注意 VHDL 综合器仅支持数据类型为整数的类属值。例如:
在这里 GENERIC 语句对实体 mcu1 作为地址总线的端口 add_bus 的数据类型和宽度作了定义 即定义 add_bus 为一个 16 位的标准位矢量 定义 addrwidth 的数据类型是整数INTEGER 其中 常数名addrwidth减 1 即为 15 所以这类似于将上例端口表写成PORT (add_bus : OUT STD_LOGIC_VECTOR (15 DOWNTO 0));
结构体的任务是:定义结构体中的各项内部使用元素,如数据类型(TYPE),常数(CONSTAND),信号(SIGNAL),元件(COMPONENT),过程(POCEDURE),变量(VARIABLE)和进程(PROCESS)等。通过VHDL语句描述实体所要求的具体行为和逻辑功能。描述各元件之间的连接。
结构化描述、数据流描述、行为描述、混合。
原件和内联,通过低级器件的内联实现。
特点:
描述数据在系统中的流动过程,数据流使用一系列的并发语句实现逻辑,数据流的描述是在控制逻辑函数已经获得的条件下实现,数据流代码亦称为并发代码。
注意:并发语句在编译中被同时评估,因此语句的顺序无关紧要。
特点:
举例:
顺序和并发语句,通过输入输出响应描述。
特点:
举例:
用行为描述方式设计的全加器
能被主程序反复调用并能将处理结果传送到主程序的程序模块,子程序分为过程语句(Procedure)和函数(Functure)两种。子程序中的参数说明是局部的,只能在子程序体内起作用。
标识符用来定义常数、变量、信号、端口、子程序或者参数的名字。由字母(A~Z, a~z)、数组(0~9)和下划线(_)字符组成。
关键字(keyboard)是VHDL中具有特别含义的单词,只能作为固定的用途,用户不能用其做为标识符。
为全局变量,在程序包说明、实体说明、结构体描述中使用,用于声明内部信号,而非外部信号(外部信号为IN、OUT、INOUT、BUFFER),其在元件之间起互联作用,可以赋值给外部信号。
定义格式:
赋值格式:
常在结构体中用赋值语句完成对信号赋初值的任务,因为综合器往往忽略信号声名时所赋的值。
只在给定的进程(process)中用于声明局部值或用于子程序中,变量的赋值符号为“:=”,和信号不同,信号是实际的,是内部的一个存储元件(SIGNAL)或者是外部输入(IN、OUT、INOUT、BUFFER),而变量是虚的,仅是为了书写方便而引入的一个名称,常用在实现某种算法的赋值语句当中。
定义格式:
变量赋值符号":=",变量赋值立刻更新。
在结构体描述、程序包说明、实体说明、过程说明、函数调用说明和进程说明中使用,在设计中描述某一规定类型的特定值不变,如利用它可设计不同模值的计数器,模值存于一常量中,对不同的设计,改变模值仅需改变此常量即可,就如上一章所说的参数化元件。
定义格式:
信号与变量最大的不同在于,如果在一个进程中多次为一个信号赋值,只有最后一个值会起作用,而当为变量赋值时,变量的值改变是立即发生的。
VHDL是一种强类型语言,对于每一个常数、变量、信号、函数及设定的各种参量的数据类型(DATA TYPES)都有严格要求,相同数据类型的变量才能互相传递和作用,标准定义的数据类型都在VHDL标准程序表STD中定义,实际使用中,不需要用USE语句以显式调用。
VHDL常用的数据类型有三种:
Type BOOLEAN IS (FALSE, TRUE);
取值为FALSE和TRUE,不是数值,不能运算,一般用于关系运算符
TYPE BIT IS (‘0‘, ‘1‘);
取值为0和1,用于逻辑运算
TYPE BIT_VECTOR IS ARRAY(Natural range<>) OF BIT;
基于Bit类型的数组,用于逻辑运算
SIGNAL a: Bit_Vector (0 to 7); Signal a: Bit_Vector (7 to 0);
TYPE CHARACTER IS (NUL, SOH, STX, ..., ‘‘, ‘!‘, ...);
通常用‘‘引号引起来,区分大小写
通常用""双引号引起来,区分大小写
VARIABLE string_var: STING (1 to 7);
string_var := "ABCD"
取值范围,可用32位的有符号的二进制数表示
VARIABLE a: INTEGER -63 to 63
在实际应用中,VHDL仿真器将ITEGER作为有符号数处理,而VHDL综合器将Integer作为无符号数处理
要求用range子句为所定义的数限定范围,以便根据范围来决定表示此信号或变量的二进制的位数。
实数类型仅能在VHDL仿真器中使用,综合器不支持
取值范围
物理量数据,包括整数和单位两个部分
时间类型仅能在VHDL仿真器中使用,综合器不支持
范围从
表达方法包含数字、(空格)单位两部分,如(10 PS)
常用单位:fs,ps,ns,us,ms,sec,min,hr
表示系统状态
该类型仅能在VHDL仿真器中使用,综合器不支持
TYPE severity_lever IS (NOTE, WARNING, ERROR, FAILURE)
STD_LOGIC
:工业标准的逻辑类型,取值为‘0’(强制为高)、‘1’(强制为低)、‘Z’(高阻态)、‘X’(强未知)、‘W’(弱未知;弱信号不定)、‘L’(弱0;弱低)、‘H’(弱1;若高)、‘-’(忽略;不关心)、‘U’(未初始化),只有前四种具有实际物理意义,其他的是为了与模拟环境相容才保留的。STD_LOGIC_VECTOR
:工业标准的逻辑类型集,STD_LOGIC的组合。TYPE 数据类型名 IS (枚举文字,枚举文字,. . . .)
TYPE 数据类型名 IS RANGE 约束范围;(如-10到+10)
TYPE 数据类型名 IS ARRAY(下限 TO 上限) OF 类型名称
关于运算符的分类暂不详究。。。
顺序语句和并行语句是VHDL程序设计中两大基本描述语句系列。顺序语句(Sequential Statements)用来实现模型的算法描述;并行语句(Concurrent Statements)用来表示各模型算法描述之间的连接关系,这些语句从多侧面完整地描述数字系统的硬件结构和基本逻辑功能,其中包括通信的方式、信号的赋值、多层次的元件例化以及系统行为等。
原文:https://www.cnblogs.com/uhanhi/p/13185337.html