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