资源描述
第四章VHDL顺序语句(SequentialStatement),Process,Function,Procedure中的语句都是顺序执行,以Process为例Process与Process之间,与其他并行语句之间都是并行的关系,4.1、赋值语句,1.顺序信号赋值语句信号名=赋值源;赋值符号左边必须是信号名,但不能是端口声明中指定为in的信号。右边表达式中可以出现任意对象类,但不能出现端口声明中指定为out的信号。例:B=A;-惯性延迟,无时间延迟子句,即延迟D=Cafter5ns;-传输延迟,指定延迟时间,2.变量赋值语句,变量赋值的含义是:用计算赋值符号右边的表达式所得新值取代变量原来的值。变量赋值的语法形式为:变量名:=表达式;,3、赋值目标,a:=1;C1:=“1100”;G(2)g(1),1=g(2):=h;-g(2):=h(1);g(1):=h(2);e:=h(3);f:=h(4);,4.2流程控制结构,VHDL为用户提供了若干控制进程内部执行流的结构,可分为条件控制和循环控制两种。IF语句CASE语句LOOP语句NEXT语句EXIT语句,1.if语句(条件控制语句),if条件表达式then顺序语句endif;,if条件表达式then顺序语句else顺序语句endif;,if条件表达式then顺序语句elsif条件表达式then顺序语句else顺序语句endif;,求取最大值,BEGINIF(ab)THENy=b;ELSEy=a;ENDIF;ENDmax;,B用VHDL设计一个D触发器,ddf1,引进内部节点信号,进程和敏感信号,检测CLK上升沿,将数据输出端口,顺序语句,PROCESS(clock,clear)BEGINIFclear=0THENq=0;ELSIFclockEVENTandclock=1THENq=d;ENDIF;ENDPROCESS;,T触发器,Process(clk)beginif(clkeventandclk=1)thenif(t=1)thenq=not(q);elseq=q;endif;endif;endprocess;,ENTITYmulISPORT(a,b,sel:INBIT;data_out:OUTBIT);ENDmul;ARCHITECTUREexOFmulISSIGNALtemp:BIT;BEGINprocess_a:PROCESS(a,b,selx)BEGINIF(sel=0)THENtemp=a;ELSEtemp语句;whenothers=语句;endcase;case语句选择项的要求:选择唯一,覆盖全集。,2、case语句,选择值的表达方式,单个普通数值8数值选择范围(2to4)并列数值3|5|8混合方式,LIBRARYieee;USEieee.std_logic_1164.all;ENTITYmux41isPORT(s1,s2,a,b,c,d:INSTD_LOGIC;z:OUTSTD_LOGIC);ENDmux41;ARCHITECTUREactivOFmux41ISSIGNALs:STD_LOGIC_VECTOR(1DOWNTO0);BEGINszzzzzOut1Out1Out1Out110;endlooploop2;,(2)forloop语句,loop标号:for循环变量in循环次数范围loop顺序语句;endlooploop标号;循环变量由循环次数范围确定其类型,无需声明。循环变量可用在循环体中,但一旦循环结束,循环变量不再起作用,即不能把循环变量的值带到循环体外。,8位奇偶校验电路ENTITYp_checkisPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);Y:OUTSTD_LOGIC);ENDp_check;ARCHITECTUREoptOFp_checkISSIGNALtmp:STD_LOGIC;BEGINPROCESS(a)BEGINtmp=0;fornin0to7looptmp=tmpXORa(n);endloop;y=tmp;ENDPROCESS;ENDopt;,(3)whileloop语句,标号:while循环控制条件loop语句;endloop标号;循环控制条件是布尔类型。每次执行完循环体之后,都要检测条件表达式的值是真还是假。只要其值为真,就要在执行一次循环体内的语句。在条件为假时结束循环。,process(inputx)variablen:Integer:=1;beginL1:whilen=8loopoutputx(n)=inputx(n+8);n:=n+1;endloopL1;endprocess;,(4)next语句,该语句控制循环提前进入下一次循环,即跳过该语句后面的语句执行指定标号的下一个循环next;nextloop标号;nextloop标号when条件表达式;,loop2:loopB:=B+1;nextloop2whenB10;.endlooploop2;,(5)exit语句,exit语句使得从循环标号所标明的循环中退出。exit;exitloop标号;exitloop标号when条件表达式如果指定条件,必须要在所绐条件为真的前提下,才从循环标号所标明的循环中退出。两种情况下的循环标号都是可选项。如果语句中末给出循环标号,则从当前循环中退出。,signala,b:std_logic_vector(1downto0);signala_less_then_b:BOOLEAN;a_less_then_b=false;foriin1downto0loopIF(a(i)=1ANDb(i)=0THENa_less_then_b实参表达式);,PACKAGEdata_typeISsubtypedata_elementisintegerrange0to3;typedata_arrayisarray(1to3)ofdata_element;enddata_type;,usework.data_type.all;ENTITYsortisPORT(in_array:indata_array;out_array:outdata_array;ENDsort;ARCHITECTUREexmpOFsortISBEGINPROCESS(in_array)procedureswap(data:inoutdata_array;low,high:ininteger)isvariabletemp:data_element;BEGINif(data(low)data(high)thentmp:=data(low);data(low):=data(high);data(high):=temp;endif;Endswap;Variblemy_array:data_array;,Beginmy_array:=in_array;Swap(my_array,1,2);Swap(my_array,2,3);Swap(my_array,1,2);Out_arrayb)THENtmp:=a;ELSEtmp:=b;ENDIF;RETURNtmp;ENDmax;,函数的参数均为输入参数。函数调用返回一个指定数据类型的值。,ARCHITECTURErtlOFdpeakISSIGNALpeak:STD_LOGIC_VECTOR(5downto0);BEGINdout=peak;PROCESS(clk)BEGINIF(clkeventandclk=1)THENIF(set=1)THENpeakx:=xmod2;-其他情况下以2为模。endcase;endModTwo,
展开阅读全文