VHDL必须掌握的知识点和相关例题整理.doc
《VHDL必须掌握的知识点和相关例题整理.doc》由会员分享,可在线阅读,更多相关《VHDL必须掌握的知识点和相关例题整理.doc(10页珍藏版)》请在冰点文库上搜索。
VHDL总复习之
必须要掌握的知识点和相关例题
目录
VHDL总复习之必须要掌握的知识点和相关例题 1
1. VHDL语言的基本设计实体和完整的VHDL语言程序的结构 2
2. 进程(PROCESS)语句的结构 2
3. VHDL语言子程序的结构 2
(1). 过程(Procedure) 2
(2). 函数(Function) 2
4. 过程与函数的主要区别 3
5. 进程和子程序中使用的语句 3
6. VHDL语言中客体的概念及使用范围 3
7. 信号和变量的区别及作用范围 3
8. VHDL语言的数据类型和运算操作 4
9. VHDL语言构造体的三种描述方式 4
10. COMPONENT(元件)语句和COMPONENT—INSTANT(元件例示)语句的功能和书写格式 5
11. VHDL语言的主要描述语句的功能、使用场合和语法格式 5
12. VHDL语言的命名规则 6
13. VHDL语言的数值类属性描述 6
14. VHDL语言的信号属性函数 7
15. 数值系统的定义方法,各种状态的含义 7
16. 采用有限状态机进行电路设计的基本方法 7
17. 仿真Δ延时引入的原因和对并发语句仿真结果的影响 8
18. 逻辑综合的概念与主要步骤 8
19. 运用VHDL语言和FPGA进行电路设计的主要步骤 8
VHDL的全称以及利用VHDL设计硬件电路所具有的特点
VeryHighSpeedIntegratedCircuit
HardwareDescriptionLanguage
(超高速集成电路硬件描述语言)
(1)设计文件齐全、方法灵活、支持广泛
(2) 系统硬件描述能力强
(3) VHDL语言可以与工艺无关编程
(4)VHDL语言标准、规范、易于共享和复用
1.VHDL语言的基本设计实体和完整的VHDL语言程序的结构
一个VHDL语言的基本设计实体由实体说明和构造体两个部分构成;
一个完整的VHDL语言程序包含5个部分:
实体、构造体、配置、包集合(程序包)和库。
2.进程(PROCESS)语句的结构
主要特点:
并发语句,由敏感信号量启动;内部的语句顺序执行,进程不能嵌套。
3.VHDL语言子程序的结构
VHDL语言子程序有两种类型:
过程、函数
(1).过程(Procedure)
在程序包中定义的格式(用户自定义过程的设计方法):
PACKAGE包集合名IS
PROCEDURE
过程名(参数1,参数2,…)
END包集合名;
PACKAGEBODY包集合名IS
PROCEDURE
过程名(参数1,参数2,…)IS
[定义语句]
BEGIN
[顺序处理语句];
END[过程名];
END包集合名;
过程调用的方法:
过程名(参数1,参数2,…);
过程调用语句属于并发语句。
(2).函数(Function)
在程序包中定义的格式(用户自定义函数的设计方法):
PACKAGE包集合名IS
FUNCTION函数名(参数1,参数2,…)
RETURN数据类型名
END包集合名;
PACKAGEBODY包集合名IS
FUNCTION函数名(参数1,参数2,…)
RETURN数据类型名IS
[(变量)定义语句]
BEGIN
[顺序处理语句];
RETURN[变量名];
END[函数名];
END包集合名;
函数调用的方法:
出现于语句的表达式中。
4.过程与函数的主要区别
函数只包含有输入参数,只有一个返回值;
过程即包含有输入参数,也包含输出参数或输入输出参数,可以有多个返回值,这些返回值通过过程中定义的输出参数带回。
5.进程和子程序中使用的语句
进程中和子程序的所有语句按顺序执行,只能使用顺序描述语句。
6.VHDL语言中客体的概念及使用范围
VHDL语言中可以赋予一个值的对象称为客体;
客体主要包括三种:
信号、常数、变量;
信号和常数为全局量,变量为局部量。
7.信号和变量的区别及作用范围
信号和变量值的代入不仅形式不同,而且操作过程也不相同。
变量的赋值使用赋值符“:
=”,信号的代入使用代入符“:
=”。
变量的赋值在赋值语句执行时立即生效,信号的代入在代入语句执行时并不立即发生,代入语句的处理和实际的代入过程是分开进行的。
实际的代入过程在进程(PROCESS)或子程序(SUBPROGRAM)语句执行完毕时发生,与代入语句的处理存在延时。
变量是局部量,作用范围是进程和子程序;信号是全局量,作用范围是构造体、实体和程序包。
例:
ARCHITECTUREbehaveOFxinhaoIS
……………………………
P1:
PROCESS(A,B,C,D)
BEGIN
D<=A;
X<=B+D;
D<=C;
Y<=B+D;
ENDPROCESS;
--------------------------------------------------------------------
ARCHITECTUREbehaveOFxinhao_bianliangIS
…………………………
P2:
PROCESS(A,B,C)
VARIABLED:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
D:
=A;
X<=B+D;
D:
=C;
Y<=A+D;
ENDPROCESS;
P1的运行结果:
X<=B+C,Y<=B+C
P2的运行结果:
X<=B+A,Y<=B+C
8.VHDL语言的数据类型和运算操作
1)VHDL语言具有十种标准的数据类型
2)用户定义的数据类型
包括枚举类型、数组类型、记录类型等
枚举数据类型的定义方法:
TYPE数据类型名IS(元素,元素,…)
3)VHDL语言共有4类运算操作:
逻辑运算(Logical)
关系运算(Relational)
算术运算(Arithmetic)
并置运算(Concatenation)
9.VHDL语言构造体的三种描述方式
行为描述方式
寄存器传输(数据流)描述方式
结构化描述方式
10.COMPONENT(元件)语句和COMPONENT—INSTANT(元件例示)语句的功能和书写格式
元件语句是最基本的描述语句,在构造体中用来(说明)调用已设计好的逻辑描述模块[即元件(COMPONENT)];
COMPONENT元件名
GENERIC说明;
PORT说明;
ENDCOMPONENT;
元件例示语句是在构造体的结构描述中不可缺少的一个基本语句,该语句将现成元件的端口信号映射成高层次设计电路中的信号,用来在构造体中产生一个现成元件的实例。
标号名:
元件名GENERICMAP(参数,参数,…)
PORTMAP(信号,信号,…);
11.VHDL语言的主要描述语句的功能、使用场合和语法格式
(1)主要的并发语句
•进程
•信号代入语句
•过程调用语句
•块语句
•元件例示语句(ComponentInstant)
•生成语句(Generate)
(2)主要的顺序语句
•WAIT语句
•信号代入语句
•变量赋值语句
•IF语句
•CASE语句
•循环语句(FOR循环,WHILE循环)
[注意:
GENERATE(生成)语句和COMPONENT—INSTANT(元件例示)语句是并发语句]
例:
八位行波计数器的设计
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYdffrIS
PORT(clk,clr,d:
INSTD_LOGIC;
q,qb:
OUTSTD_LOGIC);
ENDdffr;
ARCHITECTUREoneOFdffrIS
SIGNALqin:
STD_LOGIC;
BEGIN
q<=qin;
qb<=NOTqin;
PROCESS(clk,clr)
BEGIN
IFclr='1'THEN
qin<='0';
ELSIFclk'EVENTANDclk='1'THEN
qin<=d;
ENDIF;
ENDPROCESS;
ENDone;
ENTITYrplcontIS
PORT(clk,clr:
INSTD_LOGIC;
count:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDrplcont;
ARCHITECTUREoneOFrplcontIS
SIGNALcntints:
STD_LOGIC_VECTOR(8DOWNTO0);
COMPONENTdffrIS
PORT(clk,clr,d:
INSTD_LOGIC;
q,qb:
OUTSTD_LOGIC);
ENDCOMPONENT;
BEGIN
cntints(0)<=clk;
g1:
FORiIN0TO7GENERATE
dffx:
dffrPORTMAP(clk=>cntints(i),clr=>clr,
d=>cntints(i+1),q=>count(i),qb=>cntints(i+1));
ENDGENERATE;
ENDone;
12.VHDL语言的命名规则
注意:
名字的最前面应该是英文字母,不能连续使用下划线‘_’,名字的最后也不能使用‘_’。
13.VHDL语言的数值类属性描述
数值类属性用来得到数组、一般数据或程序块的有关值。
例:
•T'LEFT得到数值类或子类区间的最左端的值
•T'RIGHT得到数值类或子类区间的最右端的值
•T'HIGH得到数值类或子类区间的高端值
•T'LOW得到数值类或子类区间的低端值
14.VHDL语言的信号属性函数
此类描述函数用于获得信号的行为信息。
例:
•s'EVENT
如果事件发生,则返回“真”值,否则返回“假”值。
•s'LAST_EVENT
返回从前一个事件发生到现在所经历的时间值。
•s'LAST_VALUE
返回信号最后一次改变以前的值。
15.数值系统的定义方法,各种状态的含义
例:
九态数值系统由三种强度值和三种逻辑值组成:
强度值:
Z--高阻强度,R--电阻强度,F--强强度
逻辑值:
0--逻辑“0”,1--逻辑“0”,X--逻辑“X”
即:
Z0,Z1,ZX,R0,R1,RX,F0,F1,FX
可用枚举数据类型加以定义:
例:
四态数值系统的定义
TYPEfourstateIS(‘X’,‘0’,‘1’,‘Z’);
16.采用有限状态机进行电路设计的基本方法
有限状态机分为两类:
Moore型----输出信号仅与当前状态有关
Mealy型----输出信号不仅与当前状态有关,还与所有的输入信号有关
为了使综合工具可以将一个完整的VHDL源代码识别为有限状态机,必须还要遵循一定的描述规则规定,一个有限状态机的描述应该包括以下内容:
◆至少包括一个状态信号,它们用来指定有限状态机状态。
◆状态转移指定和输出指定,它们对应于控制步的转移条件。
◆时钟信号,它是用来进行同步的。
◆同步或异步复位信号。
描述方法:
(1)三进程描述
1.状态逻辑描述;2.状态寄存器描述;3.输出逻辑描述。
(2)双进程描述
1.一个进程描述三个中的任何两个;2.另外一个用一个进程
(3)单进程描述
状态逻辑,状态寄存器,输出逻辑描述合用一个进程。
状态机中的状态可用枚举数据类型数据进行定义。
17.仿真Δ延时引入的原因和对并发语句仿真结果的影响
用软件平台进行仿真,实际上对VHDL的“并发语句”也只能逐条地加以执行(处理),为了使语句的执行与硬件动作的结果一致,而与语句的顺序无关,就必须引入Δ延时,这样,软件就可按照电路的实际结构确定仿真顺序,仿真也就真实地模拟了硬件的动作,并且其仿真结果与语句的顺序无关。
因此,在进行VHDL程序设计时,对于构造体中的并发语句,设计者可以完全不考虑语句的顺序。
18.逻辑综合的概念与主要步骤
逻辑综合就是将较高抽象层次的描述转换为较低抽象层次的描述一种方法(或者说过程)。
就现有的逻辑综合工具而言,所谓就是将RTL级的描述转换为门级网表的过程。
主要步骤如下:
1.RTL描述转换为非优化的布尔等式描述
2.布尔等式优化
3.门级网表映射
19.运用VHDL语言和FPGA进行电路设计的主要步骤
1.VHDL程序设计
2.VHDL程序编译
3.VHDL程序仿真
4.生成网表文件
(含器件选择、端口分配,第二次编译)
5.下载FPGA器件
例:
1-365进制计数器(计数器结果由三个4位二进制数输出,且计数器由时钟的上升沿触发,计数器满时输出进位(溢出)脉冲,重新计数。
)
[计数范围:
0-364,或1-365均可]
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYbcd365countIS
PORT(clk,clr:
INSTD_LOGIC;
bcd1n:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
bcd10n:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
bcd100n:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
co:
OUTSTD_LOGIC:
='0'
);
ENDbcd365count;
ARCHITECTUREoneOFbcd365countIS
SIGNALbcd1ns,bcd10ns,bcd100ns:
STD_LOGIC_VECTOR(3DOWNTO0);
gp:
PROCESS(clk,clr)
BEGIN
IFclr='0'THEN
bcd1ns<="0001";
ELSIF(clk'EVENTANDclk='1')THEN
IF(bcd100ns=3ANDbcd10ns=6ANDbcd1ns=5)THEN
bcd1ns<="0001";
ELSIFbcd1ns=9THEN
bcd1ns<="0000";
ELSE
bcd1ns<=bcd1ns+1;
ENDIF;
ENDIF;
ENDPROCESS;
sp:
PROCESS(clk,clr)
BEGIN
IFclr='0'THEN
bcd10ns<="0000";
ELSIF(clk'EVENTANDclk='1')THEN
IF(bcd100ns=3ANDbcd10ns=6ANDbcd1ns=5)OR(bcd10ns=9ANDbcd1ns=9)THEN
bcd10ns<="0000";
ELSIFbcd1ns=9THEN
bcd10ns<=bcd10ns+1;
ENDIF;
ENDIF;
ENDPROCESS;
bp:
PROCESS(clk,clr)
BEGIN
IFclr='0'THEN
bcd100ns<="0000";
ELSIF(clk'EVENTANDclk='1')THEN
IF(bcd100ns=3ANDbcd10ns=6ANDbcd1ns=5)THEN
bcd100ns<="0000";
ELSIF(bcd10ns=9ANDbcd1ns=9)THEN
bcd100ns<=bcd100ns+1;
ENDIF;
ENDIF;
ENDPROCESS;
cp:
PROCESS(bcd1ns,bcd10ns,bcd100ns)
BEGIN
IF(bcd100ns=3)AND(bcd10ns=6)AND(bcd1ns=5)THEN
co<='1';
ELSE
co<='0';
ENDIF;
ENDPROCESS;
bcd1n<=bcd1ns;
bcd10n<=bcd10ns;
bcd100n<=bcd100ns;
ENDone;