第五章vhdl语言的主要描述语句_第1页
第五章vhdl语言的主要描述语句_第2页
第五章vhdl语言的主要描述语句_第3页
第五章vhdl语言的主要描述语句_第4页
第五章vhdl语言的主要描述语句_第5页
已阅读5页,还剩187页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章VHDL语言的主要描述语句2023/5/222引子在用VHDL语言描述系统硬件行为时,按语句执行顺序对其进行分类,可分为:

顺序(sequential)描述语句,体现设计人员的思路:现象的因果关系、局部与整体的关系;

并发(concurrent)描述语句,体现电路硬件的特点:各元件/信号相互影响,同时发生变化。以进程语句举例2023/5/2235.1顺序描述语句执行的顺序:顺序描述语句同高级语言的执行一样,是按出现次序加以执行的;出现的场合:进程或子程序(过程/函数)中;——wait语句

——断言语句

——信号代入语句

——变量赋值语句

——过程调用语句

——if语句——case语句

——loop语句

——next语句

——exit语句

——null语句2023/5/224信号代入语句书写格式:目的变量:=表达式;右边的表达式可以是变量、信号或常量;变量只在进程或子程序中使用,是局部量。书写格式:目的信号量<=信号量表达式;信号在构造体、端口说明中定义,是全局量。A<=B;A:=B;变量赋值语句2023/5/2255.1.1信号代入语句1)书写格式目的信号量<=敏感信号量表达式;处于构造体中的信号代入语句

z<=aor(bnandc);有3个敏感量a、b、c,无论哪一个敏感量发生变化,该代入语句将被执行。2)举例2023/5/226a<=bafter5ns;--表示当b发生新的变化5ns后,才被代入到信号a中;c<=aandbafter15ns;--表示当a或b发生新的变化15ns后,它们进行与逻辑操作的结果才被代入到信号a中,可描述逻辑门的延时特性;a<=‘0’after5ns,‘1’after10ns,‘0’after15ns;--该信号代入语句描述了怎样的波形呢?2023/5/2273)两类延时语句--惯性延时、传输延时(1)惯性(Inertial)延时惯性延时:在惯性模型中,系统或器件输出信号要发生变化,必须有一段时间的延时,这段延时时间,就是系统或元件的惯性延时。特点:当一个系统或器件的输入信号周期,小于系统或器件的惯性延时,其输出将保持不变。如:在一个信号值维持期间,如果存在任何毛刺、脉冲等周期小于器件本身的惯性延时的情况,输出信号的值将不变,否则将引起信号的变化。2023/5/228惯性延时举例假设某门电路的惯性延时为20nsb<=inertialaafter20ns;所有器件都存在惯性延时,在代入语句中加上惯性延时时间,可以仿真硬件电路实际工作情况,如:

b<=aafter10ns;或:

b<=inertialaafter10ns;惯性延时说明只在行为仿真时才有意义,逻辑综合时将被忽略。10ns2023/5/229(2)传输(Transport)延时传输延时常用于描述总线延迟、连接线的延时,及ASIC芯片的路径延时。在VHDL语言中,传输延时不能缺省,必须在语句中使用传输延时的前置词transport明确说明。特点:输出端的信号在延时规定时间后,将完全复现输入端的输入波形,而不管输入波形的形状和宽窄如何。2023/5/2210传输延时举例b<=transportaafter20ns;传输延时:不管多短的脉冲都根据指定的延时值,传给一个延时信号输出。2023/5/22115.1.2变量赋值语句1)书写格式目的变量:=表达式;2)举例a:=2;--值;

b:=d+e;--表达式;

c:=f;--可为信号、变量、常量;2023/5/22125.1.3断言(assert)语句作用:主要用于程序的仿真、调试中的人机会话。

assert

条件[report输出信息][severity级别];格式:assert语句检查一个布尔表达式为真或假,如果值是真,则该语句任何事都不做,如果值是假,断言语句将输出一用户规定的字符串到标准输出终端。2023/5/2213assert

条件[report输出信息][severity级别];设计者所写的文字串,通常是说明错误的原因,文字串应用双引号括起来。错误严重程度的级别,分为4级别:failure,error,waring,note布尔表达式assert(sendb=’1’)report“sendbtimedoutat’1’”severityerror;2023/5/22145.1.4wait语句等待语句用于控制进程的执行时间;当进程执行到wait语句时,将被挂起,直到wait语句的条件满足,才继续执行后续语句;此时进程中该语句之前的信号赋值语句得到执行;注意:wait语句通常不存在具体电路对应,在电路综合时通常不产生影响;2023/5/2215wait语句可设置的四种不同条件无限等待、时间到、条件满足以及敏感信号量变化。wait——无限等待waitfor——时间到waituntil——条件满足waiton——敏感信号变化后三种条件可以单独使用也可以混合使用。书写格式2023/5/22161.waiton语句waiton语句后面可跟一个或多个信号量,等待所列举信号中任何一个发生变化。1)书写格式waiton

