EDA第五章复习总结.docx
- 文档编号:28382524
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:20
- 大小:23.59KB
EDA第五章复习总结.docx
《EDA第五章复习总结.docx》由会员分享,可在线阅读,更多相关《EDA第五章复习总结.docx(20页珍藏版)》请在冰豆网上搜索。
EDA第五章复习总结
5.1VHDL概述
硬件描述语言(VHDL)的突出优点
1.打破了IC设计者与使用者的界线
2.VHDL及其配套工具软件简单易学,直观明了,便于迅速掌握,也便于修改。
3.极大地缩短了专用芯片的开发周期,降低开发成本,加快了产品更新换代的速度,提高产品的市场竞争力。
4.大大缩小电路板面积和整机体积,提高产品可靠性,增强产品功能,实现技术保密。
5.可实现电路设计的模块化和积木式多级组合。
各模块均可在今后被重复再利用(调用)。
6.完全实现拥有整机的自主知识产权,不再在关键芯片(专用芯片)的进口及价格方面受制于人。
5.2VHDL程序的结构
一、基本的VHDL描述的组成:
1.实体(entity)部分64页
2.结构体(architecture)部分67页
IN(输入)、OUT(输出)是表示信号的类别;
BIT是表示信号的类型,BIT是系统定义的类型,即二进位类型,信号只有‘0’和‘1’两种值;
每个VHDL语句都是以“;”结束,包括最后一个语句也不例外;
VHDL中的“注释”是以两个减号“--”开始的。
二、实体描述
ENTITY实体名IS
PORT(信号名:
类别信号类型;………
信号名:
类别信号类型);
END实体名;
同样类别和类型的信号可以用逗号分隔,在一个语句行中说明。
信号的类别主要有以下4种:
IN:
此信号是输入信号;
OUT:
此信号是输出信号,提供给其他的实体;
BUFFER:
缓冲信号,也是实体的输出信号,但是可以被实体本身的结构体读入;
INOUT:
双向信号,既可以输入,也可以输出。
系统预定义的信号类型有:
BIT:
二进位型,信号的值只能是‘0’或‘1’。
BIT_VECTOR:
二进位向量,实际对应的是二进位数组;
BOOLEAN:
布尔型,取值只能是true或者false;
INTEGER:
整型,一般都用32位二进制数表示整型数;
CHARACTER:
字符型,使用8位编码的ASCII字符。
三、结构体描述
ARCHITECTURE结构体名OF实体名IS
<声明部分>
BEGIN
<描述部分>
END结构体名;
对于一个实体来说,可以有几种不同的结构体描述。
5.3VHDL程序的元素
一、关键字85页
二、标识符的命名85页
三、数据类型91页
预定义:
◆整数Integer:
-(2的31次方-1)—2的31次方-1
◆实数Real:
-1.0E+38--+1.0E+38
◆位Bit:
’0’或’1’
◆位矢量Bit_Vector:
”001100”
◆布尔量Boolean:
真或假
◆字符Character:
’A’,’C’
◆物理Time:
预定义为时间,其他如电压、电流等也为物理型
◆错误等级:
NOTE、WARNING、ERROR、FAILURE
◆自然数(Natural)、正整数(Positive)
◆字符串(String),如”morning”
用户自定义类型:
96页
◆枚举型可以通过枚举类型来定义信号的取值。
除了最常用的二值逻辑(已经预定义为BIT型),还可以有三值逻辑(信号有三种取值:
‘0’、‘1’和‘z’),九值逻辑等
TYPE枚举类型名IS(枚举型值表);
如TYPEqit_logicIS('0','1','Z','X')
◆STD_ULOGIC
在IEEE1164标准逻辑包中所定义的std_ulogic类型是一种九值逻辑,也是一种枚举型的数据类型:
TYPEstd_ulogicIS('U',--Uninitialized
'X',--ForcingUnknown
'0',--Forcing0
'1',--Forcing1
'Z',--HighImpedance
'W',--WeakUnknown
'L',--Weak0
'H',--Weak1
'-',--Don'tCare);
◆数组类型
TYPE数组名ISARRAY(范围)OF基类型
1,其中的“基类型”是已经定义过的类型,甚至可以是已经定义过的数组类型。
2,定义中的“范围”,既表示数组的大小,也说明用什么方式表示数组元素的下标。
通常,“范围”是用整数表示,也可以用枚举值表示
3,“范围”用整数表示时,整数范围可以是递增表示,也可以是递减表示:
TYPEregisterISARRAY(0TO7)OFBIT;
TYPEregist_1ISARRAY(7DOWNTO1)OFBIT;
TYPEromISARRAY(0TO7)OFregister;
rom类型实际上是用register基类型定义的二维数组,即
TYPEromISARRAY(0TO7,0TO7)OFBIT;
数组的范围还可以用已经定义过的枚举型来表示,如:
TYPElight_delayISARRAY(traffic_light)OFINTEGER;
这里的traffic-light是已经定义的枚举类型,有三个取值(“red、yellow、green”)。
将来定义的类型为light-delay的数组,也只会有三个元素。
在VHDL中,可以对数组的整体赋值:
如定义了regist_1类型的数组信号:
TYPEregist_1ISARRAY(7DOWNTO0)OFBIT;
SIGNALarr_1,arr_2:
regist_1;
以下的赋值操作在VHDL中都是允许的:
arr_1<="10110110";
arr_2<=arr_1;
◆子类型97页
希望对某种类型数据的范围加以限制
四、对象
VHDL把信号、变量、常量和文件统称为对象。
89页
1.常量的定义
CONSTANT常量名:
类型名:
=常量值;
例如:
CONSTANTarray_size:
INTEGER:
=16;
CONSTANTgate_delay:
TIME:
=50ns;
2.变量的定义
变量的定义采用如下的方式:
VARIABLE变量名:
类型名[:
=初值];
变量的赋值用“:
=”来表示。
变量的赋值没有延迟。
3.信号的定义
信号定义的方式:
SIGNAL信号名:
类型名[:
=初值];
信号的赋值用“<=”表示,有延迟,初始化不同于赋值
信号的传送可以规定延迟,也可以不规定延迟。
但是VHDL规定,如果没有指定信号传送的延迟,信号的传送也会有一个最小延迟Δ。
信号可以是全局定义的,PORT中定义的信号就是对所有的结构体都有效。
但是,信号也可以是局部定义的,在结构体内部定义的信号只对这个结构体有效。
五、词法单元87页
1.注释
◆以双连符(--)开始直到行末
2.VHDL中的数字
◆八进制:
以O开头,如O”340”
◆二进制:
以B开头,如B”11100000”
◆十六进制:
以X开头,如X”E0”
3.字符
◆文字字符表示形式为:
单引号括起来的ASCII字符,如’A’,’*’
4.字符串
文字字符串表示形式为:
双引号括起来的图形字符序列。
如”howareyou”,””等
5.位串
◆位串表示形式为:
双引号括起来的扩展的数字序列,数字序列前冠以基数说明符。
如:
B”11110101”--长度为八的二进制数,等效245
6.VHDL语句中使用的标点符号
分号(;)是一条语句结束的标志
逗号(,)是对象的分隔符
冒号(:
)和原点(.)的用法在每条语句中给出
六、表达式与运算符102页具体的运算符
和其他程序设计语言中的表达式很相似,一个表达式是由运算符把对象名、文字、函数调用及括起来的表达式连接起来的式子。
在一个VHDL表达式中,数据的类型应该相同。
如果不同的数据类型出现在同一个表达式,VHDL不会进行自动类型的转换,而只会给出错误信息。
VHDL支持运算符的重载。
例如可以对不同类型的信号各自进行AND运算。
七、VHDL的库和包
1.VHDL库的种类和使用
VHDL的库可以分为三种类型:
系统库,IEEE库、用户库。
系统库是VHDL语言本身预定义的库,包括STD库和WORK库。
STD库是系统的标准库,所有系统本身预定义的类型和有关的操作都包含在这个库中。
WORK库是用户的工作库。
对用户都是透明的,也就是随时都可以使用的,不需要在描述中专门说明。
IEEE库是IEEE认可的标准库,其中包括对于STD_LOGIC类型以及有关函数的定义。
用户库就是VHDL软件提供厂商开发的库,应该查询相应软件的说明。
2.程序包
一个VHDL库可以包含许多内容,并且往往以程序包(Package)的形式组织在一起。
一个程序包由两个部分构成:
包的说明部分(PackageDeclaration)和包的主体部分(PackageBody)。
基本的结构如下:
PACKAGE程序包名IS
程序包说明部分
END程序包名;
PACKAGEBODY程序包名IS
程序包主体描述
END程序包名;
说明部分可以包括:
常量说明;
信号说明,这里说明的信号可以被所有的结构体使用;
类型说明;
函数或过程说明;
部件(Component)说明,
程序包的主体部分则是对所包含的函数、过程、结构体进行具体的描述。
程序包示例
PACKAGEqit_utilitiesIS
TYPEqitIS('0’,‘1’,‘Z’,‘X’);
FUNCTION"AND"(a,b:
qit)RETURNqit;只是声明,有这个函数
FUNCTION"OR"(a,b:
qit)RETURNqit;
ENDqit_utilities;
PACKAGEBODYqit_utilitiesIS
FUNCTION"AND"(a,b:
qit)RETURNqitIS对函数的具体过程描述
CONSTANTqit_and_table:
qit_2d:
=(
('0','0','0','0'),
('0','1','1','X'),
('0','1','1','X'),
('0','X','X','X'));
BEGIN
RETURNqit_and_table(a,b);
END"AND";
FUNCTION"OR"(a,b:
qit)RETURNqitIS函数的定义方法71页例3-3比较
CONSTANTqit_or_table:
qit_2d:
=(
('0','1','1','X'),
('1','1','1','1'),
('1','1','1','1'),
('X','1','1','X'));
BEGIN
RETURNqit_or_table(a,b);
END"OR";
ENDqit_utilities;
以上的程序包中定义了一种4值逻辑及其操作。
在说明部分定义了一种新的信号类型qit,也就是一种4值逻辑,还说明了两个函数AND和OR,用来对4值逻辑进行“与”“或”运算。
在BODY部分实现了这两个函数。
3.库和程序包的引用77页
在所有的VHDL源程序都要首先声明使用什么VHDL库。
声明要使用关键字LIBRARY,例如,要使用IEEE库,使用这个库中的哪个程序包就应该作以下的声明:
LIBRARYIEEE;
USE库名.程序包名.ALL;包中所有内容可用
USE库名.程序包名.子程序名;包中选中内容可用
4.函数和过程前一页程序包的例子
VHDL中既可以使用函数,也可以使用过程(Procedure)。
两者统称为子程序。
函数的定义包括函数说明和函数主体两部分,基本的格式如下:
FUNCTION函数名(参数表)RETURN类型IS
BEGIN
函数体
END函数名;
函数体中一定要包括RETURN语句。
过程的定义和函数的定义非常相似:
PROCEDURE过程名(参数表)IS
BEGIN
过程体
END过程名;
过程没有返回值。
函数的参数传递总是一个方向的,也就是传入到函数,而过程的参数传递可以是两个方向的。
具体在过程执行中参数如何传递,取决于参数的类别(IN、OUT、INOUT等),而对于函数参数的类别,则只能有一种:
IN,就是输入到函数。
5.4VHDL程序的描述语句
可以有许多并行处理语句,这些语句的执行是可以同时进行的。
并行语句主要是信号传送语句。
传送时可以指定传输延迟。
如果传送时没有指定时延,VHDL会对并行处理语句的执行加上一个最小时延Δ。
一、并行赋值语句
并行赋值语句是最基本的VHDL语句,
它的格式是:
信号名<=表达式;
信号名<=表达式AFTER延迟时间;
例5.4半加器的数据流描述。
ENTITYhalf_adderIS
PORT(a,b:
INBIT;
s,c0:
OUTBIT);
ENDhalf_adder;
ARCHITECTUREh_adderOFhalf_adderIS
SIGNALc,d:
BIT;
BEGIN信号时非输入输出的中间量相c<=aORb;
d<=aNANDb;当于下一阶段的输入和上一阶段的输出?
c0<=NOTd;
s<=cANDd;
ENDh_adder;
二、条件赋值语句
条件赋值语句也是一种信号赋值语句,只是赋给信号的值可以根据条件的不同而不同。
条件赋值语句的格式如下:
信号名<=表达式1WHEN布尔表达式1ELSE
表达式2WHEN布尔表达式2ELSE
……
表达式nWHEN布尔表达式nELSE
表达式;
例5.5用条件赋值语句描述数据选择器。
ENTITYmux4_to_1IS
PORT(d0,d1,d2,d3,a,b:
INBIT;
y:
OUTBIT);
ENDmux4_to_1;
ARCHITECTUREsample_1OFmux4_to_1IS和例5.4比,没有需要中间信号
BEGIN
y<=d0WHENa='0'ANDb='0'ELSE
d1WHENa='0'ANDb='1'ELSE
d2WHENa='1'ANDb='0'ELSE
d3WHENa='1'ANDb='1';
ENDsample_1
三,选择信号赋值语句
选择信号赋值语句可以根据一个表达式的不同取值,给信号或者信号数组赋以不同的结果。
选择信号赋值语句的格式如下:
WITH表达式SELECT
信号名<=信号值1WHEN表达式值1,
信号值2WHEN表达式值2,
……
信号值nWHENothers;
例5.6用信号选择语句描述数据选择器。
ENTITYmux4_to_1IS
PORT(d0,d1,d2,d3,a,b:
INstd_logic;
y:
OUTstd_logic);
ENDmux4_to_1;
ARCHITECTUREsample_2OFmux4_to_1IS
BEGIN
WITHa&bSELECT
y<=d0WHEN"00",
d1WHEN"01",
d2WHEN"10",
d3WHEN"11",
'X'WHENOTHERS;
ENDsample_2;
5.4.2顺序描述语句
并行信号传输语句主要描述硬件电路或系统中信号的传送过程。
同时,VHDL还支持顺序描述语句,主要使用于对电路和系统的性能描述。
顺序描述语句的执行就和一般程序设计语言中语句相似,是按照语句的顺序依次执行的。
前一条语句的结果会影响到下一条语句的执行。
一、PROCESS语句132页
尽管PROCESS语句本身是并行描述语句,可以和其他并行语句同时执行,但是PROCESS语句内部的语句都是顺序语句。
PROCESS语句一旦开始执行,就要依次执行其中的顺序语句,一直到最后的ENDPROCESS为止。
PROCESS语句的格式如下:
PROCESS(信号1,…,信号k)用到的信号
变量说明(定义);
其他说明;
BEGIN
顺序语句
……
顺序语句
ENDPROCESS;
二、分支语句
两分支IF语句的格式:
多分支IF语句的格式:
IF布尔表达式IF布尔表达式
THEN顺序语句THEN顺序语句
ELSE顺序语句ELSIF布尔表达式
ENDIF;THEN顺序语句
ELSE顺序语句
ENDIF;
例5.7反向器的顺序描述。
ENTITYinverterIS
PORT(x:
INBIT;
y:
OUTBIT);
ENDinverter;
ARCHITECTUREbehaveOFinverterIS
BEGIN
PROCESS(x)只用到x作为判断条件
BEGIN
IF(x='0')THENy<=‘1';
ELSEy<=‘0';
ENDIF;
ENDPROCESS;
ENDbehave;
三、另外一种分支语句CASE语句
CASE语句是从多个可能的分支中选择一个分支进行操作。
CASE语句的格式如下:
CASE表达式IS
WHEN值1=>顺序语句1
……
WHEN值k=>顺序语句k
WHENOTHERS=>顺序语句k+1
ENDCASE;
例5.8四选一数据选择器的顺序描述。
ENTITYmux4_1IS
PORT(a,b,i0,i1,i2,i3:
INBIT;y:
OUTBIT);
ENDmux4_1;
ARCHITECTUREbehaveOFmux4_1IS
SIGNALselbit_vector(1DOWNTO0);
BEGIN
sel<=b&a;
PROCESS(sel,i0,i1,i2,i3)
BEGIN
CASEselIS
WHEN"00"=>y<=i0;
WHEN"01"=>y<=i1;
WHEN"10"=>y<=i2;
WHEN"11"=>y<=i3;
ENDCASE;
ENDPROCESS;
ENDbehave
四、循环语句
VHDL中提供了两种形式的循环语句:
FOR循环和WHILE循环。
FOR循环的格式如下:
FOR变量IN范围LOOP
顺序语句
……
顺序语句
ENDLOOP;
其中的“变量”和“范围”应该有相同的类型。
例如变量是整型,范围可以是一个整数范围。
如果变量是枚举型,则“范围”要限制在枚举类型所定义的取值范围内。
WHILE循环的格式如下:
WHILE布尔表达式LOOP
顺序语句
……
顺序语句
ENDLOOP;
WHILE循环中的布尔表达式可以是逻辑表达式或者关系表达式。
在FOR循环或者WHILE循环中都可以使用NEXT语句来结束本次循环,用EXIT语句来结束循环,到下一条顺序语句继续执行。
它们的格式基本相同:
NEXTWHEN布尔表达式;
EXITWHEN布尔表达式;
5.4.3VHDL的描述风格
在VHDL中对这一类的描述称为“性能”描述(行为描述),性能描述中一定有PROCESS语句。
VHDL还有另一种描述,称为“结构”描述。
1.性能描述(行为描述)
这种描述完全是从与非门输入和输出的逻辑关系出发,对与非门性能的一种描述。
2.数据流描述(RTL描述)
建立在并行信号赋值语句基础上。
当语句中任意一个输入信号的值发生改变时,赋值语句就被激活,从而认为数据从一个设计中“流入”,然后又“流出”
3.结构描述语句
结构描述是VHDL的三种描述方法之一。
结构描述的基础是部件:
COMPONENT。
所使用的部件应该是事先已经定义过的。
可以直接取自某个VHDL库,也可以是用户自定义的存放在WORK库的部件。
所用部件所在的库或程序包,必须在程序开始前声明。
在结构描述中所使用的部件必须首先声明。
部件的声明在ARCHTECTURE的声明部分进行。
部件声明语句(ComponentDeclaration)的格式如下:
COMPONENT部件名
PORT(信号名:
类别信号类型;
……
信号名:
类别信号类型);
ENDCOMPONENT;
部件描述语句
第一种格式的COMPONENT语句是:
标号:
部件名PORTMAP(信号名1,信号名2,…,信号名n);
在使用这种格式时,必须注意PORTMAP所列出的信号名应该和部件定义时的信号名的顺序相一致。
标号是部件的标识。
同样的部件在电路中可以使用多次,它们都有相同的部件名,但是有不同的标号
第二种格式是:
标号:
部件名PORTMAP(接口信号1=>信号名1,…,接口信号n=>信号名n);
采用这样的格式,就不要求COMPONENT语句中的信号名和ENTITY的
PORT部分的信号名保持顺序上的一致,而只要它们的对应关系正确就可以了。
例5.9全加器的结构描述。
使用前面已经定义过的半加器
ENTITYfull_adderIS
PORT(x,y,cin:
INBIT;
sum,carry:
OUTBIT);
ENDfull_adder;
ARCHITECTUREstructOFfull_adderIS
COMPONENThalf_adder部件声明
PORT(a,b:
INBIT;s,c0:
OUTBIT);
ENDCOMPONENT;
SIGNALh1_s,h1_c,h2_c:
BIT;
BEGIN
h1:
half_adderPORTMAP(x,y,h1_s,h1_c);部件描述第一种(如x对应声明中的a)
h2:
half_adderPORTMAP(a=>h1_s,b=>cin,s=>sum,c0=>h2_c);
第二种(h2中的a对应h1_s)第一个全家器的输出被第二个的输入对应
carry<=h2_cORh1_c;
ENDstruct;
5.5.2时序逻辑电路中的应用
一、时钟信号
时序逻辑电路中进程的敏感信号是时钟信号。
描述方式有两种:
(1)时钟信号显示地出现在PROCESS语句后面的敏感信号表中。
(2)时钟信号没有显示地出现在PROCESS语句后面的敏感信号表中,而是出现在WAIT语句的后面。
沿分为上升沿和下降沿。
(1)上升沿描述:
其物理意义是指时钟信号的逻辑值是从‘0’跳变到‘1’。
描述1:
PROCESS(clk)
BEGIN
IF(clk’EVENTANDclk=‘1’)THEN
┇
ENDPROCESS;
描述2:
label2:
PROC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 第五 复习 总结