第四章 VHDL硬件描述语言.docx
《第四章 VHDL硬件描述语言.docx》由会员分享,可在线阅读,更多相关《第四章 VHDL硬件描述语言.docx(52页珍藏版)》请在冰豆网上搜索。
第四章VHDL硬件描述语言
理学院教案
课程名称
电子设计自动化
授课教师
孙小艳
课程属性
必修课(∨)专业选修课()
校定公共选修课()
课程学分
3.5
课程教材
《EDA技术实用教程》潘松主编
课程学时
64学时
授课班级
2013级电子信息科学与技术
学生人数
38
授课题目
第四章VHDL硬件描述语言
授课学时
6
教学目的、要求(教学目标):
通过本部分的学习,掌握VHDL硬件描述语言,并能进行简单的设计。
教学重点:
掌握VHDL硬件描述语言,并能进行简单的设计。
教学难点:
VHDL硬件描述语言进行简单的设计
授课方式、方法和手段:
实施多媒体教学与传统的板书相结合的教学方式;教学与课外阅读相结合,要求学生自行寻找或给学生提供足够的阅读文献。
教学方法以讲授法和讨论法为主,对于原理知识以讲授法为主,同时采用专题讨论、课堂作业等方法。
作业及课外训练:
参考资料:
[1]《EDA技术实用教程》潘松主编
本章小结:
通过本部分的学习,使学生掌握VHDL硬件描述语言进行简单的设计。
共分为七节进行讲述:
第一节VHDL基本结构、第二节数据对象、类型及运算符、第三节顺序语句、第四节并行语句、第五节子程序、第六节程序包与设计库、第七节元件配置。
理学院教案
教学内容
教学过程设计
HDL最早是Iverson公司于1962年提出,到上世纪80年代被各个ASIC芯片厂商广泛采用。
1982年各ASIC芯片厂商相继开发出自己的HDL。
如Silvar-lisco公司的HHDL、Zycad公司的ISP、GatewayDesignAutomation(现改为CadenceDesignSystem)公司的Verilog等等。
另外,还有许多一些高等院校及科研机构也开发了许多版本的HDL,有名的有美国国防部开发的VHDL(VHSICHDL)、日本电子工业振兴协会的UDL/I等。
硬件描述语言(HardwareDescriptionLanguage,HDL)为了标准化HDL,1987年底,IEEE确认美国国防部开发的VHDL为标准硬件描述语言(IEEE-1076)。
之后,各EDA公司研制的硬件电路设计工具逐渐向VHDL靠拢。
1993年,IEEE对VHDL进行了修订,公布了新版本的VHDL(即IEEE-107-
1993)。
现在VHDL和Verilog作为IEEE的两个标准。
VHDL语言是美国国防部在20世纪80年代初为实现其高速集成电路计划(VeryHighSpeedIntegratedCircuit,VHSIC)而提出的硬件描述语言(HardwareDescriptionLanguage,HDL),称为VHDL。
VHDL的主要优点是:
1.覆盖面广,描述能力强,是一个多层次的硬件描述语言。
2.VHDL有良好的可读性,即可以被计算机接受,也容易被理解。
3.生命期长。
VHDL的硬件描述与工艺技术无关,不会因工艺变化而使描述过时。
与工艺技术有关的参数可通过VHDL提供的属性加以描述,工艺改变时,只需修改相应程序中的属性参数即可。
4.支持大规模设计的分解和已有设计的再利用,一个大规模设计不可能一个人独立完成,它将由多人,多项目组来共同完成。
VHDL为设计的分解和设计的再利用提供了有力的支持。
5.VHDL已成为IEEE承认的一个工业标准,事实上已成为通用硬件描述语言。
目前,大多数的EDA工具几乎在不同程度上都支持VHDL,这样给VHDL的进一步推广和应用创造了良好的环境。
6.VHDL可以支持自上而下(TopDown)和基于库(Library-Based)的设计方法,而且还支持同步电路、异步电路、FPGA等的设计。
其范围之广是其它HDL所不能比拟的。
第一节VHDL基本结构
以3-8译码器为例引入:
libraryieee;
useieee.std_logic_1164.all;
entitydecis
port(
signalsel:
instd_logic_vector(2downto0);
signalen:
instd_logic;
signaly:
outstd_logic_vector(7downto0)
);
enddec;
1.参数部分——库、程序包、配臵
2.接口部分—-实体说明
architecturebehaviorofdecis
begin
process(sel,en)
begin
y<=‖11111111‖;
if(en=‘1‘)then
caseselis
when―000‖=>y(0)<=‘0‘;
when―001‖=>y
(1)<=‘0‘;
when―010‖=>y
(2)<=‘0‘;
when―011‖=>y(3)<=‘0‘;
when―100‖=>y(4)<=‘0‘;
when―101‖=>y(5)<=‘0‘;
when―110‖=>y(6)<=‘0‘;
when―111‖=>y(7)<=‘0‘;
whenothers=>NULL;
endcase;
endif;
endprocess;
endbehavior;
3.描述部分—结构体
VHDL语言把任意复杂的一个系统看成为一个模块。
一个模块可主要分为三个组成部分:
1.参数部分——库、程序包、配臵
2.接口部分—实体说明
3.描述部分—结构体
一个VHDL程序的前面部分总是有语句:
有关库、程序包、配臵的作用及使用方法在后面讲述。
LIBRARYieee;——使用IEEE标准库
USEieee.std_logic_1164.all;——打开一个程序包
(程序包名为ieee.std_logic_1164.all)
有些程序还需要加以下语句:
USEieee.std_logic_arith.all;
USEieee.std_logic_unsigned.all;
数字系统中的基本单元,在VHDL中称作设计实体(designentity)。
一个基本设计单元,简单的可以是一个门,复杂一点的可以是一个微处理器、一块
印刷电路板上所有电路或者是整个数字系统。
设计实体由两部分组成:
实体说明和结构体。
实体说明规定了设计单元的输入输出接口信号或引脚。
结构体定义了设计单元的具体构造和操作(行为)。
一.实体说明
基本格式:
ENTITY实体名IS
[GENERIC(类属表);]
[PORT(端口表);]
END[ENTITY][实体名];
1.类属参数说明
类属参数说明必须放在端口说明之前,用于为设计实体和其外部环境通信的静态信息提供通道,可以定义端口的大小、实体中子元件的数目、实体的定时特性等。
例:
GENERIC(m:
Time:
=1ns);
该语句指定了结构体内的m为Time类型,其值为1ns。
若随后的结构体内有语句:
q<=tmpafterm;
则表示tmp送入q有一个延迟时间1ns。
2.端口说明
端口说明用于为设计实体和其外部环境的动态通信提供通道。
也可以说是对外部引脚信号的名称、数据类型、输入输出方向的描述。
一般书写格式为:
1)端口名
PORT(端口名{,端口名}:
方向数据类型名);
端口名{,端口名}:
方向数据类型名);
端口名是赋予每个外部引脚的名称,通常用一个或几个英文字母,或者用英文字母加数字命名。
端口方向用来定义外部引脚的信号方向是输入还是输出。
2)端口方向
不指定方向,无论哪一个方向都可连接LINKAGE
输出(结构体内部能使用)BUFFER
双向INOUT
输出(结构体内部不能再使用)OUT
输入IN
注意:
OUT和BUFFER都可以定义输出端口,但它们之间是有区别的。
3)数据类型
在VHDL语言中有10种数据类型,但是在逻辑电路设计中只用到两种:
BIT和BIT_VECTOR。
BIT数据类型是位逻辑数据类型,其取值只能是两个逻辑值(‚1‛和‚0‛)中的一个。
BIT_VECTOR数据类型是位数组逻辑数据类型,其取值是一组二进制位的值。
例:
PORT(d0,d1,sel:
INBIT;
q:
OUTBIT;
bus:
OUTBIT_VECTOR(0TO7));
其中的bus就是一个输出型的8位端口(总线)。
二、结构体
基本格式:
ARCHITECTURE结构体名OF实体名IS
[说明语句]
[BEGIN
并行语句;]
END[ARCHITECTURE][结构体名]
1.结构体名称的命名
结构体名称是对本结构体的命名,它是该结构体的唯一名称。
OF后面紧跟的实体名表明了该结构体所对应的是哪一个实体。
用IS来结束结构体的命名。
结构体的名称可以自由命名。
但在大多数时候,通常把结构体的名称命名为behavioral(行为)、dataflow(数据流)或者structural(结构)。
表示结构体的3种描述方式。
2.说明语句
定义语句位于ARCHITECTURE和BEGIN之间,用于对结构体内部所使用的信号、常数、数据类型和函数进行定义。
3.并行语句
并行语句处于语句BEGIN和END之间,具体描述了本结构体的行为(功能)及其连接关系(内部结构)。
并行语句的描述方式有4种:
1)算法描述。
2)数据流描述。
3)结构描述。
4)混合描述。
1)算法描述(也有称为‘行为描述’方式)
算法描述属行为描述。
是描述方式中较容易接受的。
完全把硬件的设计软件化了。
行为描述表示输入与输出间转换的行为。
无需包含任何结构信息。
2)数据流描述(也有称为‘寄存器传输描述’方式)
数据流描述表示行为,也隐含表示结构。
它反映从输入数据到输出数据之间所发生的逻辑变换。
3)结构描述
结构描述给出实体内部结构,即所包含的模块或元件及其互连关系以及与实体外部引线的对应关系。
4)混合描述
在一个结构体中,行为描述与结构描述可以混合使用。
即元件例化语句可与其他并行语句共处于同一个结构体内。
第二节数据对象、类型及运算符
一、对象类别与定义
在VHDL语言中,有四类对象:
1)CONSTANT(常量),可用于定义延迟、功耗、电源(即5V)、地(0V)等参数。
只能进行一次赋值。
2)VARIABLE(变量),常用于高层次抽象的算法描述中。
可多次赋值。
3)SIGNAL(信号),对应某一条硬件连线,可多次赋值。
4)FILE(文件),相当于文件指针,用于对文件的读写操作。
(很少用到)
1.常量(CONSTANT)
常量是一个固定值。
所谓常量说明就是对某一常量名赋予一个固定值。
通常赋值在程序开始前进行,该值的数据类型则在说明语句中指明。
一般格式如下:
CONSTANT常量名:
数据类型:
=表达式;
例:
CONSTANTVcc:
Real:
=5.0;
CONSTANTfbus:
Bit_vector:
=“0101”;
CONSTANTdelay:
Time:
=5ns;
2.变量(VARIABLE)
变量只能在进程语句、函数语句和过程语句结构中使用,它是一个局部量。
在仿真过程中,变量的赋值是立即生效。
一般格式如下:
VARIABLE变量名:
数据类型:
[约束条件:
=初始值];
例:
VARIABLEx,y:
Integer;
VARIABLEcount:
IntegerRANGE0to255:
=10;
VARIABLEi:
Integer:
=13;
3.信号(SIGNAL)
信号是电子电路内部硬件连接的抽象。
它除了没有数据流动方向说明以外,其他性质几乎和前面所述的‚端口概念一样。
信号通常在构造体、包集合和实体中说明。
一般格式如下:
SIGNAL信号名:
数据类型:
[约束条件:
=初始值];
例:
SIGNALsys_clk:
Bit:
=0;
SIGNALclock:
Bit;
SIGNALU377Q:
Std_logic_vector(7downto0);
4.关于信号和变量值代入的区别
信号和变量值的代入不仅形式不同,而且其操作过程也不同。
在变量的赋值语句中,该语句一旦被执行,其值立即被赋予变量。
在执行下一条语句时,该变量的值就为上一句新赋的值。
变量的赋值符为:
=。
信号代入语句采用<=代入符,该语句即使被执行也不会使信号立即发生代入。
下一条语句执行时,仍使用原来的信号值。
由于信号代入语句是同时进行处理的,因此,实际代入过程和代入语句的处理是分开进行的。
二、数据类型
在VHDL语言中,一个对象只能具有一个数据类型,施加
于该对象的操作必须与该类型相匹配。
VHDL提供多种标准的数据类型。
在此基础上,用户还可
以自定义数据类型。
1.标准的数据类型
有十种标准的数据类型,分别是整数、实数、位、位矢量、布尔量、字符、字符串、时间、错误等级、大于等于零的整数或正整数。
1)整数(Integer)
整数与数学中的整数含义相同。
VHDL中,整数的表示范围是-2147483647~2147483647,即从-(231-1)到(231-1)。
VHDL是一个强类型语言,要求在赋值语句中的数据类型必须匹配。
2)实数(Real)
在进行算法研究或者实验时,作为对硬件方案的抽象手段,常用实数四则运算。
实数的定义值范围是-1.0E+38~+1.0E+38。
实数有正负数,书写时一定要有小数点。
3)位(Bit)
在数字系统中,信号值通常用一个位来表示。
位值的表示方法是,用字符‘0’或者‘1’(将值放在单引号中)表示之。
位与整数中的0和1不同,‘1’和‘0’仅仅表示一个位的两种取值。
位数据可以用来描述系统中总线的值。
4)位矢量(Bit_vector)
位矢量是用双引号括起来的一组位数据。
用位矢量数据表示总线状态最形象也最方便。
5)布尔量(Boolean)
一个布尔量具有两种状态,“真”或者“假”。
虽然布尔量也是二值枚举量,但它和位不同,没有数值的含义,也不能进行算术运算。
它能进行关系运算。
例如,它可以在IF语句中被测试,测试结果产生一个布尔量TRUE或FALSE。
如果某个信号或者变量被定义为布尔量,那么在仿真中将自动地对其赋值进行核查。
一般这一类型的数据的初始值总为FALSE。
6)字符(Character)
字符也是一种数据类型,所定义的字符量通常用单引号括起来,如‘A‘。
一般情况下VHDL对大小写不敏感,但是对字符量中的大、小写字符则认为是不一样的。
例如,‘B‘不同于‘b‘。
字符量中的字符可以是a~z中的任一个字母,0~9中的任一个数以及空白或者特殊字符,如$,@,%等等。
包集合STANDARD中给出了预定义的128个ASCII码字符类型,不能打印的用标识符给出。
字符‘1’与整数1和实数1.0都是不同的。
7)字符串(String)
字符串是用双引号括起来的一个字符序列,它也称字符矢量或字符串数组。
常用于程序的提示和说明。
8)时间(Time)
时间是一个物理量数据。
完整的时间量数据应包含整数和单位两部分,而且整数和单位之间至少应留一个空格的位臵。
例55sec,2min等。
在包集合STANDARD中给出了时间的预定义,其单位是fs,ps,ns,μs,ms,sec,min,hr。
(飞秒,皮秒,纳秒,微秒,毫秒,秒,分钟,小时)
9)错误等级(Severitylevel)
错误等级类型数据用来表征系统的状态,它共有4种:
NOTE(注意),WARNING(警告),ERROR(出错),FAILURE(失败)。
在系统仿真过程中可以用这4种状态来提示系统当前的工作情况。
10)大于等于零的整数(Natural),正整数(Positive)
这两类数据是整数的子类,Natural类数据只能取值0和0以上的正整数;而Positive则只能为正整数。
以上这10种标准的数据类型,在编程中可直接引用。
如果用户需使用这10种以外的数据类型,则必须进行自定义。
由于VHDL语言属于强类型语言,在仿真过程中,首先要检查赋值语句中的类型和区间,任何一个信号和变量的赋值均须落入给定的约束区间中,也就是说要落入有效数值的范围中。
约束区间的说明通常跟在数据类型说明的后面。
2.用户定义的数据类型
在VHDL语言中,使用户最感兴趣的一个特点是,可以由用户自己来定义数据类型。
由用户定义的数据类型的定义书写格式为:
TYPE数据类型名[,数据类型名]数据类型定义
可由用户定义的数据类型有:
枚举(Enumerated)类型.整数型(Integer)类型
.实数(Real)类型.浮点数(Floating)类型
.数组(Array)类型.存取(Access)类型
.文件(File)类型.记录(Recode)类型
.时间(Time)类型
四、运算符
VHDL中提供功能强大的运算符,可分为4类:
逻辑运算符、算术运算符、关系运算符、其它运算符。
1.逻辑运算符
在VHDL中逻辑运算符共有6种,它们分别为:
NOT——取反;AND——与;OR——或;
NAND——与非;NOR——或非;XOR——异或。
这6种逻辑运算符可以对STD_LOGIC和BIT等的逻辑型数据、STD_LOGIC_VECTOR‖逻辑型数组及布尔型数据进行逻辑运算。
必须注意,运算符的左边和右边,以及代入的信号的数据类型必须是相同的。
在VHDL中,当一个语句中存在两个以上的逻辑表达式时,左右没有优先级差别(不象C语言中运算有自左至右的优先级顺序的规定)。
例如,在下例中,如去掉式中的括号,那么从语法上来说是错误的:
X<=(aANDb)OR(NOTcANDd);
如果一个逻辑表达式中只有“AND”,”OR”,“XOR”运算符,那么改变运算顺序将不会导致逻辑的改变。
此时,括号是可以省略的。
例如:
a<=bANDcANDdANDe;
a<=bORcORdORe;
a<=bXORcXORdXORe;
a<=((bNANDc)NANDd)NANDe;(必须要括号)
a<=(bANDc)OR(aANDe);(必须要括号)
2.算术运算符
在VHDL中共有10种算术运算符,它们分别为:
+——加;-——减;*——乘;/——除;MOD——求模;
REM——取余;+——正(一元运算);-——负(一元运算);
**——指数;ABS——取绝对值。
加、减、乘、除运算符可用于整数、浮点数和物理类型。
指数运算的左边可以是整数或浮点数,但右边必须为整数,只有在左边为浮点数时,其右边才可以为负数。
取绝对值运算可以用于任何数值类型。
求模和取余运算只能用于整数类型。
一元运算的操作数移位运算符和循环移位运算符为二元运算符,只能定义在一维数组上,其左运算数(左元)的元素类型必须为位型(Bit)或布尔型(Boolean),而右运算数(右元)必须为整数类型。
若右运算数为0,则无任何动作。
如“SRRL0”将不发生任何动作;若右运算数为负数,则移位次数为该数的绝对值,如“SSRL–6”与“SSRL6”等价。
为任何数值类型(整数、浮点数和物理类型)。
3.关系运算符
在VHDL中共有6种算术运算符,它们分别为:
=——等于;/=——不等于;<——小于;
>——大于;<=——小于等于;>=——大于等于。
其中等号“=”和不等号“/=”可以适合所有类型的数据。
其它关系运算符则可使用于整数、浮点数、位(STD_LOGIC)等枚举类型和位矢量(STD_LOGIC_VECTOR)等数组类型。
注意:
在利用关系运算符对数据类型进行比较时,比较过程是从最左边的位开始,自左至右按位进行比较。
在位长不同的情况下,只能按自左至右的比较结果作为关系运算的结果。
4.合并运算符
合并运算符“&”用于位的连接。
例如,将4个位用合并运算符“&”连接起来就可以构成一个具有4位长度的位矢量。
两个4位的位矢量用合并运算符“&”连接起来就可以构成8位长度的位矢量。
第三节顺序语句
用VHDL语言进行设计时,按描述语句的执行顺序对其分类,可以将VHDL语句分为顺序执行语句和并行执行语句。
VHDL的顺序语句有赋值语句、IF语句、CASE语句、LOOP语句、WAIT语句、断言语句和过程调用语句。
顺序语句是指完全按照程序中书写的顺序执行各语句,并且在结构层次中前面语句的执行结果会直接影响后面各语句的执行结果。
顺序语句只能出现在进程或子程序中,由它定义进程或子程序所执行的算法。
一、变量与信号赋值语句
在VHDL语言中,有两种赋值语句,一种称为变量赋值,另一种称为信号代入。
1.变量赋值
格式为:
目的变量:
=表达式;
将右边表达式值立即赋给左边的目的变量。
例:
a:
=2;
b:
=3.0;
c:
=d+e;
2.信号代入
格式为:
目的信号量<=表达式;
将右边表达式值经一定时间间隔(最小为δ)之后赋给左边的目的信号量。
例:
a<=b;
该语句表示将信号量b的当前值赋予目的信号量a.
注意:
代入语句的符号“<=”,和关系运算的小于等于符“<=”非常相似,要正确判别不同的操作关系,应根据上下文的含义和说明。
另外,代入符号两边信号量的类型和位长度应该是一致的。
二、IF语句
IF语句是根据所指定的条件来确定执行哪些语句的,其书写格式可以分为3种类型。
1.IF语句的门闩控制
格式为:
IF条件THEN
顺序语句;
ENDIF;
当程序执行到该IF语句时,要判断IF语句所指定的条件是否成立。
如果条件成立,则执行顺序语句;否则程序跳过顺序语句,而直接执行IF语句的后续语句。
这里的条件起到门闩的控制作用。
2.IF语句的二选择控制
格式为:
IF条件THEN
顺序语句1;
ELSE
顺序语句2;
ENDIF;
当程序执行到该IF语句时,要判断IF语句所指定的条件是否成立。
如果条件成立,则执行THEN与ELSE之间所界定的顺序语句;否则执行ELSE与ENDIF之间所界定的顺序语句。
即用条件来选择两条不同的执行路径。
3.IF语句的多选择控制
IF语句的多选择控制又称IF语句的嵌套。
格式为:
IF条件THEN
顺序语句1;
ELSIF条件THEN
顺序语句2;
……
ELSIF条件THEN
顺序语句n-1;
ELSE
顺序语句n;
ENDIF;
三、CASE语句
CASE语句用来描述总线或编码、译码的行为,从许多不同语句的序列中选择其中之一执行。
虽然IF语句也有类似的功能,但是CASE语句的可读性比IF语句要强得多,程序的阅读者很容易找出条件式和动作的对应关系。
格式为:
CASE表达式IS
WHEN条件表达式=>顺序语句;
ENDCASE;
CASE语句中的条件表达式可以有4种不同的表示形式:
WHEN值=>顺序语句;
WHEN值|值|…|值=>顺序语句;
WHEN值TO值=>顺序语句;
WHENOTHERS=>顺序语句;
四、LOOP语句
LOOP与其它高级语言中的循环