HDL语言的主要描述语句.docx
《HDL语言的主要描述语句.docx》由会员分享,可在线阅读,更多相关《HDL语言的主要描述语句.docx(34页珍藏版)》请在冰豆网上搜索。
![HDL语言的主要描述语句.docx](https://file1.bdocx.com/fileroot1/2023-2/2/aff99e7c-636d-4794-a6ea-5ddcc0bb6b05/aff99e7c-636d-4794-a6ea-5ddcc0bb6b051.gif)
HDL语言的主要描述语句
HDL语言的主要描述语句
5.1顺序描述语句
5.2并发描述语句
5.3GENERARE语句
5.4属性(attribute)描述
5.1顺序描述语句
● WAIT语句
● 断言语句
● 信号赋值语句
● 变量赋值语句
● IF语句
● CASE语句
● LOOP语句
● NEXT语句
● 过程调用语句
● NULL语句(只占位置的空操作,对信号赋空值,表示关闭)
1.WAIT语句
● WAIT语句用于多种不同的目的,常用于为综合工具指定时钟输入。
另一用途是将进程的执行延时一段时间或者是为了动态地修改进程的敏感表。
● wait语句的执行会暂停进程的执行,直到信号敏感表发生变化或某种条件满足为止。
若进程中含信号敏感表,则必须紧跟在procees之后,这等价于该进程最后一个语句为waiton语句;此时不能用显式的wait语句。
● 4种不同条件:
WAIT---无限等待
WAITON---敏感信号量变化
WAITUNTIL---条件满足
WAITFOR---指定的持续时间
● WAITON
*格式:
WAITON信号[,信号];
*例1:
WAITONa,b;
表示,当a或b变化时,进程便执行后继的语句
*例2:
process(a,b)
begin
y<=aandb;
endprocess;
process
begin
y<=aandb;
waitona,b;
endprocess;
以上两进程等价。
● WAITUNTIL
*表示当检测到某个信号出现之前,进程被终止
*格式:
WAITUNTIL条件表达式
*例:
WAITUNTIL信号=数值;
WAITUNTIL信号‘eventand信号=数值;
WAITUNTILnot 信号’stable
and信号=数值;
waituntilCLK='1';
waituntilCLK'eventandCLK='1';
waituntilnotCLK'stableandCLK='1';
电路综合时,以上3种情况硬件无差别。
*常用语句:
signalCLK:
BIT;
……
process
begin
waituntilCLK'eventandCLK='1';
--等待时钟上沿
endprocess;
● WAITFOR
*格式:
WAITFOR 时间表达式;
表示等待指定时间后再执行后继语句;
*例:
waitfor20ns;
waitfor(a*(b+c));
● 多条件WAIT语句
同时使用多个等待条件;
● 超时等待
● 断言(assert)语句
*在运行过程中报告指定的错误信息,用于仿真和调试;
*基本格式:
assert条件[report 报告信息][severity 出错级别];
报告信息:
字符串;出错级别:
note,warning,error,failure。
执行此语句时,如果条件为真,则向下执行,反之,则输出错误信息和出错级别。
*例:
assert(sendB='1')
report"sendBtimedoutat'1'"
severityERROR;
3.赋值语句
● 将一个值赋给变量或信号。
● 格式:
目标:
=表达式;--变量赋值
目标<=表达式;--信号赋值
目标为接受表达式值的变量或信号(或变量或信号的一部分),表达式必须求值得到与目标相同的数据类型。
● 目标的种类:
*简单名:
Δ格式:
标识符:
=表达式--变量赋值
标识符<=表达式--信号赋值
标识符为信号或变量,对数组类型数组的所有元素都要赋值。
Δ例:
variableA,B:
BIT;
signalC:
BIT_VECTOR(1TO4);
A:
='1';
B:
='0';
C<="1100";
*有序号名:
Δ格式:
标识符(序号表达式):
=表达式--变量赋值
标识符(序号表达式)<=表达式--信号赋值
标识符为数组类型信号或变量,序号表达式必须计算成该数组序号类型的值且在界内,但无需是可计算的。
Δ例:
variableA:
BIT_VECTOR(1TO4);
A
(1):
='1';
A
(2):
='1';
A(3):
='0';
A(4):
='0';
*片(slice):
Δ目标格式:
标识符(序号表达式1方向序号表达式2)
标识符为数组类型信号或变量,序号表达式必须计算成该数组序号类型的值且在界内,但必须是可计算的;方向必须与数组类型方向一致。
Δ例:
variableA,B:
BIT_VECTOR(1TO4);
A(1to2):
="11";
A(3to4):
="00";
B(1TO4):
="1100";
*字段(field):
Δ目标格式:
标识符.字段名
标识符为记录类型信号或变量,字段名是该记录类型中某字段的名称,前面加"."。
赋值表达式必须必须包含字段类型。
字段可以是任何类型,包括数组、记录或积累类型。
5.信号赋值语句
● 信号赋值语句是在VHDL行为建模中的最基本形式,3种类型:
基本型、条件型、选择型(后两种为并发语句)。
● 基本型信号赋值语句:
a<=b;
为赋值引入非零延时值:
a<=bafter10ns;
● 格式:
信号<=敏感信号表达式;
例:
z<=anot(bnadc);
● 注意事项:
信号赋值不立即生效;
若在一个进程中,有若干值赋给一个信号,则最后一个赋值生效;
若干进程赋值给一个信号,电路可能失效;
4.IF语句
● 格式:
1)if条件then
<顺序处理语句>;
endif;
例1:
--MAX+plusIIVHDLExample
--LatchInference
--Copyright(c)1994AlteraCorporation
ENTITYlatchinfIS
PORT
(enable,data:
INBIT;
q:
OUTBIT);
ENDlatchinf;
ARCHITECTUREmaxpldOFlatchinfIS
BEGIN
latch:
PROCESS(enable,data)
BEGIN
IF(enable='1')THEN
q<=data;
ENDIF;
ENDPROCESSlatch;
ENDmaxpld;
一信号或变量并不在所有条件下都被驱动,没有"else",当条件不成立时,q保持原来值。
以上为锁存器推断。
例2:
entityuregis
generic(size:
integer:
=2);
port(
clk,reset,load:
instd_logic;
d:
inunsigned(size-1downto0);
q:
bufferunsigned(size-1downto0));
endureg;
architecturearchuregofuregis
begin
p1:
process(reset,clk)
begin
ifreset='1'then
q<=(others=>'0');
elsif(clk'eventandclk='1')then
ifload='1'then
q<=d;
endif;
endif;
endprocess;
endarchureg;
此例描述一个D触发器组。
2)if条件then
<顺序处理语句>;
else
<顺序处理语句>;
endif;
例:
if(PHI='1')then
TEMP<=A;
else
TEMP<='0';
endif;
为两输入与门。
为避免锁存器推断,在所有条件下都赋给信号一个值。
3)if条件then
<顺序处理语句>;
elsif条件then
<顺序处理语句>;
……
elsif条件then
<顺序处理语句>;
else
<顺序处理语句>;
endif;
● 每个条件必须是布尔表达式,每个"if"分支都包括一个或几个顺序语句;
● 每个条件按顺序计算;
● 如果没有一个条件满足且"else"语句存在,则执行"else"语句;
● 如果没有一个条件满足且"else"语句不存在,则什麽语句也不执行;
例:
四选一电路
entitymux4is
port(
input:
instd_logic_vector(3downto0);
sel:
instd_logic_vector(1downto0);
y:
outinstd_logic);
endmux4;
architecturertlofmux4is
begin
process(input,sel)
begin
if(sel="00")then
y<=input(0);
elsif(sel="01")then
y<=input
(1);
elsif(sel="10")then
y<=input
(2);
elsif
y<=input(3);
endif;
endprocess;
endrtl;
ifload='1'then
q<=d;
endif;
endif;
endprocess;
endarchureg;
5.CASE语句
● 格式:
CASE表达式IS
WHEN 选择 =>顺序处理语句;
ENDCASE;
● 选择的计算结果必须是整型、枚举型或枚举型数组;选择为静
态表达式或动态范围,最终的选择是可以是"others",选择不能重叠,若无"others"选择,那末选择必须覆盖表达式的所有可能值。
● 4种选择类型:
WHEN 值 =>顺序处理语句;
WHEN 值∣值∣……∣值 =>顺序处理语句;
WHEN 值TO值=>顺序处理语句;
WHENOTHERS=>顺序处理语句;
● 例1:
entityMUX4is
port(A,B,I0,I1,I2,I3:
instd_logic;
Q:
outstd_logic);
endMUX4;
architectureMUX4ofMUX4is
signalsel:
INTEGERrange0to3;
begin
process(A,B,I0,I1,I2,I3)
……
CASEselIS
WHEN0=>Q<=I0;
WHEN1=>Q<=I1;
WHEN2=>Q<=I2;
WHEN3=>Q<=I3;
ENDCASE;
endprocess;
endmux4;
● 例2:
signalVALUE:
INTEGERrange0to15;
signalz1,z2,z3,z4:
BIT;
Z1<='0';
Z2<='0';
Z3<='0';
Z4<='0';
caseVALUEis
when0=>z1<='1';
when1∣3=>z2<='1';
when4to7∣2=>z3<='1';
whenothers=>z4<='1';
endcase;
● 无效case语句例:
signalVALUE:
INTEGERrange0to15;
signalOUT_1:
BIT;
caseVALUEis
endcase;
caseVALUEis
when0=>OUT_1<='1';
when1=>OUT_1<='0';
endcase;
caseVALUEis
when0to10=>OUT_1<='1';
when5to15=>OUT_1<='0';
endcase;
6.LOOP语句
● 重复地执行顺序语句。
2种(for…loop和while…loop)。
● for…loop
*迭代次数由一个整数范围确定,对该范围内的每一个值,循环执行一次。
当迭代范围中的最后一个值迭代完成后,跳出循环,继续执行循环后的下一个语句。
*格式:
[标号]:
for循环变量in范围 loop
<顺序处理语句>;
endloop[标号名];
*循环变量不要在别处说明;且只能在循环内读,也不能给循环变量赋值。
*“范围”的表式:
整数表达式to整数表达式
整数表达式downto整数表达式
其他
*例1:
asum:
foriin1to9loop
sum:
=i+sum;
endloopasum;
*例2:
signalA,B:
BIT_VECTOR(1to3);
……
forIin1to3loop
A(I)<=B(I);
endloop;
……
A
(1)<=B
(1);
A
(2)<=B
(2);
A(3)<=B(3);
以上两段等价。
*例3:
variableA,B:
BIT_VECTOR(1to10);
……
forIinA'rangeloop
A(I):
=notB(I);
endloop;
● while…loop
*只要迭代条件满足,就重复执行封闭的语句。
如果迭代迭代条件求值为“真”,则封闭的语句就执行一次。
然后迭代条件重新求值。
当迭代仍为“真”,循环则重复执行,否则,跳出循环,继续执行循环后的下一个语句。
*格式:
[标号]:
while条件loop
<顺序处理语句>;
endloop[标号名];
条件为布尔表达式。
*例:
i:
=1;
sum:
=0;
sbcd:
while(i<10)loop
sum:
=i+sum;
i:
=i+1;
endloopsbcd;
7.NEXT语句
● 停止本次迭代,转入下一次迭代。
● 格式:
next[标号][when条件];
[标号]表明下一次迭代的起始位置;若既无[标号],也无[when条件],则执行到该语句就立即跳出本次循环,再从loop的起始位置进行下次迭代。
● 例:
signalA,B,COPY_ENABLE:
BIT_VECTOR(1to8);
……
A<="00000000";
……
forIin1to8loop
nextwhenCOPY_ENABLE(I)='0';
A(I)<=B(I);
endloop;
● 嵌套循环中的next语句
signalX,Y:
BIT_VECTOR(0to7);
A_LOOP:
forIinX'rangeloop
……
B_LOOP:
forJinY'rangeloop
……
nextA_LOOPwhenI=J;
……
endloopB_LOOP;
……
endloopA_LOOP;
当条件满足时,从循环B中跳出,到从外循环A开始迭代。
8.EXIT语句
● 用于循环体内部,有条件或无条件地结束当前的迭代和循环。
。
● 格式:
exit[loop标号][when条件];
当条件满足时,结束循环,继续后继的语句。
● 嵌套循环中的3种形式:
*若无[loop标号]:
则执行exit时,程序仅从当前所属的loop循环中跳出。
*若exit后接[loop标号]:
则执行exit时,程序跳到说明的标号。
*exit后接[when条件]:
则执行exit时,只有当条件“真”时才跳出循环。
● 例:
signalA,B:
BIT_VECTOR(1downto8);
signalA_LESS_THAN_B:
boolean;
……
A_LESS_THAN_B<=FALSE;
……
forIin1downto0loop
if(A(I)='1'andB(I)='0')then
A_LESS_THAN_B<=FALSE;
exit;
elsif(A(I)='0'andB(I)='1')then
A_LESS_THAN_B<=TRUE;
exit;
else
null;
endif;
endloop;
● exit的next比较:
两者格式相同,都是跳出循环的剩余语句;但exit是终止循环,而next是继续下一次循环。
5
5.2并发描述语句
● 进程(process)语句
● 并发信号赋值(concurrentsignalassignment)语句
在构造体的进程之外使用。
● 条件信号赋值(conditionalsignalassignment)语句
● 选择信号赋值(selectivesignalassignment)语句
● 块(block)语句
1.进程(process)语句
● 一个结构体中的所有进程并发运行;
● 每个进程中的所有语句都顺序执行;
● 进程中包含一个显式信号敏感表或wait语句;
● 进程之间的通信靠信号来传递。
2.并发信号赋值(concurrentsignalassignment)语句
● 在构造体的进程之外使用,等价于包含顺序赋值语句的进程;
● 并发信号赋值语句在仿真时同时运行。
● 格式:
目标<=表达式;
目标为接受表达式值的信号。
● 例:
architecturebehavofa_varis
begin
output<=a(i);
endbehav;
等价于进程中的赋值语句。
3.条件信号赋值(conditionalsignalassignment)语句
● 格式:
目标<=表达式1when条件1else
表达式2when条件2else
..
..
..
表达式n;
“目标”为目标为接受表达式值的信号;所使用的表达式是“条件”为真的第一个(按顺序);如果没有条件为真,则将最后一个表达式赋给目标;若多个条件为真,则仅第一个有效,如同IF语句的第一个条件为真的分支一样。
● 例1:
z<=Awhenassign_A='1'else
Bwhenassign_B='1'else
C;
与此等价的IF语句:
process(A,ssign_A,B,assign_B,C)
begin
ifasign_A='1'then
Z<=A;
elsifasign_B='1'then
Z<=B;
else
Z<=C;
endif;
endprocess;
● 例2:
四选一电路
entitymux4is
port(i0,i1,12,13,a,b:
instd_logic;
q:
outstd_logic);
endmux4;
architecturertlofmux4is
siganlsel:
std_logic_vector(1downto0);
begin
sel<=b&a;
q<=i0whensel="00"else
i1whensel="01"else
i2whensel="10"else
i3whensel="11"else
'X';
endrtl;
● 与IF语句的区别:
*IF只能在进程内使用,而条件赋值语句在进程外使用;
*IF语句可以没有else,而条件赋值语句一定要有else;
*IF语句可以嵌套,而条件赋值语句不能进行嵌套;
*IF语句可以生成锁存电路,条件赋值语句不能生成锁存电路。
4.选择信号赋值(selectivesignalassignment)语句
● 格式:
with选择表达式select
目标<=表达式1when条件1
表达式2when条件2
..
..
..
表达式nwhen条件n;
“目标”为目标为接受表达式值的信号;包括选择表达式值的第一个条件所对应的表达式的值赋给目标;每个选择为静态表达式或静态范围;选择表达式中的每一个值都必须由一个选择所覆盖;最后的选择可以是others。
● 约束:
各条件不得重叠;若无others,则选择表达式的所有可能值都必须被条件集合所覆盖。
● 例:
siganlA,B,C,D,Z:
BIT
signalCONTROL:
bit_vector(1downto0);
……
withCONTROLselect
Z<=Awhen"00",
Bwhen"01",
Cwhen"10",
Dwhen"11",
'X'whenothers;
等价的case语句:
process(CONTROL,A,B,C,D)
begin
caseCONTROLis
when0=>Z<=A;
when1=>Z<=B;
when2=>Z<=C;
when