VHDL.docx
- 文档编号:7470912
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:29
- 大小:834.80KB
VHDL.docx
《VHDL.docx》由会员分享,可在线阅读,更多相关《VHDL.docx(29页珍藏版)》请在冰豆网上搜索。
VHDL
并行语句结构是最具硬件描述语言特色的,在VHDL程序中各种并行语句在结构体中的执行是同步进行的,也就是说并行语句的执行与书写的顺序无关。
并行语句的七种基本语句是:
Ø并行信号赋值语句
Ø进程语句
Ø块语句
Ø条件信号赋值语句
Ø元件例化语句
Ø生成语句
Ø并行过程调用语句。
并行语句在结构体中的使用格式为:
ARCHITECTURE结构体名OF实体名IS
说明语句
BEGIN
并行语句
ENDARCHITECTURE结构体名;
8.1进程语句
进程语句本身是一种并行语句,在结构体中可以有多个进程语句以及其他并行语句并行存在。
进程语句的设计实例
例—1)一位十进制加法计数器(加一操作)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164,ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcnt10IS
PORT(clr:
INSTD_LOGIC;
in1:
INSTD_LOGIC_VECTOR(3DOWNTO0);
out1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
END;
ARCHITECTUREbhvOFcnt10IS
BEGIN
PROCESS(in1,clr)--------敏感信号中无时钟信号,为组合进程。
BEGIN
IF(clr=’1’ORin1=“1001”)THEN
out1<=“0000”;---当有清零信号或输入数据为9时输出0
ELSE
Out1<=in1+1;---否则加一操作(+号使用了重装载算符)
ENDIF;
ENDPROCESS;
END;
形成组合电路
例—2)一位十进制加法计数器(同步清零)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164,ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcnt10IS
PORT(clr:
INSTD_LOGIC;
clk:
INSTD_LOGIC;
out1:
BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));
END;
ARCHITECTUREbhvOFcnt10IS
BEGIN
PROCESS
BEGIN
WAITUNTILclk’EVENTANDclk=’1’;---时钟为敏感信号,为时序进程。
IF(clr=’1’ORout1=“1001”)THEN
out1<=“0000”;---当有清零信号或输出数据为9时输出0(同步清零)
ELSE
out1<=out1+1;---否则加一操作(+号使用了重装载算符)
ENDIF;
ENDPROCESS;
END;
形成时序电路
例—3)可预置一位十进制加法计数器(异步置数、清零,同步计数)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164,ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcnt10IS
PORT(in1:
INSTD_LOGIC_VECTOR(3DOWNTO0);
Clr,en,clk:
INSTD_LOGIC;
out1:
BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));
END;
ARCHITECTUREbhvOFcnt10IS
BEGIN
PRO1:
PROCESS(en,clr,clk)-----------(异步清零、异步置数、同步计数)
BEGIN
IF(clr=’1’ORout1=“1001”)THEN---当有清零信号和数据为9时输出0。
(异步清零)
out1<=“0000”;
ELSIF(en=’1’)THEN
out1<=in1;
ELSIF(clk’EVENTANDclk=’1’)THEN
out1<=out1+1;---否则加一操作(+号使用了重装载算符)
ENDIF;
ENDPROCESSPRO1;注意条件的优先级
END;
例—3)可预置一位十进制加法计数器(同步置数、异步清零,同步计数)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164,ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYcnt10IS
PORT(in1:
INSTD_LOGIC_VECTOR(3DOWNTO0);
Clr,en,clk:
INSTD_LOGIC;
out1:
BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));
END;
ARCHITECTUREbhvOFcnt10IS
BEGIN
PRO1:
PROCESS(clr,clk)----------(同步置数)
BEGIN
IF(clr=’1’ORout1=“1001”)THEN---当有清零信号和数据为9时输出0。
(异步清零)
out1<=“0000”;
ELSIF(en=’1’)THEN-----如果以上条件不成立说明是clk启动的进程
out1<=in1;
ELSIF(clk’EVENTANDclk=’1’)THEN
out1<=out1+1;---否则加一操作(+号使用了重装载算符)
ENDIF;
ENDPROCESS;
END;
8.2块语句
块语句本身是并行语句结构,其内部也都是由并行语句构成的(包括进程)。
与其它的并行语句相比,块语句本身并没有独特的功能,他只是一种并行语句的组合方式,利用它可将程序编排得更有层次,可读性更强。
块的引入并不会影响原来的电路功能。
8.3并行信号赋值语句
并行信号赋值语句有三种形式:
Ø简单信号赋值语句
Ø条件信号赋值语句
Ø
选择信号赋值语句
●在结构体内的所有并行信号赋值语句的执行都是同时发生的,与书写顺序无关。
●只要赋值源发生变化赋值语句将被启动,且是完全独立于其他语句的。
●以上三种形式都可以直接出现在结构体中。
8.3.1简单信号赋值语句
简单信号赋值语句格式如下:
赋值目标<=表达式(赋值源)
例并行的简单赋值操作---------以下5条信号赋值语句的执行是并行发生的
ARCHITECTUREbhvOFbc1IS
SIGNALs1:
STD_LOGIC;
BEGIN
output1<=aANDb;
output2<=c+d;
B1:
BLOCK
SIGNALe,f,g,h:
STD_LOGIC;-------------------信号无方向
BEGIN
g<=eOFf;----无赋值源应加e<=a;f<=b;
h<=eXORg;
ENDBLOCKB1;
s1<=g;-----g说明在块内而是用在块外
END;改错
8.3.1条件信号赋值语句
条件信号赋值语句格式如下:
赋值目标<=表达式WHEN赋值条件ELSE
表达式WHEN赋值条件ELSE
………
表达式;
Ø条件信号赋值语句的执行顺序与书写的顺序相同,第一句具有最高赋值优先级。
(条件语句一般是有顺序的如if语句)
Ø赋值条件的数据类型应该是布尔型。
Ø赋值条件中可以同时有多项满足(重叠),但按优先级最高的赋值。
Ø最后一项可以不跟条件子句,表示OTHER.
Ø每一个子句后无标点符号,最后一句有分号。
Ø条件信号赋值语句与CASE语句的区别:
●CASE语句是同一数据对象或表达式的不同取值的判断,执行的是不同的顺序语句,且条件不能重叠。
CASE表达式IS
WHEN选择值=>顺序语句;
WHEN选择值=>顺序语句;
………
WHEN选择值(OTHERS)=>顺序语句;
ENDCASE;
●条件信号赋值语句可以是不同的数据对象的不同条件的判断,而执行的却是向同一目标赋值,且条件可以有重叠。
赋值目标<=表达式WHEN赋值条件ELSE
表达式WHEN赋值条件ELSE
………
表达式;
例条件赋值操作
z<=aWHENp1=‘1’ELSE
bWHENp2=‘1’ELSE
c;
…………
当p1和p2同时为1时,z获得的赋值是a.
8.3.2选择信号赋值语句
选择信号赋值语句格式如下:
WITH选择表达式SELECT
赋值目标<=表达式WHEN选择值,
表达式WHEN选择值,
………
表达式WHEN选择值;
Ø选择信号赋值语句与CASE语句十分相似,但不能应用于进程语句中。
ØCASE语句的启动是靠进程语句的敏感信号,选择信号赋值语句的启动是靠选择表达式的变化。
Ø与CASE语句相同,选择信号赋值语句对条件选择值的测试具有同期性,与书写的顺序无关,因此不允许有条件重叠现象和条件涵盖不全的现象。
Ø选择信号赋值语句的每一子句结尾是逗号。
例逻辑运算的指令编码器
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164,ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdecoderIS
PORT(a,b,c:
INSTD_LOGIC;
data1,data2:
INSTD_LOGIC;
dataout:
OUTINSTD_LOGIC);
END;
ARCHITECTUREbhvOFdecoderIS
SIGNALinstruction:
STD_LOGIC_VECTOR(2DOWNTO0)
BEGIN
Instrction<=c&b&a;-----------------输入数据并置为逻辑操作指令
WITHinstructionSELECT
dataout<=data1ANDdata2WHEN“000”,
data1ORdata2WHEN“001”,
data1NANDdata2WHEN“010”,
data1NORdata2WHEN“011”,
data1XORdata2WHEN“100”,
data1XNORdata2WHEN“101”,
‘Z’WHENOTHERS;
END;
8.4并行过程调用语句
并行过程调用语句可以作为一个并行语句直接出现在结构体中(函数调用不同)。
并行过程调用语句格式:
过程名(关联参量名);
过程调用实例----3位整数大小排序
PACKAGEdata_typesIS-----定义程序包(包首,包体不是必须的)
SUBTYPEdata_elementISINTEGERRANGE1TO3;-------定义数据子类型
TYPEdata_arrayISARRAY(1TO3)OFdata_element;
ENDdata_types;
USEWORK.data_types.ALL;
ENTITYsortIS
PORT(in_array:
INdata_array;
Out_array:
OUTdata_array);
END;
ARCHITECTUREbehaveOFsortIS
BEGIN
PROCESS(in_array)
PROCEDUREswap(data:
INOUTdata_array;-----------过程体(过程首不是必须的)
Low,high:
INdata_element)IS---swap的形参是data,Low,high
VARIABLEtemp:
data_element;
BEGIN
IF(data(low)>data(high))THEN------Low,high为数组data的下标
Temp:
=data(low);
data(low):
=data(high);
data(high):
=temp;
ENDIF;
ENDswap;
VARIABLEmy_array:
data_array;
BEGIN
my_array:
=in_array;
swap(my_array,1,2);---------过程调用my_array,1,2是对应data,Low,high的实参
swap(my_array,2,3);----------位置关联
swap(my_array,1,2);
out_array<=my_array;
ENDPROCESS
END;
8.5元件例化语句
8.6生成语句
8.5元件例化语句
元件例化是在当前的设计实体中引入第一级的设计实体(元件),它相当于在系统板上插入IC或IP核。
它可以是FPGA库中的元件,也可以是用户子自定义元件。
元件例化格式:
COMPONENT元件名IS------元件定义语句(用户自定义,如EDA
GENERIC(类属表);软件库中已经定义过可不定义)
PORT(端口名表);
ENDCOMPONENT元件名:
例化名:
元件名PORTMAP([端口名=>]连接端口名,….);-------元件例化语句
例:
与门的元件例化(四输入或门)
例
LIBRARYIEEE;----------------------下一层设计(二输入与非门)
USEIEEE.STD_LOGIC_1164,ALL;
ENTITYnd2IS
PORT(a,b:
INSTD_LOGIC;
c:
OUTINSTD_LOGIC);
END;
ARCHITECTUREbhvOFnd2IS
BEGIN
c<=aANDb;
END;
LIBRARYIEEE;-----------------顶层设计(四输入或门)
USEIEEE.STD_LOGIC_1164,ALL;
ENTITYord4IS
PORT(a1,b1,c1,d1:
INSTD_LOGIC;
z1:
OUTINSTD_LOGIC);
END;
ARCHITECTUREbhvOFord4IS
BEGIN
COMPONENTnd2---------------------元件定义语句(可选)
PORT(a,b:
INSTD_LOGIC;
c:
OUTINSTD_LOGIC);
ENDCOMPONENT;
SIGNALx,y:
STD_LOGIC;
BEGIN
U1:
nd2PORTMAP(a1,b1,x)-------------------------------位置关联--------元件例化语句
U2:
nd2PORTMAP(a=>c1,c=>y,b=>d1);-------------名字关联
U3:
nd2PORTMAP(x,y,c=>z1);----------------------混合关联
END;
Ø元件例化与子程序调用的区别:
子程序调用属于同一设计层次(同一实体),而元件例化属于不同设计层次(实体中插入实体)。
Ø
VHDL元件例化语句并不优于图形输入方式。
8.6类属映射语句
类属映射语句应用于元件例化语句中的元件规模参数的设定,为例化中的元件规模的改变提供了极大方便。
类属映射语句格式:
GENERICMAP(类属表);
8.7块生成语句(GENERATE)
生成语句是根据条件或要求将并行语句进行多次复制。
生成语句的格式:
[标号:
]FOR循环变量IN取值范围GENERATE
说明
BEGIN
并行语句----------------要复制的并行语句
ENDGENERATE[标号];
[标号:
]IF条件GENERATE
说明
BEGIN
并行语句----------------要复制的并行语句
ENDGENERATE[标号];
Ø生成语句多数用于产生一组完全相同的元件例化或过程调用。
Ø生成语句不能用于函数调用。
Ø生成语句可以嵌套,在嵌套时标号是必需的。
例复制元件例化
………
COMPONENTcomp
PORT(x:
INSTD_LOGIC;
y:
OUTSTD_LOGIC);
ENDCOMPONENT;
SIGNALa:
STD_LOGIC_VECTOR(0TO7);
SIGNALb:
STD_LOGIC_VECTOR(0TO7);
……….
gen:
FORiINa’RANGEGENERATE
u1:
compPORTMAP(x=>a(i),y=>b(i));
ENDGENERATEgen;
………
8.8属性描述与定义语句
VHDL中预定义了多种数据对象或其他项目的属性,可用于监测和统计。
属性描述语句格式:
属性测试项目名’属性标识符;
1.信号类属性(信号属性函数EVENT和STABLE)
ØEVENT表示某信号在当前的一个极小的时间段δ内发生的事件,也就是该信号的电平发生变化。
如:
clock’EVENT用来测试信号clock的电平变化,返回值为true。
如果改写为clock’EVENTANDclock=’1’则测试的是上升沿。
ØSTABLE的测试功能与EVENT相反,它是信号在δ时间段内无事件发生,则返还TRUE值。
如:
(NOTclock’STABLEANDclock=’1’)监测的还是上升沿。
2.数据区间类属性
数据区间属性格式
数据对象’RANGE(N)
-----------------------------------------------------------
数据对象’REVERSE_RANGE(N)
Ø数据对象’RANGE(N)表示某一数据对象的取值范围,返回值为定义的数据范围。
……
SIGNALrange1:
INSTD_LOGIC_VECTOR(0TO7)
……..
FORiINrange1’RANGELOOP
如:
’RANGE与数据类型数名中的RANGE不同如:
SUBTYPEshortISINTEGERRANGE0TO15;
Ø数据对象’REVERSE_RANGE表示某一数据对象的取值范围,返回值为与定义的顺序相反的数据范围。
……
SIGNALrange1:
INSTD_LOGIC_VECTOR(0TO7)
……..
FORiINrange1’REVERSE_RANGELOOP
如:
返回值为(7DOWNTO0)
状态机是一种对按顺序工作的数字系统的描述,其工作方式是按预定的顺序或条件实现系统的状态的相互转换,是纯硬件数字系统中的顺序控制电路。
采用VHDL设计有限状态机有很多优越性。
Ø比纯硬件系统设计更灵活,可以实现远离硬件的设计方式。
Ø运行的速度和可靠性优于CPU。
Ø有利于克服电路中的毛刺现象,设计方案有多种选择。
9.1一般有限状态机的设计
用VHDL设计的状态机的一般结构由以下4部分组成:
Ø说明部分
Ø主控时序进程
Ø主控组合进程
Ø辅助进程。
1.说明部分
说明部分是用来完成描述各状态数据对象的数据类型,一般定义为枚举类型,且放在ARCHITECTURE和BEGIN之间。
ARCHITECTURE……IS
TYPEstatesIS(st0,st1,st2,st3,st4);
SIGNALcurrent_state,next_state:
states;
……..
BEGIB
……….
如:
ARCHITECTURE……IS
TYPEweekIS(sun,mon,tue,wed,thu,fri,sat);
SIGNALcurrent_day,next_day:
week;
……..
BEGIB
……….
枚举类型文字元素的编码通常是在综合时自动设置的,一般将第一个枚举元素(最左边)编码为‘000’等。
2.主控时序进程
主控时序进程是指负责状态转换的进程,其作用就是在时钟的作用下将“现态”转换为“次态”的操作,一般不负责次态方案的选择。
3.主控组合进程
主控组合进程是指选择次态的进程,其作用是根据当前状态和外部信号(指令)等决定次态的取向,并将此次态传递给主控时序进程和输出控制信号。
4.辅助进程
辅助进程是配合状态机工作的组合或时序进程。
状态机状态图
有限状态机工作原理框图
状态机工作时序图(moore状态机)
9.2Moore型有限状态机的设计
Moore形有限状态机是同步状态机,其输出只是当前状态的函数(依赖于时钟)。
9.2.1AD574采样控制器设计(三进程有限状态机)
设计方法:
1.分析工作逻辑与时序
2.画出逻辑状态图
3.画出逻辑结构图
4.编写程序代码
AD574逻辑控制真值表
以上的COM1和COM2可以合并成一个进程。
9.2.1单进程Moore型有限状态机
为了克服纯组合进程输出的控制信号产生毛刺现象,可以采用混合进程方式,即组合进程和时序进程在同一个进程中。
单进程Moore型有限状态机克服毛刺的方法是采用同步锁存输出方案,即由锁存器在时钟控制下同步输出,从而避免竞争冒险现象。
缺点是输出时间比多进程方式晚一个时钟周期。
例:
由于CASE语句是在每次时钟上升沿处启动的,因此其对应的赋值语句(Q
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VHDL