VHDL语句.docx
- 文档编号:25488974
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:27
- 大小:154.26KB
VHDL语句.docx
《VHDL语句.docx》由会员分享,可在线阅读,更多相关《VHDL语句.docx(27页珍藏版)》请在冰豆网上搜索。
VHDL语句
VHDL的顺序语句和并行语句
一、顺序语句
顺序语句只能出现在进程(PROCESS)、子程序(过程(PROCEDURE)和函数(FUNCTION))中,其特点与传统的计算机编程语句类似,是按程序书写的顺序自上而下、一条一条地执行。
利用顺序语句可以描述数字逻辑系统中的组合逻辑电路和时序逻辑电路。
VHDL的顺序语句有赋值语句、流程控制语句、等待语句、子程序调用语句、返回语句、空操作语句等六类。
<1>赋值语句
赋值语句的功能是将一个值或一个表达式的运算结果传递给某一个数据对象。
(1)变量赋值语句
格式:
目标变量名:
=赋值源(表达式);
例如:
x:
=5.0;
(2)信号赋值语句
格式:
目标信号名<=赋值源;
例如:
y<=‘1’;
说明:
该语句若出现在进程或子程序中则是顺序语句,若出现在结构体中则是并行语句。
(3)数组元素赋值
例如:
SIGNALa,b:
STDLOGICVECTOR(1TO4);
a<=“1101”;
a(1TO2)<=“10”;
a(1TO2)<=b(2TO3);
<2>流程控制语句
通过条件控制开关决定是否执行一条或几条语句,或重复执行一条或几条语句,或跳过一条或几条语句。
流程控制语句共有5种:
IF语句CASE语句LOOP语句NEXT语句EXIT语句
(1)IF语句
1、IF条件句Then顺序语句
ENDIF;
2、IF条件句Then顺序语句
ELSE顺序语句
ENDIF;
3、IF条件句Then顺序语句
ELSIF条件句Then顺序语句
...
ELSE顺序语句
ENDIF
4、IF条件句Then
IF条件句Then
...
ENDIF
ENDIF
例子:
8线-3线优先编码器的设计
LIBRARYIEEE;
USEIEEE.STDLOGIC1164.ALL
ENTITYcoderIS
PORT(a:
INSTDLOGICVECTOR(0TO7);
y:
OUTSTDLOGICVECTOR(0TO2));
ENDcoder;
ARCHITECTUREexample2OFcoderIS
BEGIN
PROCESS(a)
BEGIN
IF(a(7)=‘0’)THENy<=”111”;
ELSIF(a(6)=’0’)THENy<=”011”;
ELSIF(a(5)=’0’)THENy<=”101”;
ELSIF(a(4)=’0’)THENy<=”001”;
ELSIF(a(3)=’0’)THENy<=”110”;
ELSIF(a
(2)=’0’)THENy<=”010”;
ELSIF(a
(1)=’0’)THENy<=”100”;
ELSEy<=”000”;
ENDIF;
ENDPROCESS;
ENDexample2;
(2)CASE语句
格式:
CASE表达式IS
When选择值=>顺序语句;When选择值=>顺序语句;
…
WhenOTHERS=>顺序语句;
ENDCASE;
说明:
“=>”不是运算符,相当“THEN”。
选择值:
单个普通数值,如6。
数值选择范围,如(2TO4),表示取值为2、3或4。
并列数值,如35,表示取值为3或者5。
混合方式,以上三种方式的混合。
例子:
用CASE语句描述4选1数据选择器
LIBRARYIEEE;
USEIEEE.STDLOGIC1164.ALL
ENTITYmux41IS
PORT(s1,s2:
INSTDLOGIC;
a,b,c,d:
INSTDLOGIC;
z:
OUTSTDLOGIC);
ENDmux41;
ARCHITECTUREexample3OFmux41IS
SIGNALs:
STDLOGICVECTOR(1DOWNTO0)
BEGIN
s<=s1&s2
PROCESS(s1,s2,a,b,c,d)
BEGIN
CASEsIS
WHEN“00”=>z<=a;
WHEN“01”=>z<=b;
WHEN“10”=>z<=c;
WHEN“11”=>z<=d;
WHENOTHERS=>z<=‘X’;
ENDCASE;
ENDPROCESS;
ENDexample3;
(3)LOOP语句
1、单个LOOP语句,其语法格式如下:
[LOOP标号:
]LOOP
顺序语句
ENDLOOP[LOOP标号];
...
例子:
L2:
LOOP
a:
=a+1;
EXITL2WHENa>10;--当a大于10时跳出循环
ENDLOOPL2;
2、FOR_LOOP语句,语法格式如下:
[LOOP标号:
]FOR循环变量IN循环次数范围LOOP
顺序语句
ENDLOOP[LOOP标号];
说明:
循环次数范围形式可以为:
初值(小)TO终值(大)
初值(大)DOWNTO终值(小)
例子1:
SIGNALa,b,c:
STD_LOGIC_VECTOR(1TO3);
...
FORnIN1To3LOOP
a(n)<=b(n)ANDc(n);
ENDLOOP;
此段程序等效于顺序执行以下三个信号赋值操作:
a
(1)<=b
(1)ANDc
(1);
a
(2)<=b
(2)ANDc
(2);
a(3)<=b(3)ANDc(3);
例子2:
8位奇偶校验器的描述
LIBRARYIEEE;
USEIEEE.STDLOGIC1164.ALL
ENTITYpcheckIS
PORT(a:
INSTD_LOGIC_VECTOR(7DOWNTO0);
y:
OUTSTDLOGIC);
ENDpcheck;
ARCHITECTUREexample4OFpcheckIS
BEGIN
PROCESS(a)
VARIABLEtemp:
STD_LOGIC;
BEGIN
temp:
='0';
FORnIN7DOWNTO0LOOP
temp:
=tempXORa(n);
ENDLOOP;
y<=temp;
ENDPROCESS;
ENDexample4;
(4)NEXT语句
1、NEXT;--第一种语句格式
2、NEXTLOOP标号;--第二种语句格式
3、NEXTLOOP标号WHEN条件表达式;--第三种语句格式
功能:
1、NEXT——无条件结束本次循环
2、NEXT标号——结束本次循环,从“标号”规定的位置继续循环;
3、NEXTWHEN条件——当“条件”满足时结束本次循环,否则继续循环。
例子:
...
L1:
FORcnt_valueIN1TO8LOOP
s1:
a(cnt_value):
='0';
NEXTWHEN(b=c);
s2:
a(cnt_value+8):
='0';
ENDLOOPL1;
(5)EXIT语句
1、EXIT;--第一种语句格式
2、EXITLOOP标号;--第二种语句格式
3、EXITLOOP标号WHEN条件表达式;--第三种语句格式
功能:
1、EXIT——无条件跳出循环
2、EXIT标号——跳出循环,从“标号”规定的位置开始循环;
3、EXITWHEN条件——当“条件”满足时跳出循环,否则继续循环。
例子:
SIGNALa,b:
STD_LOGIC_VECTOR(1DOWNTO0);
SIGNALa_less_then_b:
Boolean;
...
a_less_then_b<=FALSE;--设初始值
FORiIN1DOWNTO0LOOP
IF(a(i)='1'ANDb(i)='0')THEN
a_less_then_b<=FALSE;EXIT;--a>b
ELSIF(a(i)='0'ANDb(i)='1')THEN
a_less_then_b<=TRUE;EXIT;--a
ELSENULL;
ENDIF;
ENDLOOP;--当i=1时返回LOOP语句继续比较
<3>WAIT语句
WAIT;--第一种语句格式
WAITON信号表;--第二种语句格式
WAITUNTIL条件表达式;--第三种语句格式
WAITFOR时间表达式;--第四种语句格式,超时等待语句
各种语句格式功能:
格式一:
无条件将运行的程序挂起;
格式二:
WAITON敏感信号表;
将运行的程序挂起直至敏感信号表中的任一信号发生变化时结束挂起,重新执行程序。
格式三:
WAITUNTIL条件表达式;
将运行的程序挂起直至表达式中的敏感信号发生变化,而且满足表达式设置的条件时结束挂起,重新执行程序。
格式四:
在此语句中定义了一个时间段,从执行到WAIT语句开始,在此时间段内,进程处于挂起状态,当超过这一时间段后,进程自动恢复执行。
注意:
含WAIT语句的进程PROCESS的括弧中后不能加敏感信号,否则是非法的,例如
PROCESS(s1,s2)
例子1:
(a)WAIT_UNTIL结构(b)WAIT_ON结构
...LOOP
Waituntilenable='1';Waitonenable;
...EXITWHENenable='1';
ENDLOOP;
格式:
WAITUNTIL信号=Value;--
(1)
WAITUNTIL信号’EVENTAND信号=Value;--
(2)
WAITUNTILNOT信号’STABLEAND信号=Value;--(3)
例子2:
WAITUNTILclock='1';
WAITUNTILrising_edge(clock);
WAITUNTILNOTclock’STABLEANDclock='1';
WAITUNTILclock='1'ANDclock’EVENT;
例子3:
PROCESS
BEGIN
rst_loop:
LOOP
WAITUNTILclock='1'ANDclock’EVENT;--等待时钟信号
NEXTrst_loopWHEN(rst='1');--检测复位信号rst
x<=a;--无复位信号,执行赋值操作
WAITUNTILclock='1'ANDclock’EVENT;--等待时钟信号
NEXTrst_loopWhen(rst='1');--检测复位信号rst
y<=b;--无复位信号,执行赋值操作
ENDLOOPrst_loop;
ENDPROCESS;
<4>RETURN语句
返回语句RETURN有两种语句格式:
RETURN;--第一种语句格式
RETURN表达式;--第二种语句格式
例子:
PROCEDURErs(SIGNALs,r:
INSTD_LOGIC;
SIGNALq,nq:
INOUTSTD_LOGIC)IS
BEGIN
IF(s='1'ANDr='1')THEN
REPORT"Forbiddenstate:
sandrarequualto'1'";
RETURN;
ELSE
q<=sANDnqAFTER5ns;
nq<=sANDqAFTER5ns;
ENDIF;
ENDPROCEDURErs;
<5>空操作语句
格式:
NULL;
功能:
不完成任何操作,但它可以在某些程序语句中实现运行流程的转接。
例子:
CASEOpcodeIS
WHEN"001"=>tmp:
=regaANDregb;
WHEN"101"=>tmp:
=regaORregb;
WHEN"110"=>tmp:
=NOTrega;
WHENOTHERS=>NULL;
ENDCASE;
<6>子程序调用语句
1.过程调用
过程名[([形参名=>]实参表达式
{,[形参名=>]实参表达式})];
例子:
ENTITYsort4is
GENERIC(top:
INTEGER:
=3);
PORT(a,b,c,d:
INBIT_VECTOR(0TOtop);
ra,rb,rc,rd:
OUTBIT_VECTOR(0TOtop));
ENDsort4;
ARCHITECTUREmuxesOFsort4IS
PROCEDUREsort2(x,y:
INOUTBIT_VECTOR(0TOtop))is
VARIABLEtmp:
BIT_VECTOR(0TOtop);
BEGIN
IFx>yTHENtmp:
=x;x:
=y;y:
=tmp;
ENDIF;
ENDsort2;
BEGIN
PROCESS(a,b,c,d)
VARIABLEva,vb,vc,vd:
BIT_VECTOR(0TOtop);
BEGIN
va:
=a;vb:
=b;vc:
=c;vd:
=d;
sort2(va,vc);
sort2(vb,vd);
sort2(va,vb);
sort2(vc,vd);
sort2(vb,vc);
ra<=va;rb<=vb;rc<=vc;rd<=vd;
ENDPROCESS;
ENDmuxes;
2.函数调用
略。
二、VHDL并行语句
并行语句结构是硬件描述语言的特色。
在VHDL语言中,并行语句有多种语句格式。
VHDL语句的特性:
1、各种并行语句在结构体中的执行是同步进行。
其执行方式与书写顺序无关。
2、并行语句在执行中,并行语句间交换信息。
也可以相互独立、互不相关或异步运行(如多时钟情况)。
3、并行语句内部有并行执行方式和顺序执行方式。
结构体中的并行语句模块
注意:
并行过程调用语句(ConcurrentProcedureCalls)。
参数传递映射语句
端口说明语句
并行语句在结构体中的使用格式
ARCHITECTURE结构体名OF实体名IS
说明语句
BEGIN
并行语句;
ENDARCHITECTURE结构体名;
<1>并行信号赋值语句
1.简单信号赋值语句
格式:
赋值目标<=表达式;
例如:
output1<=aANDb;
规则:
赋值目标必须是信号,而且出现在结构体或块语句中
例子:
ARCHITECTUREcurtOFbc1IS
SIGNALs1,e,f,g,h:
STD_LOGIC;
BEGIN
output1<=aANDb;
output2<=c+d;
g<=eORf;
h<=eXORf;
s1<=g;
ENDARCHITECTUREcurt;
2.条件信号赋值语句
格式:
赋值目标<=表达式WHEN赋值条件ELSE
表达式WHEN赋值条件ELSE
...
表达式;
例如:
对4选1多路选择器的描述
…
z<=aWHENs=”00”ELSE
bWHENs=”01”ELSE
cWHENs=”10”ELSE
d;
…
3.选择信号赋值语句
格式:
WITH选择表达式SELECT
赋值目标信号<=表达式WHEN选择值,--以“,”号结束
表达式WHEN选择值,
…
表达式WHEN选择值;--以“;”号结束
例子:
WITHseltSELECT
muxout<=aWHEN0|1,--0或1
bWHEN2TO5,--2或3,或4或5
cWHEN6,
dWHEN7,
'Z'WHENOTHERS;
<2>子程序和并行过程调用语句
VHDL中的子程序(SUBPROGRAM)有两种类型:
过程(PROCEDURE)和函数(FUNCTION)。
1、过程(PROCEDURE)语句
格式:
PROCEDURE过程名(参数表);--过程首
PROCEDURE过程名(参数表)IS--过程体
[说明部分]
BEGIN
顺序语句;
ENDPROCEDURE过程名;
例如:
PROCEDUREadder(SIGANLa,b:
INSTD_LOGIC_VECTOR;
sum:
OUTSTD_LOGIC)
PROCEDUREadder(SIGANLa,b:
INSTD_LOGIC_VECTOR;
sum:
OUTSTD_LOGIC)IS
BEGIN
…
ENDadder;
2、过程调用语句
格式:
过程名(关联参数表);
例如:
adder(a1,b1,sum1);
规则:
(1)若过程在进程(PROCESS)中调用,则是顺序语句;
(2)若过程调用出现在结构体(ARCHITECTURE)或块(BLOCK)中,则属于并行语句,相当一个进程,而且每调用一次过程,就相当插入一个元件。
3、函数(FUNCTION)语句
格式:
FUNCTION函数名(参数表)
RETURN数据类型IS
[说明部分]
BEGIN
[顺序处理语句]
RETURN[返回变量名];
END[函数名];
说明:
函数程序通常是放在程序包(PACKAGE)中。
例如,求最大值的函数:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
PACKAGEbpacIS
FUNCTIONmax(a:
STD_LOGIC_VECTOR;--函数首
B:
STD_LOGIC_VECTOR)
RETURESTD_LOGIC_VECTOR
ENDbpac;
PACKAGEBODYbpacIS
FUNCTIONmax(a:
STD_LOGIC_VECTOR;--函数体
B:
STD_LOGIC_VECTOR)
RETURESTD_LOGIC_VECTORIS
VARIABLEtemp:
STD_LOGIC_VECTOR(a‘RANGE);--范围属性函数
BEGIN
IF(a>b)THEN
Temp:
=a;
ELSEtemp:
=b;
ENDIF;
RETURNtemp;
ENDmax;
ENDbpac;
4、函数调用及结果的返回
格式:
函数(关联参数表);
规则:
函数调用是出现在结构体的语句中。
例如,peak<=max(data,peak);
<3>元件例化(COMPONENT)语句
格式:
COMPONENT元件名
GENERIC说明;--参数说明--元件定义语句
PORT说明;--端口说明
ENDCOMPONENT;
例化名:
元件名PORTMAP([端口名=>]连接端口名,...);--元件例化
说明:
(1)COMPONENT语句可以在结构体(ARCHITECTURE)、程序包(PACKAGE)和块(BLOCK)的说明中使用;GENERIC用于该元件的可变参数的代入和赋值;PORT则说明该元件的输入输出端口的信号规定;
(2)COMPONENT语句分为“元件定义”和“元件例化”两部分;“元件定义”完成元件的“封装”,“元件例化”完成电路板上的元件“插座”的定义,“例化名”(标号名)相当于“插座名”是不可缺少的;
(3)([端口名=>]连接端口名,...)部分完成“元件”引脚与“插座”引脚的连接——“关联”
关联方法:
①位置影射法——上层元件端口说明语句中的信号名与PORTMAP()中的信号名书写顺序和位置一一对应。
例如,
u1:
and1(a1,b1,y1);
②名称映射法——用“=>”号将上层元件端口说明语句中的信号名与PORTMAP()中的信号名关联起来。
例如,
u1:
and1(a=>a1,b=>b1,y=>y1);
举例:
首先完成一个2输入与非门的设计,然后利用元件例化产生下图电路
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYnd2IS
PORT(a,b:
INSTD_LOGIC;
c:
OUTSTD_LOGIC);
ENDnd2;
ARCHITECTUREnd2behvOFnd2IS
c<=aNANDb;
ENDnd2behv;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYord41IS
PORT(a1,b1,c1,d1:
INSTD_LOGIC;
z1:
OUTSTD_LOGIC);
ENDord41;
ARCHITECTUREord41behvOFord41IS
BEGIN
COMPNENTnd2
PORT(a,b:
INSTD_LOGIC;C:
OUTSTD_LOGIC);
ENDCOMPONENT;
SIGNALx,y:
STD_LOGIC;
BEGIN
u1:
nd2PORTMAP(a1,b1,x);--位置关联方式
u2:
nd2PORTMAP(a=>c1,b=>d1,c=>y);--名字关联方式
u3:
nd2PORTMAP(x,y,c=>z1);--混合关联方式
ENDARCHITECTUREor41behv;
<4>生成语句
功能:
复制一组完全相同的并行元件或设计单元电路结构。
格式1:
[标号:
]FOR循环变量IN取值范围
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VHDL 语句