信号1[,信号2]…;2)举例waitona,b;等待信号量a或b发生变化,a或b中只要有一个发生变化,进程将结束挂起状态,继续执行waiton语句后面的语句。2023/5/2217例:判断以下三段程序的正误process(a,b)beginy<=aandb;endprocess;processbeginwaitona,b;y<=aandb;endprocess;process(a,b)beginwaitona,b;y<=aandb;endprocess;waiton所起作用与进程的敏感信号量表相同,两者不能同时存在。2023/5/22182.waituntil语句利用表达式建立隐含的敏感信号量表;当任何一个涉及的信号发生变化时,就自动检测布尔表达式是否为真;如果为真,则进程脱离等待状态,执行后续语句;如果为假,则继续等待。1)书写格式waituntil

布尔表达式;2023/5/2219waituntil((x*10)<100);当信号量x的值大于或等于10时,进程执行到该语句,就被挂起;当x的值小于10时,进程再次被启动,继续执行waituntil语句的后继语句。2)举例:利用表达式建立隐含的敏感信号量表2023/5/2220libraryieee;useieee.std_logic_1164.all;entitykdec24isport(a:instd_logic_vector(1downto0);en:instd_logic;f:outstd_logic_vector(3downto0));endentitykdec24;例:architecturedofkdec24isbeginprocessbegin

waituntilen='1';f(0)<=nota(1)andnota(0);f(1)<=nota(1)anda(0);f(2)<=a(1)andnota(0);f(3)<=a(1)anda(0);endprocess;endarchitectured;2023/5/22213.waitfor语句

当进程执行到该语句时将被挂起,直到指定的时间到了,进程再次开始执行waitfor语句后继的语句。1)书写格式

waitfor

时间表达式;2023/5/2222若a=2,b=50ns,c=70ns,则执行到该语句时,就要等待2*(50+70)=240ns后,再继续执行后续语句。waitfor(a*(b+c));2)举例执行到该语句等待20ns以后,再继续执行下一条指令。waitfor20ns;2023/5/2223例:利用waitfor构成输入信号波形entityinhibittestbenchisend

entityinhibittestbench;architecturebehofinhibittestbenchiscomponentinhibitisport(x,y:inbit;z:outbit);endcomponentinhibit;signalxt,yt,zt:bit;beginu1:inhibitportmap(xt,yt,zt);processbeginxt<='0';yt<='0';

waitfor10ns;xt<='0';yt<='1';

waitfor10ns;xt<='1';yt<='0';

waitfor10ns;xt<='1';yt<='1';

wait;--进入无限期等待,避免进入无限期循环;

endprocess;end

architecture

beh;2023/5/2224entityinhibitisport(x,y:inbit;z:outbit);endentityinhibit;architecturertlofinhibitisbeginz<=xand(noty);endarchitecturertl;componentinhibitisport(x,y:inbit;z:outbit);endcomponentinhibit;2023/5/22254.多条件等待语句上述语句等待的是3个条件:1)信号量umi和interrupt任何一个有一次新的变化;2)信号量umi或interrupt任何一个取值为“真”;3)该语句已等待5us。

前面所讲的三类wait语句,等待的条件都是单一的,要么是信号量(waiton),要么是布尔量(waituntil),要么是时间量(waitfor)。wait语句可同时使用多个等待条件。例如waitonumi,interruptuntil((umi=true)or(interrupt=true))for5us;2023/5/2226多条件等待中的表达式,至少应包含一个信号量,比如,waituntil(interrupt=true)or(old_clk=‘1’);结论:在等待语句中信号的变化才能引起等待语句表达式的一次评价和计算。

若上面语句中interrupt和old_clk两个都是变量,而没有一个信号量,那么,即使两个变量有变化,这条语句也不会对表达式进行评估和计算。事实上,挂起的两个变量的值是不可能改变的,这样,该语句将变成无限的等待语句,包含该等待语句的进程就不可能再次启动。2023/5/22275.超时等待waituntil(sendb=‘1’)for1us;

assert(sendb=‘1’)

