VHDL语言学习Word下载.docx
- 文档编号:19712591
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:13
- 大小:27.02KB
VHDL语言学习Word下载.docx
《VHDL语言学习Word下载.docx》由会员分享,可在线阅读,更多相关《VHDL语言学习Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
由于WORK库自动满足VHDL标准,因此在就应用中不必以显式预先说明(比如LIBRARYWORK这样的定义是多余的)。
1.2程序包
在VHDL中,常量、数据类型与子程序可以在实体说明部分和结构体部分加以说明,且实体说明部分所定义的常量、数据类型与子程序在相应的结构体中是可见的(可以被使用的),但在一个实体的说明部分与结构体的部分对于其他实体的说明部分与结构部分是不可见的(注:
实体相当于一个文件),程序包(PACKAGE)就是为了使一组常量说明、数据说明、子程序说明和元件说明等内容对于多个设计实体都成为可见的而提供的一种结构,可以这样理解一个实体(文件)里的PACKAGE对常量等的定义在其于的实体(文件)里是可以被使用的。
程序包由包头和包体构成,包头格式:
PACKAGE程序包名IS
说明语句;
END程序包名;
说明语句部分可为:
USE语句、类型定义、子程序声明(定义在包体)、常量定义、信号声明、元件声明等。
包体格式:
PACKAGEBODY程序包名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选配结构体名;
ENDFOR;
ENDCONFIGURATION;
第二章、数据类型、算符、数据对象、属性
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是一种强类型语言,对于每一个常数、变量、信号、函数及设定的各种参量的数据类型(DATATYPES)都有严格要求,相同数据类型的变量才能互相传递和作用,标准定义的数据类型都在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),表达方法包含数字、(空格)单位两部分,如(10PS);
BIT_VECTOR位矢量:
其于BIT数据的数组,使用矢量必须注明宽度,即数组中的元素个数和排列,如SIGNALA:
BIT_VECTOR(7DOWNTO0)
NATUREAL自然数:
整数的一个
POSITIVE正整数:
SEVRITYLEVEL错误等级:
在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数据类型名ISRANGE约束范围;
(如-10到+10)
数组类型:
TYPE数据类型名ISARRAY(下限TO上限)OF类型名称
记录类型:
TYPE记录类型名ISRECODE
元素名:
数据类型名;
。
ENDRECODE
2.4运算符
VHDL为构造计算数值的表达式提供了许多预定义运算符,可分为四种类型:
算术运算符,关系运算符,逻辑运算符与连接运算符。
算术运算符:
+、-、*、/、**、MOD、REM、ABS
关系运算符:
=、/=、<
、<
=、>
、>
=
逻辑运算符:
AND、OR、NOT、NAND、NOR、XOR、NOR
连接运算符:
&
,将多个对象或矢量连接成维数更大的矢量
2.5VHDL属性
属性是关于实体、结构体、类型及信号的一些特征,有些属性对于综合非常有用,其一般形式均为:
对象’属性。
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
——无限等待;
WAITON(敏感信号1,敏感信号2,敏感信号N)——敏感信号变化,表中的信号产生变化时才往下运行;
WAITUNTIL布尔表达式——为TRUE时,进程启动,为FARLSE是等待
WAITFOR时间表达式——到时进程才会启动
WAITUNTIL布尔表达式ON(敏感信号1,敏感信号2,敏感信号N)FOR时间表达式——多条件等待语句,注意在多条件等待语句的表达式中,至少应有一个信号量,因为处于等待进程中的变量是不可改变的。
3)IF语句
这种语句在其他编程语言也有,不用多讲,其完整的书写格式
[IF标号:
]IF<
条件>
THEN
<
顺序处理语句>
;
[ELSIF<
…….
[ELSE
ENDIF[IF标号]
4)CASE语句
CASE语句是另一种形式的流程控制语句,可读性比IF的强,格式如下
CASE〈条件表达式〉IS
WHEN〈条件取值〉=>
顺序处理语句;
WHEN
OTHERS=>
ENDCASE;
上面的〈条件取值〉有三种格式可选
条件表达式取值
条件表达式取值|条件表达式取值|条件表达式取值|
条件表达式取值TO条件表达式取值
5)LOOP循环语句
LOOP语句与其他高级编程语言中的循环语句一样,可以使程序进行有规律的循环,循环的次数受迭代算法的控制,一个LOOP语句可包含要重复执行的一组顺序语句,它可以执行多次或是零次。
LOOP格式
[LOOP标号:
][重复模式]LOOP
〈顺序处理语句〉;
ENDLOOP[LOOP标号];
重复模式有两种,FOR模式和WHILE模式。
FOR模式的LOOP语句格式:
[LOOP标号:
]FOR循环变量IN离散范围LOOP
WHILE模式的LOOP语句格式:
]WHILE〈条件〉LOOP
ENDLOOP[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条件1ELSE
表达式2
WHEN条件2ELSE
表达式3
WHEN条件3ELSE
表达式4
注:
条件赋值语句与IF语句不同之处
1、以上条件赋值语句不能进行嵌套,而IF是可以的
2、由于条件信号赋值语句是并行语句,必须用在结构体中的进程之外(进程是用顺序语句来编写的),而IF是顺序语句
3、条件信号赋值语句ELSE是必须有的,而IF可没有
4、条件信号赋值语句与实际的硬件电路十分接近,因此使用该语句要求设计人员具有硬件电路知识,而IF一般用来进行硬件电路的高级描述,它不要求太多的硬件电路知识。
5、一般情况下很少用条件赋值语句,只有当用进程语句、IF语句和CASE语句难以对路进行描述时才用
赋值方式三
选择信号赋值语句,格式如下
WITH选择条件表达式SELECT
=信号表达式1
WITH选择条件1
信号表达式2
WITH选择条件2
信号表达式3WITH选择条件3
信号表达式4
WITHOTHERS
选择信号赋值语句是一种并行语句,不能在结构体中的进程内部使用
2)块语句
在VHDL语言设计中,块语句常常用来对比较复杂的结构体作结构化描述,格式如下
[块标号:
]BLOCK[卫式表达式]
[类属子句;
[端口子句;
[块说明部分;
块语句说明部分;
>
ENDBLOCK[块标号];
卫式表达式:
是一个布尔条件表达式,只有当这个表达式为TURE时,BLOCK语句才被执行;
类属子句:
块的属性说明
块说明部分:
用于定义USE、子程序、数据类型、子类型、常量、信号和元件
块语句说明部分:
用于描述块的具体功能,可以包含结构块中的任何并行语句结构。
块语句的作用就是将一个大的结构划成一块一块小的结构。
3)进程语句
进程语句是一种应用广泛的并行语句,一个结构体中可以包括一个或者多个进程语句,结构体中的进程语句是并发关系,即各个进程是同时处理的、并行执行的;
但在第一个进程语句结构中,组成进程的各个语句都是顺序执行,在进程语句中是不能用并行语句的。
[进程标号:
]PROCESS[敏感信号表][IS]
[进程语句说明部分;
顺序语句部分>
ENDPROCESS[进程标号];
1、敏感信号表列出了进程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VHDL 语言 学习