《VHDL语言学习_计算机-嵌入式开发》由会员分享,可在线阅读,更多相关《VHDL语言学习_计算机-嵌入式开发(19页珍藏版)》请在金锄头文库上搜索。
1、VHDL 学习 (本学习以 MAXPLUS10 为工具软件) 第一章、 VHDL 程序的组成 一个完整的 VHDL 程序是以下五部分组成的: 库(LIBRARY ):储存预先已经写好的程序和数据的集合 程序包(PACKAGE ):声明在设计中将用到的常数、数据类型、元件及子程序 实体(ENTITY ):声明到其他实体或其他设计的接口,即定义本定义的输入输出端口 构造体(ARCHITECTUR ):定义实体的实现,电路的具体描述 配置(CONFIGURATION ):一个实体可以有多个构造体,可以通过配置来为实体选择其中一个构造体 1.1 库 库用于存放预先编译好的程序包(PACKAGE )和数
2、据集合体,可以用 USE 语句调用库中不同的程序包,以便不同的 VHDL 设计使用。 库调用的格式: LIRARY 库名 USE 库名.所要调用的程序包名.ALL 可以这样理解,库在硬盘上的存在形式是一个文件夹,比如库 IEEE,就是一个 IEEE 的文件夹, 可以打开 MAX PLUSR 安装源文件夹, 进入 VHDL93 的文件夹, 就可以看到一个 IEEE的文件夹,这就是 IEEE 库,而里面的文件就是一个个对程序包或是数据的描述文件,可以用文本打开来查看文件的内容。 例如在VHDL 程序里面经常可以看到“USE IEEE.STD_LOGIC_1164” , 可以这样解释这句话,本序里要
3、用到IEEE文件夹下程序包STD_LOGIC_1164 , 而STD_LOGIC_1164 是可以在IEEE文件夹的 STD1164.vhd 文件里面看到的,用文本打开 STD1164.vhd ,可以看到有一名为“IEEE.STD_LOGIC_1164”PAKAGE定义。 欢迎下载 2 简单的来说,库相当于文件夹,而程序包和数据就相当于文件夹里面的文件的内容(注意:不是相当于文件,因为程序包和数据都是在文件里面定义的,而文件名是和实体名相同的,可以说实体相当于文件)。 到了这里就可以考虑一个问题,“ 在安装 MAX PLUS 时有多少个库已经存在的呢” ,要得到这个问题的答案, 可以打开安装目
4、录下的“VHDL93”文件夹, 就可以看到里面有五个文件夹,分别是 ATERA、IEEE、LPM、STD、VITAL ,也就是说你看到了五个库,分别是 ATERA 功能库:增强型功能部件,即 IP 核,包括数字信号处理、通信、PCI 和其他总线接口、处理器和外设及外设的功能。 IEEE 库:由 IEEE(美国电子电机工程师学会)制定的标准库 LPM 库:参数可调模块库 STD 库:符合 VHDL 标准的库 VITAL 库:vhdl 上对 asic 提供高精确度及高效率的仿真模型库 调用库的表达有两种,一是显式表式,就是用 LIBRARY 和 USE 来调用库里面的程序包或数据,适用于那些不符合
5、 VHDL 标准的库调用,比如 IEEE 库;另一种是隐式表式,就是不用说明就自动调用的,适合于符合 VHDL 标准的库调用,比如 STD 库,不用写明调用就已经自动调用出来了。 除了上面所介绍的库外,还有用户自定义库及 WORK 库,WORK 库是用户的 VHDL 现行工作库,从上面的理解可知,WORK 库就是用户当前编辑文件所在的文件夹,文件夹里面的其他文件里面所描述包或数据的集合就是 WORK 库里面的包和数据的集合。 由于 WORK库自动满足 VHDL 标准,因此在就应用中不必以显式预先说明(比如 LIBRARY WORK 这样的定义是多余的)。 1.2 程序包 在 VHDL 中,常量
6、、数据类型与子程序可以在实体说明部分和结构体部分加以说明,且实体说明部分所定义的常量、 数据类型与子程序在相应的结构体中是可见的 (可以被使用的) ,但在一个实体的说明部分与结构体的部分对于其他实体的说明部分与结构部分是不可见的(注:实体相当于一个文件),程序包(PACKAGE )就是为了使一组常量说明、数据说明、据的集合程序包声明在设计中将用到的常数数据类型元件及子程序实体声明到其他实体或其他设计的接口即定义本定义的输入输出端口构造体定义实体的实现电路的具体描述配置一个实体可以有多个构造体可以通过配置来为实体选设计使用库调用的格式库名库名所要调用的程序包名可以这样理解库在硬盘上的存在形式是一
7、个文件夹比如库就是一个的文件夹可以打开安装源文件夹进入的文件夹就可以到一个的文件夹这就是库而里面的文件就是一个个对程序包到文件夹下程序包而是可以在文件夹的文件里面到的用文本打开可以到有一名为定义简单的来说库相当于文件夹而程序包和数据就相当于文件夹里面的文件的内容注意不是相当于文件因为程序包和数据都是在文件里面定义的而文件 欢迎下载 3 子程序说明和元件说明等内容对于多个设计实体都成为可见的而提供的一种结构, 可以这样理解一个实体(文件)里的 PACKAGE 对常量等的定义在其于的实体(文件)里是可以被使用的。 程序包由包头和包体构成,包头格式: PACKAGE 程序包名 IS 说明语句; EN
8、D 程序包名; 说明语句部分可为:USE 语句、类型定义、子程序声明(定义在包体)、常量定义、信号声明、元件声明等。 包体格式: PACKAGE BODY 程序包名 IS 说明语句; END 程序包名 说明部分用于子程序的定义, 注: 在包中对子程序的说明分为两部分, 子程序声明放在包头,子程序的定义在包体。 实体对于程序包不是自动可见(即不是自动就设为使用)的,为了使用程序包说明的内容就必须在实体的开始加上 USE 语句(即是要用 USE 来调用程序包里面所说明的东西),即使实体和程序包是在同一个文件里也要这样调用。 1.3 实体 实体(ENTITY )是 VHDL 设计中最其本的组成部分之
9、一(另一个是结构体),VHDL 表达的所有设计均与实体有关。 实体类似于原理图中的一个部件符号, 它并不描述设计的具体功能, 只是定义所需的全部输入/输出信号。 实体格式如下: 据的集合程序包声明在设计中将用到的常数数据类型元件及子程序实体声明到其他实体或其他设计的接口即定义本定义的输入输出端口构造体定义实体的实现电路的具体描述配置一个实体可以有多个构造体可以通过配置来为实体选设计使用库调用的格式库名库名所要调用的程序包名可以这样理解库在硬盘上的存在形式是一个文件夹比如库就是一个的文件夹可以打开安装源文件夹进入的文件夹就可以到一个的文件夹这就是库而里面的文件就是一个个对程序包到文件夹下程序包而
10、是可以在文件夹的文件里面到的用文本打开可以到有一名为定义简单的来说库相当于文件夹而程序包和数据就相当于文件夹里面的文件的内容注意不是相当于文件因为程序包和数据都是在文件里面定义的而文件 欢迎下载 4 ENTITY 实体名 IS GENERIC (常数名:数据类型:设定值) 类属说明 PORT 端口说明 (端口信号名 1: 模式 类型; 端口信号名 2: 模式 类型; 端口信号名 3: 模式 类型; 端口信号名 4: 模式 类型); TYPE 语句或常量定义 实体申明 并行语句 实体语句 END 实体名; 实体名:MAXPLUSII 要求实体名必须与 VHDL 文件名相同,否则编译会出错。 类属
11、参量:用于为设计实体和其外部环境通信的静态信息提供通道,可以定义端口的大小、实体中元件数目及实体的定时特性等等; 带有 GENERIC 的实体所定义的元件叫做参数化元件,即元件的规模或特性由 GENERIC 的常数决定,在 GENERIC 所定义的常数是可以在引用过程中修改的,因此利用 GENERIC 可以设计更加通用的元件,弹性地适应不同的应用。 端口信号名:端口信号名在实体之中必须是唯一的,信号名应是合法的标识符 端口模式:分别有 IN、OUT、INOUT 、BUFFER 和 LINKAGE ,这五种类型在后面的章节将介绍到。 端口类型: 常用的有 INTEGER、 STD_LOGIC 、
12、 STD_LOGIC_VECTOR , 有待后面章节介绍。 实体申明: 实体申明部分应放在端口说明的下面, 实体申明部分用于定义实体接口中的公共信息,例如可以用来定义新的数据类型和常量定义等。 实体语句:是每一设计实体接口的公共部分,实体语句只能由并行断言语句、并行过程调用语句和被动进程语句,注意,这些实体语句部分应该是被动语句,即在语句中不含有信号赋值语句。 据的集合程序包声明在设计中将用到的常数数据类型元件及子程序实体声明到其他实体或其他设计的接口即定义本定义的输入输出端口构造体定义实体的实现电路的具体描述配置一个实体可以有多个构造体可以通过配置来为实体选设计使用库调用的格式库名库名所要调
13、用的程序包名可以这样理解库在硬盘上的存在形式是一个文件夹比如库就是一个的文件夹可以打开安装源文件夹进入的文件夹就可以到一个的文件夹这就是库而里面的文件就是一个个对程序包到文件夹下程序包而是可以在文件夹的文件里面到的用文本打开可以到有一名为定义简单的来说库相当于文件夹而程序包和数据就相当于文件夹里面的文件的内容注意不是相当于文件因为程序包和数据都是在文件里面定义的而文件 欢迎下载 5 1.4 结构体 所有能被仿真的实体都由结构体(ARCHITECTURE )描述,即结构体描述实体的结构或行为,一个实体可以有多个结构体,每个结构体分别代表该实体功能的不同实现方案。 结构体格式: ARCHITECT
14、URE 结构体名 OF 实体名 IS 定义语句(元件例化); BEGIN 并行处理语句; END 结构体名; 结构体名是对本结构体的命名,它是该结构体的惟一名称,虽然可以由设计人员自由命名,但一般都将命名和对实体的描述结合起来, 结构体对实体描述有三种方式 (括号中为命名) : 1) 行为描述(BEHAVE):反映一个设计的功能和算法,一般使用进程 PROCESS ,用顺序语句表达; 2) 结构描述(STRUCT ):反映一个设计硬件方面的特征,表达了内部元件间连接关系,使用元件例化来描述; 3) 数据流描述(DATAFLOW ):反映一个设计中数据从输入到输出的流向,使用并行语句描述。 1.
15、5 配置 一个实体可以用多个结构体描述,具体综合时,选择哪一个结构体来综合,由配置来确定,仿真时用配置语句进行配置能节省大量时间。 配置格式: CONFIGURATION 配置名 OF 实体名 IS FOR 选配结构体名; END FOR; END CONFIGURATION ; 据的集合程序包声明在设计中将用到的常数数据类型元件及子程序实体声明到其他实体或其他设计的接口即定义本定义的输入输出端口构造体定义实体的实现电路的具体描述配置一个实体可以有多个构造体可以通过配置来为实体选设计使用库调用的格式库名库名所要调用的程序包名可以这样理解库在硬盘上的存在形式是一个文件夹比如库就是一个的文件夹可以
16、打开安装源文件夹进入的文件夹就可以到一个的文件夹这就是库而里面的文件就是一个个对程序包到文件夹下程序包而是可以在文件夹的文件里面到的用文本打开可以到有一名为定义简单的来说库相当于文件夹而程序包和数据就相当于文件夹里面的文件的内容注意不是相当于文件因为程序包和数据都是在文件里面定义的而文件 欢迎下载 6 第二章、 数据类型、算符、数据对象、属性 2.1 标识符 VHDL 标识符由大小写字母、数字和下划线构成,不区分大小写 2.2 数据对象 在逻辑综合中,VHDL 常用的数据对象有信号、变量及常量。 1) 信号 SIGNAL ,为全局变量,在程序包说明、实体说明、结构体描述中使用,用于声明内部信号
17、,而非外部信号(外部信号为 IN、OUT、INOUT 、BUFFER),其在元件之间起互联作用,可以赋值给外部信号。 定义格式: SIGNAL 信号名: 数据类型:=初始值; 赋值格式: 目标信号名=表达式 常在结构体中用赋值语句完成对信号赋初值的任务, 因为综合器往往忽略信号声名时所赋的值。 2) 变量(VARIABLE ),只在给定的进程中用于声明局部值或用于子程序中,变量的赋值符号为“ :=” ,和信号不同,信号是实际的,是内部的一个存储元件(SIGNAL )或者是外部输入(IN、OUT、INOUT 、BUFFER),而变量是虚的,仅是为了书写方便而引入的一个名称,常用在实现某种算法的赋
18、值语句当中。 定义格式: VARIABLE 变量名: 数据类型:=初始值 3) 常量,全局变量,在结构体描述、程序包说明、实体说明、过程说明、函数调用说明和进程说明中使用, 在设计中描述某一规定类型的特定值不变, 如利用它可设计不同模值的计数器,模值存于一常量中,对不同的设计,改变模值仅需改变此常量即可,就如上一章所说的参数化元件。 定义格式: CONSTANT 常数名:数据类型:=表达式; 据的集合程序包声明在设计中将用到的常数数据类型元件及子程序实体声明到其他实体或其他设计的接口即定义本定义的输入输出端口构造体定义实体的实现电路的具体描述配置一个实体可以有多个构造体可以通过配置来为实体选设
19、计使用库调用的格式库名库名所要调用的程序包名可以这样理解库在硬盘上的存在形式是一个文件夹比如库就是一个的文件夹可以打开安装源文件夹进入的文件夹就可以到一个的文件夹这就是库而里面的文件就是一个个对程序包到文件夹下程序包而是可以在文件夹的文件里面到的用文本打开可以到有一名为定义简单的来说库相当于文件夹而程序包和数据就相当于文件夹里面的文件的内容注意不是相当于文件因为程序包和数据都是在文件里面定义的而文件 欢迎下载 7 4) 信号和变量最大的不同在于,如果在一个进程中多次为一个信号赋值,只有最后一个值会起作用,而当为变量赋值时,变量的值改变是立即发生的。 2.3 数据类型 VHDL 是一种强类型语言
20、,对于每一个常数、变量、信号、函数及设定的各种参量的数据类型(DATA TYPES )都有严格要求,相同数据类型的变量才能互相传递和作用,标准定义的数据类型都在 VHDL 标准程序表 STD 中定义,实际使用中,不需要用 USE 语句以显式调用。 VHDL 常用的数据类型有三种:标准定义的数据类型、IEEE 预定义标准逻辑位与矢量及用户自定义的数据类型。 1) 标准定义的数据类型 Boolean 布尔量:取值为 FALSE 和 TRUE CHARACTER 字符:字符在编程时用单引号括起来,如A STRING 字符串:双引号括起来,如“ADFBD” INTEGER 整数:整数范围从- (231
21、-1)到(231-1); REAL 实数:实数类型仅能在 VHDL 仿真器中使用,综合器不支持 BIT 位:取值为 0 或 1; TIME 时间:范围从- (231-1)到(231-1),表达方法包含数字、(空格)单位两部分,如(10 PS); BIT_VECTOR 位矢量:其于 BIT 数据的数组,使用矢量必须注明宽度,即数组中的元素个数和排列,如 SIGNAL A : BIT_VECTOR (7 DOWNTO 0 ) NATUREAL 自然数:整数的一个 POSITIVE 正整数: SEVRITY LEVEL 错误等级:在 VHDL 仿真器中,错误等级用来设计系统的工作状态,共有四种可能的
22、状态值:NOTE,WARNING ,ERROR 和 FAILURE 2) IEEE 预定义的标准逻辑位与矢量 STD_LOGIC: :工业标准的逻辑类型,取值为0、1、Z、X(强未知)、W(弱未知)、L(弱 0)、H(弱 1)、(忽略)、U(未初始化),只有前四种具有实际物理意义,其他的是为了与模拟环境相容才保留的。 据的集合程序包声明在设计中将用到的常数数据类型元件及子程序实体声明到其他实体或其他设计的接口即定义本定义的输入输出端口构造体定义实体的实现电路的具体描述配置一个实体可以有多个构造体可以通过配置来为实体选设计使用库调用的格式库名库名所要调用的程序包名可以这样理解库在硬盘上的存在形式
23、是一个文件夹比如库就是一个的文件夹可以打开安装源文件夹进入的文件夹就可以到一个的文件夹这就是库而里面的文件就是一个个对程序包到文件夹下程序包而是可以在文件夹的文件里面到的用文本打开可以到有一名为定义简单的来说库相当于文件夹而程序包和数据就相当于文件夹里面的文件的内容注意不是相当于文件因为程序包和数据都是在文件里面定义的而文件 欢迎下载 8 STD_LOGIC_VECTOR: 工业标准的逻辑类型集,STD_LOGIC 的组合。 3) 用户自定义的数据类型 有四种,分别是枚举类型、整数类型和实数类型、数组类型、记录类型 枚举类型: TYPE 数据类型名 IS (枚举文字,枚举文字,. . . .)
24、 整数类型与实数类型是标准包中预定义的整数类型的子集, 由于综合器无法综合未限定范围的整数类型的信号或变量, 故一定要用 RANGE 子句为所定义整数范围限定范围以使综合器能决定信号或变量的二进制的位数。 格式: TYPE 数据类型名 IS RANGE 约束范围; (如-10到+10) 数组类型: TYPE 数据类型名 IS ARRAY (下限 TO 上限) OF 类型名称 记录类型: TYPE 记录类型名 IS RECODE 元素名: 数据类型名; 元素名: 数据类型名; 。 END RECODE 2.4 运算符 VHDL 为构造计算数值的表达式提供了许多预定义运算符,可分为四种类型:算术运
25、算符,关系运算符,逻辑运算符与连接运算符。 算术运算符:+、- 、*、/、*、MOD 、REM、ABS 关系运算符:=、/=、= 逻辑运算符:AND、OR、NOT、NAND 、NOR、XOR、NOR 连接运算符:&,将多个对象或矢量连接成维数更大的矢量 2.5 VHDL 属性 据的集合程序包声明在设计中将用到的常数数据类型元件及子程序实体声明到其他实体或其他设计的接口即定义本定义的输入输出端口构造体定义实体的实现电路的具体描述配置一个实体可以有多个构造体可以通过配置来为实体选设计使用库调用的格式库名库名所要调用的程序包名可以这样理解库在硬盘上的存在形式是一个文件夹比如库就是一个的文件夹可以打开
26、安装源文件夹进入的文件夹就可以到一个的文件夹这就是库而里面的文件就是一个个对程序包到文件夹下程序包而是可以在文件夹的文件里面到的用文本打开可以到有一名为定义简单的来说库相当于文件夹而程序包和数据就相当于文件夹里面的文件的内容注意不是相当于文件因为程序包和数据都是在文件里面定义的而文件 欢迎下载 9 属性是关于实体、结构体、类型及信号的一些特征,有些属性对于综合非常有用,其一般形式均为: 对象 属性。 1) 数值类属性 用于返回数组、块或一般数据的有关值 一般数据的数值属性:LEFT,RIGHT,LOW,HIGH 数组的数值属性:LENGH 块的数值属性:BEHAVIOR ,不含有元件 COMP
27、ONENT 例化信息时返回 TRUE;STRUCTURE 含有元件实例化或有被动进程时,则返回 TURE。 (注:被动进程定义是在进程定义中没有代入语句) 2) 函数类属性 以函数的形式,使设计人员得到有关数据类型、数组、信号的某些信息。 数据类型属性函数:POS(X)得到输入 X 值的位置序号、VAL(x)得到输入位置序号的X 值,SUSS (x),PRED(x),LEFTOF(x),RIGHTOF(x) 数组属性函数:LEFT(n),RIGHT(n),HIGH(n),LOW(n) 3) 数据类型属性,这类属性类函数仅一个,即 BASE 4) 数据区间类的属性,RANGE (N)和 REVE
28、RS_RANGE (N) 用户自定义的属性,格式 ATTRIBUTE 属性名 OF 目标名:目标集合 IS 表达式以函数的形式,使设计人员得到有关数据类型、 第三章、 顺序语句与并行语句 顺序语句和并行语句是程序设计中两大基本描述语句系列。 .1 顺序语句 顺序语句的特点从仿真的角度来看是每一条语句的执行按书写顺序进行, 顺序语句只能出现在块语句、进程和子程序内部,顺序控制方式有两种,一是条件控制(IF 和 CASE 语句),一是迭代控制(LOOP 语句和 ASSERT 语句),有 10 种基本类型 ) 赋值语句 赋值语句分为变量赋值和信号赋值,它们的赋值是有区别的。 首先在格式上, 变量赋值
29、格式为“ 变量名: =表达式” , 而信号的赋值格式为“ 信号名=表达式” ; 据的集合程序包声明在设计中将用到的常数数据类型元件及子程序实体声明到其他实体或其他设计的接口即定义本定义的输入输出端口构造体定义实体的实现电路的具体描述配置一个实体可以有多个构造体可以通过配置来为实体选设计使用库调用的格式库名库名所要调用的程序包名可以这样理解库在硬盘上的存在形式是一个文件夹比如库就是一个的文件夹可以打开安装源文件夹进入的文件夹就可以到一个的文件夹这就是库而里面的文件就是一个个对程序包到文件夹下程序包而是可以在文件夹的文件里面到的用文本打开可以到有一名为定义简单的来说库相当于文件夹而程序包和数据就相
30、当于文件夹里面的文件的内容注意不是相当于文件因为程序包和数据都是在文件里面定义的而文件 欢迎下载 10 其次体现在所用的地方, 变量说明和使用都只能在顺序语句中 (进程、 函数、 过程和块模块) ,而信号的说明只能在同步语句中,但可以在顺序语句和同步语句中使用; 再次体现在赋值过程, 变量的赋值是立即的, 而信号的赋值的执行和信号值的更新至少要延时 DELTA 延时,只有延时后信号才能得到新值,否则将保持原值,在进程中,信号赋值在结束时起作用。 ) WAIT 语句 WAIT 语句属于敏感信号激励信号,一个进程语句含有敏感信号时,进程中不能出现 WAIT等待语句;当进程语句不含有敏感信号时,进程
31、语句必须含有其他形态的敏感信号激励。WAIT 语句有五种形式: WAIT 无限等待; WAIT ON (敏感信号 1,敏感信号 2,敏感信号 N) 敏感信号变化,表中的信号产生变化时才往下运行; WAIT UNTIL 布尔表达式 为 TRUE 时,进程启动,为 FARLSE 是等待 WAIT FOR 时间表达式 到时进程才会启动 WAIT UNTIL 布尔表达式 ON (敏感信号 1,敏感信号 2,敏感信号 N) FOR 时间表达式 多条件等待语句,注意在多条件等待语句的表达式中,至少应有一个信号量,因为处于等待进程中的变量是不可改变的。 ) IF 语句 这种语句在其他编程语言也有,不用多讲,
32、其完整的书写格式 IF 标号: IF THEN ; ELSIF THEN ; . ELSE ; END IF IF 标号 据的集合程序包声明在设计中将用到的常数数据类型元件及子程序实体声明到其他实体或其他设计的接口即定义本定义的输入输出端口构造体定义实体的实现电路的具体描述配置一个实体可以有多个构造体可以通过配置来为实体选设计使用库调用的格式库名库名所要调用的程序包名可以这样理解库在硬盘上的存在形式是一个文件夹比如库就是一个的文件夹可以打开安装源文件夹进入的文件夹就可以到一个的文件夹这就是库而里面的文件就是一个个对程序包到文件夹下程序包而是可以在文件夹的文件里面到的用文本打开可以到有一名为定义
33、简单的来说库相当于文件夹而程序包和数据就相当于文件夹里面的文件的内容注意不是相当于文件因为程序包和数据都是在文件里面定义的而文件 欢迎下载 11 ) CASE 语句 CASE 语句是另一种形式的流程控制语句,可读性比 IF 的强,格式如下 CASE 条件表达式 IS WHEN 条件取值 =顺序处理语句; WHEN 条件取值 =顺序处理语句; WHEN 条件取值 =顺序处理语句; WHEN OTHERS = 顺序处理语句; END CASE ; 上面的条件取值有三种格式可选 条件表达式取值 条件表达式取值|条件表达式取值|条件表达式取值| 条件表达式取值 TO 条件表达式取值 ) LOOP 循环
34、语句 LOOP 语句与其他高级编程语言中的循环语句一样,可以使程序进行有规律的循环,循环的次数受迭代算法的控制,一个 LOOP 语句可包含要重复执行的一组顺序语句,它可以执行多次或是零次。 LOOP 格式 LOOP 标号: 重复模式LOOP 顺序处理语句; END LOOP LOOP 标号; 重复模式有两种,FOR 模式和 WHILE 模式。 FOR 模式的 LOOP 语句格式: LOOP 标号: FOR 循环变量 IN 离散范围 LOOP 顺序处理语句; END LOOP LOOP 标号; WHILE 模式的 LOOP 语句格式: LOOP 标号: WHILE条件LOOP 据的集合程序包声明
35、在设计中将用到的常数数据类型元件及子程序实体声明到其他实体或其他设计的接口即定义本定义的输入输出端口构造体定义实体的实现电路的具体描述配置一个实体可以有多个构造体可以通过配置来为实体选设计使用库调用的格式库名库名所要调用的程序包名可以这样理解库在硬盘上的存在形式是一个文件夹比如库就是一个的文件夹可以打开安装源文件夹进入的文件夹就可以到一个的文件夹这就是库而里面的文件就是一个个对程序包到文件夹下程序包而是可以在文件夹的文件里面到的用文本打开可以到有一名为定义简单的来说库相当于文件夹而程序包和数据就相当于文件夹里面的文件的内容注意不是相当于文件因为程序包和数据都是在文件里面定义的而文件 欢迎下载
36、12 顺序处理语句; END LOOPLOOP 标号; ) NEXT 和 EXIT 语句 这两种语句都是用于跳出 LOOP 循环的,NEXT 语句是用来跳出本次循环的,而 EXIT 语句是用于跳出全部循环的。 格式 NEXT 或 EXIT LOOP 标号 WHEN 条件 ) NULL 空操作语句,书写格式为“NULL ;” ,唯一的作用是使程序流程运行到下一个语句,常用于 CASE 语句当中 ) RETURN 语句 用在一段子程序结束后,用来返回到主程序的控制语句,一般情况之下,有两种书写格式,分别是 RETURN; 只能用于进程返回 RETURN 表达式;只能用于函数返回 在实际的应用中,一
37、般的 VHDL 综合工具要求函数中只能包含一个 RETURN,并规定这条RETURN 语句只能写在函数末尾, 但一些 VHDL 综合工具允许函数中出现多个 RETURN 语句。 ) ASSERT 断言语句 主要用于程序仿真、调试中的人机对话,它可以给出一个文字串作为警告和错误信息,基本书写格式如下: ASSERT 条件 REPORT输出信号 字符串 SEVERITY 错误级别;有四种 NOTE、WARNING 、ERROR 和 FAILURE 如果程序在仿真或调试过程中出现问题, 断方语句就会给出一个文字串作为提示信息, 当程序执行到断言语句时,就会对 ASSERT 条件表达式进行判断,如果返
38、回值为 TRUE 则断言据的集合程序包声明在设计中将用到的常数数据类型元件及子程序实体声明到其他实体或其他设计的接口即定义本定义的输入输出端口构造体定义实体的实现电路的具体描述配置一个实体可以有多个构造体可以通过配置来为实体选设计使用库调用的格式库名库名所要调用的程序包名可以这样理解库在硬盘上的存在形式是一个文件夹比如库就是一个的文件夹可以打开安装源文件夹进入的文件夹就可以到一个的文件夹这就是库而里面的文件就是一个个对程序包到文件夹下程序包而是可以在文件夹的文件里面到的用文本打开可以到有一名为定义简单的来说库相当于文件夹而程序包和数据就相当于文件夹里面的文件的内容注意不是相当于文件因为程序包和
39、数据都是在文件里面定义的而文件 欢迎下载 13 语句不做任何操作,程序向下执行,如果返回值为 FALSE,则输出指定的提示信息和出错级别。 断言语句可以分为顺序断言语句和并行断言语句。 ) REPORT 语句 报告语句是 93 版 VHDL 标准提供的一种新的顺序语句,该语句没有增加任何功能,只是提供了某些形式的顺序断言语句的短格式,也算是 ASSERT 语句的一个精简,格式如下: REPORT 输出信息SEVERITY 出错级别 .2 并行语句 并行语句在结构体中的执行都是同时进行的, 即它们的执行顺序与语句的书写无关, 这种并行性是由硬件本身并行性决定的, 即一旦电路接通电路, 它的各部分
40、就会按照事先设计好的方案同时工作,VHDL 有六种并行语句 ) 并行信号赋值语句 信号赋值语句相当于一个进程(用于单个信号赋值)的简化形式,用在结构体中并行执行,信号赋值语句提供了三种赋值方式,用来代替进程可令程序代码大大简化。 注:这里要注意,信号赋值语句在顺序语句里面也有,顺序语句里可以给信号赋值也可以给变量赋值,而顺序语句里只能对变量说明,不能对信号说明;并行语句刚好相反。 思考:什么变量不能在并行语句里面说明呢?为什么信号不能在顺序语句里面说明呢?因为信号是全局的,变量是局部的,用来保存中间变量的 赋值方式一 并发信号赋值语句,格式“ 信号名=表达式” ,等效于进程语句,表达式中的信号
41、就是进程语句中的敏感激励信号(注:进程必须含有敏感激励信号,请看下面章节介绍) 赋值方式二 条件信号赋值语句,格式如下 目标信号=表达式 1 WHEN 条件 1 ELSE 表达式 2 WHEN 条件 2 ELSE 据的集合程序包声明在设计中将用到的常数数据类型元件及子程序实体声明到其他实体或其他设计的接口即定义本定义的输入输出端口构造体定义实体的实现电路的具体描述配置一个实体可以有多个构造体可以通过配置来为实体选设计使用库调用的格式库名库名所要调用的程序包名可以这样理解库在硬盘上的存在形式是一个文件夹比如库就是一个的文件夹可以打开安装源文件夹进入的文件夹就可以到一个的文件夹这就是库而里面的文件
42、就是一个个对程序包到文件夹下程序包而是可以在文件夹的文件里面到的用文本打开可以到有一名为定义简单的来说库相当于文件夹而程序包和数据就相当于文件夹里面的文件的内容注意不是相当于文件因为程序包和数据都是在文件里面定义的而文件 欢迎下载 14 表达式 3 WHEN 条件 3 ELSE 表达式 4 注:条件赋值语句与 IF 语句不同之处 1、 以上条件赋值语句不能进行嵌套,而 IF 是可以的 2、 由于条件信号赋值语句是并行语句,必须用在结构体中的进程之外(进程是用顺序语句来编写的),而 IF 是顺序语句 3、 条件信号赋值语句 ELSE 是必须有的,而 IF 可没有 4、 条件信号赋值语句与实际的硬
43、件电路十分接近, 因此使用该语句要求设计人员具有硬件电路知识,而 IF 一般用来进行硬件电路的高级描述,它不要求太多的硬件电路知识。 5、 一般情况下很少用条件赋值语句,只有当用进程语句、IF 语句和 CASE 语句难以对路进行描述时才用 赋值方式三 选择信号赋值语句,格式如下 WITH 选择条件表达式 SELECT 目标信号=信号表达式 1 WITH 选择条件 1 信号表达式 2 WITH 选择条件 2 信号表达式 3 WITH 选择条件 3 信号表达式 4 WITH OTHERS 注:选择信号赋值语句是一种并行语句,不能在结构体中的进程内部使用 ) 块语句 在 VHDL 语言设计中,块语句
44、常常用来对比较复杂的结构体作结构化描述,格式如下 块标号: BLOCK 卫式表达式 类属子句; 端口子句; 块说明部分; BEGIN 据的集合程序包声明在设计中将用到的常数数据类型元件及子程序实体声明到其他实体或其他设计的接口即定义本定义的输入输出端口构造体定义实体的实现电路的具体描述配置一个实体可以有多个构造体可以通过配置来为实体选设计使用库调用的格式库名库名所要调用的程序包名可以这样理解库在硬盘上的存在形式是一个文件夹比如库就是一个的文件夹可以打开安装源文件夹进入的文件夹就可以到一个的文件夹这就是库而里面的文件就是一个个对程序包到文件夹下程序包而是可以在文件夹的文件里面到的用文本打开可以到
45、有一名为定义简单的来说库相当于文件夹而程序包和数据就相当于文件夹里面的文件的内容注意不是相当于文件因为程序包和数据都是在文件里面定义的而文件 欢迎下载 15 END BLOCK 块标号; 卫式表达式:是一个布尔条件表达式,只有当这个表达式为 TURE 时,BLOCK 语句才被执行; 类属子句:块的属性说明 块说明部分:用于定义 USE、子程序、数据类型、子类型、常量、信号和元件 块语句说明部分:用于描述块的具体功能,可以包含结构块中的任何并行语句结构。 注:块语句的作用就是将一个大的结构划成一块一块小的结构。 ) 进程语句 进程语句是一种应用广泛的并行语句, 一个结构体中可以包括一个或者多个进
46、程语句, 结构体中的进程语句是并发关系,即各个进程是同时处理的、并行执行的;但在第一个进程语句结构中,组成进程的各个语句都是顺序执行,在进程语句中是不能用并行语句的。 格式 进程标号:PROCESS 敏感信号表 IS 进程语句说明部分; BEGIN END PROCESS 进程标号; 注: 1、 敏感信号表列出了进程语句敏感的所有信号,每当其中的一个信号发生变化时,就会引起其他语句的执行,如果敏感信号表不写,那么在 PROCESS 里面必须有 WAIT 语句,由WAIT 语句来产生对信号的敏感; 而当敏感信号表存在时, 就不能在 PROCESS 里再有 WAIT语句; 2、 IS 可有可无,是
47、由 93 版规定的 据的集合程序包声明在设计中将用到的常数数据类型元件及子程序实体声明到其他实体或其他设计的接口即定义本定义的输入输出端口构造体定义实体的实现电路的具体描述配置一个实体可以有多个构造体可以通过配置来为实体选设计使用库调用的格式库名库名所要调用的程序包名可以这样理解库在硬盘上的存在形式是一个文件夹比如库就是一个的文件夹可以打开安装源文件夹进入的文件夹就可以到一个的文件夹这就是库而里面的文件就是一个个对程序包到文件夹下程序包而是可以在文件夹的文件里面到的用文本打开可以到有一名为定义简单的来说库相当于文件夹而程序包和数据就相当于文件夹里面的文件的内容注意不是相当于文件因为程序包和数据
48、都是在文件里面定义的而文件 欢迎下载 16 3、 进程语句说明部分是进程语句的一个说明区, 它主要用来定义进程语句所需要的局部数据环境,包括数据类型说明、子程序说明和变量说明。 4、 进程语句有两种存在状态,一是等待,当敏感信号没有发生变化时;一是执行,当敏感信号变化时。 ) 子程序调用语句 子程序分为函数和过程,它们的定义属于说明语句,均可在顺序语句和并行语句里面使用,它们的调用方法不一样。 函数只有一个返回值,用于赋值,可以说在信号赋值的时候就是对函数的调用; 过程有很多个返回值,用于进行处理,准确的来说子程序调用语句就是过程调用语句。 ) 参数传递语句 参数传递语句即在实体中定义的 GE
49、NERIC,可以描述不由材料和不同工艺构成的相同元件或模块的性能参数(如延时),在定义了 GENERIC 的实体叫参数化实体,由参数化实体形成的元件在例化时具有很大的适应性,在不同的环境下,只须用 GENERIC MAP 来修改参数就可以了,使用时,在对元件例化时加在里面就可,比如已经定义了一个 AND2 的实体,要在 EXAMPLE 里面使用 AND2,要先对 AND2 进行元件声明,再将 AND2 例化,如下: u0: AND2 GENERIC MAP (参数值 1,参数值 2) PORT MAP (参数表) ) 元件例化语句 一个实体就相当于元件, 元件名就相当于实体名, 元件要实现的功
50、能在实体里面就已经描述好,比如,同一个文件夹下已经有一个名为 A.VHD 的文件,如果要在另一个文件 B.VHD里面用到 A.VHD 里面定义的功能,那么可以在 B.VHD 文件里面通过元件声明和元件例化来调用 A 这个元件,总的来说调用元件过程就是“ 建立元件-元件声明-元件例化” ,元件调用时不用 USE 语句的,这和调用程序或类据不同。 注:元件声明语句属说明语句,不是同步语句,以下对元声的说明是为了更好地了解元件的调用,元件的实例化之前必须要有元件声明 元件声明语句格式 据的集合程序包声明在设计中将用到的常数数据类型元件及子程序实体声明到其他实体或其他设计的接口即定义本定义的输入输出端
51、口构造体定义实体的实现电路的具体描述配置一个实体可以有多个构造体可以通过配置来为实体选设计使用库调用的格式库名库名所要调用的程序包名可以这样理解库在硬盘上的存在形式是一个文件夹比如库就是一个的文件夹可以打开安装源文件夹进入的文件夹就可以到一个的文件夹这就是库而里面的文件就是一个个对程序包到文件夹下程序包而是可以在文件夹的文件里面到的用文本打开可以到有一名为定义简单的来说库相当于文件夹而程序包和数据就相当于文件夹里面的文件的内容注意不是相当于文件因为程序包和数据都是在文件里面定义的而文件 欢迎下载 17 COMPONENT 元件名就是文件名,即是实体名 GENERIC ; 这就是所产的元件参数
52、PORT; END COMPONENT ; 元件例化格式: 元件符:元件名 GENERIC MAP (参数表) PORT MAP (端口表) ) 生成语句 生成语句通常又称为 GENERATE 语句, 它是一种可以建立重复结构或者是在多个模块的表示形式之间进行选择的语句,格式如下: 生成语句标号: GENERATE ; END GENERATE 生成语句标号; 模式选择有两种,一是 FOR 模式,一是 IF 模式。 FOR 模式生成语句 生成语句标号: FOR 循环变量 IN 离散范围 GENERATE ; END GENERATE 生成语句标号; IF 模式生成语句 生成语句标号: IF G
53、ENERATE ; END GENERATE 生成语句标号; ) 并行断言语句 前面已经说过顺序断言语句,这里的断言语句是并行的,可以放在实体说明、结构体和块语句中使用,可以放在任何要观察和调试的点上,而顺序断言语句只能在进程、函数和过程中据的集合程序包声明在设计中将用到的常数数据类型元件及子程序实体声明到其他实体或其他设计的接口即定义本定义的输入输出端口构造体定义实体的实现电路的具体描述配置一个实体可以有多个构造体可以通过配置来为实体选设计使用库调用的格式库名库名所要调用的程序包名可以这样理解库在硬盘上的存在形式是一个文件夹比如库就是一个的文件夹可以打开安装源文件夹进入的文件夹就可以到一个的
54、文件夹这就是库而里面的文件就是一个个对程序包到文件夹下程序包而是可以在文件夹的文件里面到的用文本打开可以到有一名为定义简单的来说库相当于文件夹而程序包和数据就相当于文件夹里面的文件的内容注意不是相当于文件因为程序包和数据都是在文件里面定义的而文件 欢迎下载 18 使用。 其实断言语句的顺序使用格式和并行使用格式是一样的, 因此断言语句是可以应用在任何场所的,格式请看顺序的说明。 思考: 1、 是不是所有的 VHDL 语句都可以归结为顺序语句和并行语句呢?那么子程序定义是顺序的还是并行的呢?由上面的学习可以知道, 子程序可以在三个地方 (程序包、 结构体、 进程)中进行定义, 而子程序在没有调用
55、之前是不参与执行的, 由此可知子程序的定义是属于说明语句,还有元件的说明也属于说明语句,这个不用多说。因此,可以这样对 VHDL 语句进行归类,三大类顺序语句、并行语句和说明语句,这三类语句的关系是顺语句可以用在并行语句和说明语句当中, 说明语句可以用在并行语句当中, 而并行语句是不能用在其他语句当中,可以说并行语句属于一种高级形态,是语句的最终形态。 2、子程序分为函数和过程,子程序的调用即可以用在顺序语句中,也可以用并行语句中,用在顺序语句(进程或者子程序)中就叫顺序调用语句;在并行语句(位于进程或子程序的外部)中就叫做并行调用语句,并行调用语句在结构体中是并行执行的。 3、区分信号与变量
56、,信号是全局的,要在并行语句里面说明;变量是局部的;要在顺序语句里面说明;赋值格式不一样;赋值方式不一样,变量是即时赋值的,信号的赋值要到最后才生效的;使用地方不一样,信号可以在并行语句里使用也可在顺序语句里使用,而变量只能在顺序语句里使用 4、区分过程和函数,过程可以具有多个返回值(准确来说不是返回值,而是这些信号在过程之中被改变),函数只有一个返回值;过程通常用来定义一个算法,而函数用来产生一个具有特定意义的值;过程中的形式参数可以有三种通信模式(输入、输出、双向),而函数中的形参只能是输入通信模式(因为函数是用来产生一个值的);过程中可以使用赋值语句或 WAIT 语句,而函数不可(因为过
57、程是用来处理的) 5、为什么信号不可以在顺序语句里面进行说明呢?是因为信号是全局变量。为什么变量不可以在并行语句里面进行说明呢?是因为变量只是对暂时数据进行局部的存储, 只是一个局部的变量。 据的集合程序包声明在设计中将用到的常数数据类型元件及子程序实体声明到其他实体或其他设计的接口即定义本定义的输入输出端口构造体定义实体的实现电路的具体描述配置一个实体可以有多个构造体可以通过配置来为实体选设计使用库调用的格式库名库名所要调用的程序包名可以这样理解库在硬盘上的存在形式是一个文件夹比如库就是一个的文件夹可以打开安装源文件夹进入的文件夹就可以到一个的文件夹这就是库而里面的文件就是一个个对程序包到文
58、件夹下程序包而是可以在文件夹的文件里面到的用文本打开可以到有一名为定义简单的来说库相当于文件夹而程序包和数据就相当于文件夹里面的文件的内容注意不是相当于文件因为程序包和数据都是在文件里面定义的而文件 欢迎下载 19 6、信号分为两种:一是外部信号(输出输入信号),即在实体中定义的 IN、OUT、INOUT 、BUFFER 和 LINKAGE ;一是内部信号(连线信号),即在程序包、实体、结构体中说明的SIGNAL ,用于元件与元件连接起来。 7、CASE 语句、条件信号赋值语句和选择赋值语句的结构有点相似,要注意它们的书写格式。 据的集合程序包声明在设计中将用到的常数数据类型元件及子程序实体声明到其他实体或其他设计的接口即定义本定义的输入输出端口构造体定义实体的实现电路的具体描述配置一个实体可以有多个构造体可以通过配置来为实体选设计使用库调用的格式库名库名所要调用的程序包名可以这样理解库在硬盘上的存在形式是一个文件夹比如库就是一个的文件夹可以打开安装源文件夹进入的文件夹就可以到一个的文件夹这就是库而里面的文件就是一个个对程序包到文件夹下程序包而是可以在文件夹的文件里面到的用文本打开可以到有一名为定义简单的来说库相当于文件夹而程序包和数据就相当于文件夹里面的文件的内容注意不是相当于文件因为程序包和数据都是在文件里面定义的而文件