report“sendbtimedoutat‘1’”severity…….;等待语句加超时等待项的目的:防止等待语句进入无限期的等待状态。for1us:作为超时等待项;assert语句:用于检测进程是否遇到等待条件,还是因超时等待而执行后续语句。2023/5/2228例:可能进入死锁的进程通信architecturewait_exampleofwait_exampleissignalsendb,senda:std_logic;beginsenda<=’0’;a:processbegin

waituntilsendb=’1’;senda<=’1’after10ns;waituntilsendb=’0’;senda<=’0’after10ns;endprocess;b:processbeginwaituntilsenda=’0’;sendb<=’0’after10ns;waituntilsenda=’1’;sendb<=’1’after10ns;endprocess;endarchitecturewait_example;2023/5/22292023/5/2230例:使用超时等待项的进程通信senda<=’0’;a:processbeginwaituntilsendb=’1’for1us;assert(sendb=’1’)report“sendbtimedoutat’1’”severityerror;senda<=’1’after10ns;waituntilsendb=’0’for1us;assert(sendb=’0’)report“sendbtimedoutat’0’”severityerror;senda<=’0’after10ns;endprocess;b:processbeginwaituntilsenda=’0’for1us;assert(senda=’0’)report“sendatimedoutat’0’”severityerror;sendb<=’0’after10ns;waituntilsenda=’1’for1us;assert(senda=’1’)report“sendatimedoutat’1’”severityerror;sendb<=’1’after10ns;endprocess;endwait_example;2023/5/2231waituntilsendb=‘1’for1us;assert

(sendb=‘1’)report

“sendbtimedoutat‘1’”severity

error;senda<=‘1’after10ns;程序解释:1)如果等待时间超过了1us进程则执行assert语句。2)assert语句判断条件(sendb=‘1’)为真,则继续执行下一条语句senda<=‘1’after10ns;3)若assert语句判断条件为假,则向操作人员提供错误信息输出,report后的字符串“sendbtimedoutat‘1’”以及severity后的错误等级。2023/5/22325.1.5if语句

if语句根据所指定的条件来确定执行哪一些语句,书写格式通常可分成三种类型:if语句的门闩控制if语句的二选择控制if语句的多选择控制2023/5/22331.if语句的门闩控制if

布尔表达式

then顺序处理语句;

endif;当布尔表达式为true时,执行then后面的顺序语句;为false时,执行endif以后的语句。1)书写格式2023/5/22342)举例当a=‘1’时,c<=b;否则,将不进入该条件语句的内部执行信号代入c<=b,而执行endif之后的语句。

ifa=‘1’then

c<=b;

endif;a为门闩控制信号:2023/5/2235例

D触发器描述libraryieee;useieee.std_logic_1164.all;entitydffisport(clk,d0:instd_logic;q0:outstd_logic);endentitydff;architecturertlofdffisbeginprocess(clk)isbegin

if(clk'eventandclk='1')thenq0<=d0;

endif;endprocess;endarchitecturertl;2023/5/2236RTL视图仿真波形图2023/5/2237HowManyRegisters?LIBRARYIEEE;USEIEEE.std_logic_1164.all;USEIEEE.std_logic_unsigned.all;ENTITYreg1ISPORT(d:inSTD_LOGIC;clk:inSTD_LOGIC;q:outSTD_LOGIC);ENDENTITYreg1;ARCHITECTUREreg1OFreg1ISSIGNALa,b:STD_LOGIC;BEGINPROCESS(clk)isBEGINIF(clk'eventandclk='1')THENa<=d;b<=a;q<=b;ENDIF;ENDPROCESS;ENDARCHITECTUREreg1;2023/5/2238HowManyRegisters?SignalAssignmentsInsidetheIF-THENStatementThatCheckstheClockConditionInferRegistersQclkdclkCLRNENADclkqbCLRNENADaCLRNENADQQQ2023/5/2239IF(clk'eventandclk='1')THENa<=d;b<=a;q<=b;ENDIF;Q2023/5/2240HowManyRegisters?LIBRARYIEEE;USEIEEE.std_logic_1164.all;USEIEEE.std_logic_unsigned.all;ENTITYreg1ISPORT(d :inSTD_LOGIC;clk :inSTD_LOGIC;q :outSTD_LOGIC);ENDENTITYreg1;ARCHITECTUREreg1OFreg1ISSIGNALa,b:STD_LOGIC;BEGINPROCESS(clk)isBEGINIFrising_edge(clk)THENa<=d;b<=a;ENDIF;ENDPROCESS;q<=b;ENDARCHITECTUREreg1;SignalAssignmentMoved2023/5/2241HowManyRegisters?BtoQAssignmentIsNoLongerEdge-sensitiveBecauseItIsNotInsidetheIf-thenStatementThatCheckstheClockConditionqCLRNENADclkCLRNENADdclkaQQ2023/5/2242ARCHITECTUREreg1OFreg1ISSIGNALa,b:STD_LOGIC;BEGINPROCESS(clk)isBEGINIFrising_edge(clk)THENa<=d;b<=a;ENDIF;ENDPROCESS;q<=b;ENDARCHITECTUREreg1;2023/5/2243HowManyRegisters?LIBRARYIEEE;USEIEEE.std_logic_1164.all;USEIEEE.std_logic_unsigned.all;ENTITYreg2ISPORT(d:inSTD_LOGIC;clk:inSTD_LOGIC;q:outSTD_LOGIC);ENDreg2;ARCHITECTUREreg2OFreg2ISBEGINPROCESS(clk)VARIABLEa,b:STD_LOGIC;BEGINIFrising_edge(clk)THENa:=d;b:=a;q<=b;ENDIF;ENDPROCESS;ENDreg2;SignalsChangedtoVariables2023/5/2244HowManyRegisters?VariableAssignmentsAreUpdatedImmediatelySignalAssignmentsAreUpdatedonClockEdgeCLRNENADdclkqQ2023/5/2245IF(clk'eventandclk='1')THENa:=d;b:=a;q<=b;ENDIF;2023/5/22462.if语句的二选择控制if

布尔表达式

then

顺序语句1;else

顺序语句2;endif;当布尔表达式为true时,执行then后面的顺序语句1;为false时,执行else后面的顺序语句2。1)书写格式2023/5/22472)举例二选一电路architecturertlofmux2isbeginprocess(a,b,sel)isbegin

if

(sel=‘1’)thenc<=a;

elsec<=b;

endif;

endprocess;endarchitecturertl;2023/5/22483.if语句的多选择控制if

条件then

顺序处理语句;elsif

条件then

顺序处理语句;

…elsif

条件then

顺序处理语句;else

顺序处理语句;endif;ture判断条件判断条件顺序语句后续语句顺序语句turefalsefalse…判断条件判断条件顺序语句后续语句顺序语句turefalsefalse…1)书写格式可设置多个条件;满足某个条件,就执行该条件后的顺序处理语句;若所有设置的条件都不满足时,就执行最后一个else和endif之间的顺序处理语句。2023/5/22492)举例四选一电路 architecturertlofifmuxisbeginprocess(input,sel)isbeginif(sel="00")theny<=input(0);elsif(sel="01")theny<=input(1);elsif(sel="10")theny<=input(2);elsey<=input(3);endif;endprocess;endarchitecturertl;2023/5/2250if语句不仅可用于多路选择器设计,还可用于比较器、译码器等具有条件控制的逻辑电路设计。note:if语句的条件判断输出是隐式布尔量,所以在if语句中的if条件表达式中,只能使用关系运算操作及逻辑运算操作的组合表达式。2023/5/2251练习:程序补充题,if语句描述的质数检测器libraryieee;useieee.std_logic_1164.all;use(1);entityprimeisport(n:instd_logic_vector(3downto0);f:outstd_logic);endentityprime;architecturebehofprimeisbegin1ieee.std_logic_unsigned.all;process(n)isvariableni:(2);beginni:=conv_integer(n);

ifni=1orni=2thenf<='1';(3)ni=3orni=5orni=7orni=11orni=13thenf<='1';elsef<='0';(4);endprocess;endarchitecturebeh;2integer3elsif4endif2023/5/2252练习设计一个简单恒温加热器的行为模型。这个装置的实体模型有两个整数输入端,其中一个预先设定温度desired_temp,另一个连接到测温计actual_temp;还有一个控制加热器开关的布尔输出端heater_on。如果测量的温度低于所设定的温度2度,恒温系统将打开加热器进行加热,而如果测量的温度高于设定温度2度,则关闭加热器停止加热。2023/5/2253entitythermostatisport(desired_temp,actual_temp:ininteger;

heater_on:outboolean);endentitythermostat;architecturebehofthermostatisbeginprocess(desired_temp,actual_temp)isbegin

ifactual_temp<=desired_temp-2thenheater_on<=true;

elsifactual_temp>=desired_temp+2thenheater_on<=false;

endif;endprocess;endarchitecturebeh;2023/5/22545.1.6case语句可根据表达式的不同取值,选择执行哪些语句。1.书写格式case

表达式

iswhen

选择值1

=>

顺序语句1;when

选择值2

=>

顺序语句2;……when选择值n=>

顺序语句3;whenothers=>

顺序语句n;endcase;“=>”用来表明表达式的取值和执行语句的对应关系;选择值应互斥,并覆盖表达式所有的可能取值;选择值须为静态值。2023/5/22551)when值=>顺序处理语句;2)when值|值|值…|值=>顺序处理语句;3)when值to值=>顺序处理语句;4)whenothers=>顺序处理语句;多个值的“或”关系值的取值范围所有的缺省值选择值的四种不同书写形式表达式的一个取值2.举例四选一多路数据选择电路libraryieee;useieee.std_logic_1164.all;entitymux4isport(input:instd_logic_vector(3downto0);sel:instd_logic_vector(1downto0);y:outstd_logic);endentitymux4;2023/5/2256architecturemux4_behaveofmux4isbeginprocess(sel,input)isbegin

caseseliswhen"00"=>y<=input(0);when"01"=>y<=input(1);when"10"=>y<=input(2);when"11"=>y<=input(3);

whenothers

=>null;endcase;endprocess;endarchitecturemux4_behave;使用whenothers包含所有的缺省值2023/5/2257if(sel=“00”)theny<=input(0);elsif(sel=“01”)theny<=input(1);elsif(sel=“10”)theny<=input(2);elsey<=input(3);endif;caseseliswhen"00"=>y<=input(0);when"01"=>y<=input(1);when"10"=>y<=input(2);when"11"=>y<=input(3);

whenothers

=>null;endcase;3.if语句和case语句的区别if语句首先处理最起始的条件,如果不满足,再处理下一个条件;case语句没有值的顺序号,所有的值都是并行处理的,因此,值应互斥,不能重复使用。2023/5/2258举例

优先级编码器的VHDL描述

输入

输出b7b6b5b4b3b2b1b0y2y1y0-------0111------01110-----011101----0111100---01111011--011111010-0111111001-1111111000表中“-”为任意项,其值可以为1,也可以为0。优先级编码器的真值表2023/5/2259

优先级编码器的输入含有任意项,用case语句可以描述吗?process(input)isbegincaseinputiswhen"XXXXXXX0"=>y<="111";when"XXXXXX01"=>y<="110";when"XXXXX011"=>y<="101";when"XXXX0111"=>y<="100";when"XXX01111"=>y<="011";when"XX011111"=>y<="010";when"X0111111"=>y<="001";whenothers=>y<="000";endcase;endprocess;

这样的描述语句在VHDL语言中还未定制出来,此程序在编译综合中含有不确定值的程序行被忽略,得不到正确的rtl视图。2023/5/2260

多选择控制if语句是从最起始的条件开始依次进行判断处理的,可利用该语句条件判断的顺序性来描述优先编码器的最低位零优先编码的特点。process(input)isbeginif(input(0)='0')theny<="111";elsif(input(1)='0')theny<="110";elsif(input(2)='0')theny<="101";elsif(input(3)='0')theny<="100";elsif(input(4)='0')theny<="011";elsif(input(5)='0')theny<="010";elsif(input(6)='0')theny<="001";elsey<="000";endif;endprocess;endarchitecturertl;2023/5/2261由上例可知:利用if语句条件判断的顺序性,可实现优先编码,要注意若是低位‘0’优先,则条件判断一定是从input的最低位开始,否则从input的最高位开始。case语句中,when语句的顺序可以颠倒,没有执行的先后次序的分别,不存在隐含的优先级,不可描述优先级编码器。2023/5/2262练习:将采用if语句描述的质数检测器,改写成用case语言描述的质数检测器libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityprimeisport(n:instd_logic_vector(3downto0);f:outstd_logic);endprime;architecturebehofprimeisbeginprocess(n)variableni:

integer;beginni:=conv_integer(n);

ifni=1orni=2thenf<='1';elsif

ni=3orni=5orni=7orni=11orni=13thenf<='1';elsef<='0';

endif;endprocess;endbeh;2023/5/2263architecturebehofprime8isbeginprocess(n)isbegin

caseconv_integer(n)is

when1|2=>f<='1';

when3|5|7|11|13=>f<='1';whenothers=>f<='0';

endcase;endprocess;endarchitecturebeh;2023/5/2264练习:下面两段程序,哪一段是正确的?variableN:integer:=1;caseseliswhenN|N+1=>y<=“01”;whenN+2toN+5=>N:=2;y<=“10”;whenothers=>y<=“11”;endcase;constantN:integer:=1;caseseliswhenN|N+1=>y<=“01”;whenN+2toN+5=>y<=“10”;whenothers=>y<=“11”;endcase;选择值须为静态值2023/5/2265练习书写一个case语句,从标准逻辑变量x中去除强度信息。即如果x为‘0’或‘L’,将它设置为‘0’;如果x为‘1’或‘H’,则将它设置为‘1’;如果x为‘X’、’W’、’Z’、’U’或’-’时,则设置为‘X’。casexiswhen‘0’|‘L’=>x:=‘0’;when‘1’|‘H’=>x:=‘1’;whenothers=>x:=‘X’;endcase;2023/5/22665.1.7loop语句如果要书写一组被重复执行的顺序语句,可以使用loop循环语句来表示这种重复执行的行为。在VHDL语言中常用来描述位片逻辑及迭代电路的行为。

循环语句的书写格式一般有两种

for循环

while循环2023/5/22671.for循环变量[标号]:for

循环变量in

离散范围loop

顺序处理语句;

endloop[标号];a:foriin1to9loopsum:=i+sum;--sum初始值为0

endloopa;1)书写格式循环变量的值在每次循环中都将发生变化离散范围表示循环变量在循环过程中依次取值的范围2)举例2023/5/2268举例

8位奇偶校验电路libraryieee;useieee.std_logic_1164.all;entityparity_checkisport(a:instd_logic_vector(7downto0);y:outstd_logic);end

entityparity_check;architecturertlofparity_checkisbegin

该电路的输入为一个8位的数据a,判断该数据含有奇数个1还是偶数个1,若为奇数,则输出端口y输出为‘1’,否则,输出为‘0’。2023/5/2269process(a)isvariabletmp:std_logic;begintmp:='0';

foriin0to7looptmp:=tmpXORa(i);

endloop;y<=tmp;endprocess;end

architecturertl;变量在进程内部说明(局部量)循环变量i是一个整数量,使用前不需要进行说明,而且变量、信号都不能代入循环变量变量值要通过信号从进程内部带出2023/5/22702.while循环条件[标号]:while

条件loop

顺序处理语句;

endloop[标号];a.不指定循环次数;每次循环前检测条件中布尔表达式的值;当布尔表达式为真时,执行循环;为假时,不进行循环;b.重要:在循环体内,应有语句能够将布尔表达式的值改变为假,避免无限循环。1)书写格式2023/5/22712)举例:计算1~9的累加和i:=1;sum:=0;a:while(i<10)loopsum:=i+sum;i:=i+1;endloopa;循环控制变量递增的实现程序结束循环的条件2023/5/2272举例

while循环描述的8位奇偶校验电路architecturebehaveofparity_checkisbeginprocess(a)isvariabletmp:std_logic;variablei:integer;begintmp:=’0’;i:=0Max+plusII10.0不支持while循环

while

(i<8)

looptmp:=tmpxora(i);i:=i+1;

endloop;y<=tmp;endprocess;endarchitecturebehave;2023/5/22733.next语句next语句是用来控制循环执行的一种跳转语句。执行该语句时,立即中止当前的循环迭代。给出下一迭代的起始位置next语句执行的条件如果next语句后面既无“标号”也无“when条件”,那么,只要执行到该语句就立即无条件地跳出本次循环,并且,从loop语句的起始位置进入下一次循环迭代。next

[标号]

[when

布尔表达式];1)书写格式2023/5/2274process(a,b)isconstantmax_limit:integer:=255;begin

foriin0tomax_limitloopif(done(i)=true)then

next;

elsedone(i):=true;endif;q(i)<=a(i)andb(i);endloop;endprocess;既无“标号”也无“when条件”2)举例2023/5/2275L1:whilei<10loop;L2:whilej<20loop;…nextL1wheni=j;…endloopL2;endloopL1;3)嵌套loop语句中next语句的使用在该例中,当i=j时,next语句被执行,程序将从内循环L2中跳出,再从下一次外循环L1开始执行。嵌套loop语句中的next语句要有“标号”和“when条件”。2023/5/22764.exit语句exit语句是在loop循环语句中用来退出循环的语句;

exit语句的执行将结束循环状态,即从loop语句退出,结束loop语句的执行。

如果exit后面没有跟“标号”和“when条件”,则程序执行到该程序时就无条件地从loop语句中跳出,结束循环状态,去执行“endloop”之后的语句。exit[标号][when条件];1)书写格式2023/5/22772)举例process(a)isvariableint_a:integer;beginint_a:=a;

foriin0tomax_limitloopif(int_a<=0)then

exit;elseint_a:=int_a–1;q(i)<=3.1416/real’(a*i);endif;endloop;y<=q;endprocess;结束循环状态2023/5/22783)嵌套loop语句中exit语句的使用当多个loop语句被多重嵌套时,exit结束最里层的loop语句。如果需要终结的loop语句不是最里层的loop语句,此时必须使用“标号”来指定要终结的是哪一层。outer:loop…inner:loop…

exitouterwhencondition1;--exit1

exitwhencondition2;--exit2endloopinner;--targetA

exitouterwhencondition3;--exit3endloopouter;--targetB2023/5/22795.1.8null语句null语句是空操作语句,显式地表明该语句不需要完成任何操作;null语句常用在case语句中。signalcontrol:integerrange0to7;signala,z:bit;…casecontroliswhen0|7=>z<=nota;whenothers=>null;endcase;2023/5/2280练习loopcount_value:=count_value+1;nextwhenrs=‘1’;zout<=count_value+cin;count<=count_value;endloop;loopcount_value:=count_value+1;ifnot(rs=‘1’)thenzout<=count_value+cin;count<=count_value;

endif;endloop;将loop语句中的跳转语句用条件语句进行改写,要求循环语句能完成相同功能。2023/5/2281练习书写一个loop语句,当时钟输入clk变为‘1’时,对输入d进行取样,只要d为’0’,循环继续执行;当d为‘1’时,循环退出。loopwaituntilclk=‘1’;exitwhend=‘1’;endloop;2023/5/2282练习书写一个while循环计算x的幂函数值,利用下面的级数进行求和,精度为104分之一。sum:=1.0;term:=1.0;n:=0;whileabs(term)>abs(sum/1.0e5)loopn:=n+1;term:=term*x/real’(n);sum:=sum+term;endloop;2023/5/2283练习书写一个for循环计算x的幂函数值,利用下面的级数进行求和,计算前8项。sum:=1.0;term:=1.0;fornin1to7loopterm:=term*x/real’(n);sum:=sum+term;endloop;2023/5/22845.2并发描述语句实际系统的许多操作是并发的,所以在对系统进行仿真时,系统中所有元件在定义的仿真时刻应该是并发工作的。硬件描述语句的并发描述语句就是用来表示这种并发行为的,并发描述可以是结构性的,也可以是行为性的。并发语句具有顺序无关性。2023/5/2285VHDL语言的并发描述语句——进程语句

——并发信号代入语句

——条件信号代入语句

——选择信号代入语句——并发过程调用语句

——块语句

——component语句

——generate语句进程语句信号代入语句过程调用语句……2023/5/2286并发语句在VHDL语句程序结构中出现的位置architecturearofmy_circuitissignalreset,divclk:std_logic;constantmc:std_logic_vector(15downto0):=“10001111”;componentcountisport(clk,rst:instd_logic;q:outstd_logic_vector(15downto0);endcomponentcount;begin

reset<=‘1’whenqout=mcelse‘0’;cnt1:count

portmap(gclk,reset,divclk);control:process(divclk)is

begin……

endprocesscontrol;……endarchitecturear;进程内部为顺序域构造体的begin\end之间为并发域2023/5/22875.2.1进程语句在一个结构体中,进程语句是并发处理语句,多个process语句是并行运行的。进程语句的特点:进程可存取构造体或实体中所定义的信号;进程内部所有语句都是顺序执行的;为了启动进程,在进程中必须包含有一个显示的敏感信号量表或包含一个wait语句;进程之间的通信通过信号量传递来实现。2023/5/22885.2.2并发信号代入语句

(concurrentsignalassignment)信号代入语句在进程中作为顺序语句使用,也可以在进程外作为并发信号代入语句使用;一个并发信号代入语句是一个进程的缩写。architecturebehaveofa_barisbeginoutput<=a(i);endbehave;process(a,i)beginoutput<=a(i);endprocess;2023/5/2289并发信号代入语句可用于仿真:加法器乘法器除法器比较器各种逻辑电路的输出并发代入语句在仿真时刻同时运行,表征了各个独立器件的各自独立操作:

a<=b+c;d<=e*f;这两条语句表明在实际的硬件系统中,加法器和乘法器是独立并行工作的。因此,代入符号的右边可为:算术运算表达式关系运算表达式逻辑运算表达式2023/5/22905.2.3条件信号代入语句

(conditionalsignalassignment)

条件信号代入语句是一个特殊的信号代入形式,与if-then-else语句类似,其赋值条件的判断具有顺序性。目的信号<=

表达式1when

条件1else

表达式2when

条件2else

表达式3when条件3else┆

表达式n;when后条件为真则将when前表达式的值赋给目标信号1)书写格式2023/5/22912)举例四选一电路libraryieee;useieee.std_logic_1164.all;entitykmux4isport(i0,i1,i2,i3,a,b:instd_logic;q:outstd_logic);endkmux4;architecturertlofkmux4issignalsel:std_logic_vector(1downto0);beginsel<=b&a;q<=i0whensel="00"elsei1whensel="01"elsei2whensel="10"elsei3whensel="11"else‘X’;endrtl;列出的条件具有隐含的优先级2023/5/22924)条件信号代入语句与if语句的区别if语句只能在进程内部使用,属于顺序语句;条件信号代入语句中的else项一定要有;条件信号代入不能进行嵌套。3)条件信号代入语句的隐含优先级

若条件信号代入语句中有两个或多个表达式的条件为真,则仅将第一个条件为真的表达式赋给对象。Z<=AwhenASSIGN_A=‘1’elseBwhenASSIGN_B=‘1’elseC;2023/5/22935.2.4选择信号代入语句

(selectivesignalassignment)

选择信号代入语句类似于case语句,可在进程外实现case进程的功能,选择信号代入语句对表达式进行测试,当表达式取值不同时,将使用不同的值代入目的信号量。with

选择条件表达式select目标信号

<=

表达式1when

选择条件1,

表达式2when

选择条件2, …

表达式nwhen

选择条件n;要确保when子句能够包含所有的条件1)书写格式2023/5/22942)举例:四选一电路(使用选择信号代入语句)libraryieee;useieee.std_logic_1164.all;entitymuxisport(i0,i1,i2,i3,a,b:instd_logic;q:outstd_logic);endentitymux;architecturebehaveofmuxissignalsel:integer;mux4bai0i1i2i3q2023/5/2295beginwithselselectq<=i0when0,i1when1,i2when2,i3when3,‘X’whenothers;sel<=0whena=’0’andb=’0’else1whena=’1’andb=’0’else2whena=’0’andb=’1’else3whena=’1’andb=’1’else4;endarchitecturebehave;sel为integer数据类型

sel取的是哪些值?

Answer:{0,1,2,3,4}

那么whenothers子句有必要写吗?

Answer:有必要2023/5/22963)选择条件的要求与case语句类似,选择条件不得有重叠;若others选项不存在,选项集合必须能够覆盖选择条件表达式的所有可能值;选择条件可以是静态表达式,或是静态范围。4)与进程中的case语句等价2023/5/2297练习:将下面的选择信号代入语句用进程中的case语句进行改写withbit_vector’(s&r)selectq<=‘0’when“00”,‘1’when“01”|“10”,‘X’when“11”;process(s,r)begincasebit_vector’(s&r)iswhen“00”=>q<=‘0’;when“01”|“10”=>q<=‘1’;when“11”=>q<=‘X’;endcase;endprocess;2023/5/2298练习:将下面的条件信号代入语句用进程中的条件语句进行改写Z<=AwhenASSIGN_A=‘1’elseBwhenASSIGN_B=‘1’elseC;process(A,B,C,ASSIGN_A,ASSIGN_B)beginifASSIGN_A=‘1’thenZ<=A;elsifASSIGN_B=‘1’thenZ<=B;elseZ<=C;endif;endprocess;2023/5/22995.2.5并发过程调用语句

(concurrentprocedurecall)过程调用可以出现在构造体中,在进程之外执行。1、过程调用应注意几点:1)并发过程调用语句是一个完整的语句,在它的前面可以加标号;2)并发过程调用语句应带有in、out或inout的参数,它们应列于过程名后跟的括号内;3)并发过程调用可以有多个返回值,但是这些返回值必须通过过程中所定义的输出参数带回。2023/5/22100并发过程调用的实例libraryieee;useieee.std_logic_1164.all;entityvtointisport(z:instd_logic_vector(3downto0);x_flag:outboolean;q:inoutinteger);endvtoint;architecturertlofvtointis……过程定义--p21??begin

vector_to_int(z,x_flag,q);endrtl;vector_to_int进行二进制数到十进制数的转换,x_flag为转换成功与否的标志2023/5/22101procedurevector_to_int(z:instd_logic_vector;signalx_flag:outboolean;signalq:inoutinteger)isvariablex_flag_temp:boolean;variableq_temp:integer;beginq_temp:=0;x_flag_temp:=false;foriinz'rangeloopq_temp:=q_temp*2;if(z(i)='1')thenq_temp:=q_temp+1;elsif(z(i)/='0')thenx_flag_temp:=true;endif;endloop;q<=q_temp;x_flag<=x_flag_temp;endprocedurevector_to_int;vector_to_int进行二进制数到十进制数的转换,x_flag为转换成功与否的标志2023/5/22102过程定义的两点注意:过程只使用参量表中的信号和变量及过程内部定义的变量。如果过程要实现对信号的代入操

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论