资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,HYIT,标号,:,FOR,循环变量,IN,循环次数范围,LOOP,顺序语句,END LOOP,标号,;,标号,:,WHILE,循环控制条件,LOOP,顺序语句,END LOOP,标号,;,FOR LOOP,的,语句格式,WHILE LOOP,的,语句格式,LOOP,语,句,1,FOR LOOP,重复次数已知;循环变量是整数型变量,不需要在结构体或进程中定义,在循环体中不能通过信号或变量给循环变量赋值。,WHILE LOOP,重复次数未知;,标号是可省略;,2,【,例,】,SIGNAL byte,:,STD_LOGIC_VECTOR(3 DOWNTO 0),;,VARIABLE sum: integer range 0 to 100 :=0;,.,loop1: WHILE i=9 LOOP,i:=i+1;,sum:=sum+1;,end loop loop1;,loop2: for i in,byterange,loop,sum:=sum+2;,end loop loop2;,loop3: for i in,bytelow,to,bytehigh,loop,sum:=sum+3;,end loop ;,3 DOWNTO 0,0 TO 3,3,【,例,】,For,循环(奇偶校验电路):,Ent,i,ty pa,rity,_,checker,Is,Por,t,(data:In,std_logic,_,vector(7 do,wn,t,o,0,),;,p,:,Out,std_logic,),;,End par,i,t,y_,checker,;,ArcLitecture behav,i,or Of,p,a,rity,_,checker,I,s,Begin,4,Process(data,),Varia,b,le,tmp,:,std,_logic,;,Begin,tmp,:=0;,For,n,i,n,7,downto,0,Loop,tmp,:=,tmp,xor,data(,n,);,End Loop;,p,=,t,m,p,;,End Process,;,End behavi,o,r,;,5,思考: 如果中间变量,tmp,修改,为信号,电路的功能还能正常实现吗?(实验中练习),6,【,例,】,利用,LOOP,语句简化同类顺序语句的表达式,SIGNAL A,,,B,,,C,:,STD_LOGIC_VECTOR(1 TO 3),;,FOR N IN 1 TO 3 LOOP,A(N)=B(N) AND C(N),;,END LOOP,;,等效于:,A(1)=B(1) AND C(1),;,A(2)=B(2) AND C(2),;,A(3)F),:,B(k+8):=0,;,K:=K+1,;,NEXT LOOP,L_Y,;,NEXT LOOP,L_X,;,12,EXIT LOOP,标号, WHEN,条件表达式,;,EXIT,的,语句格式,EXIT,语句,四,种,形式,:,EXIT,;,EXIT LOOP,标号;,EXIT WHEN,条件表达式;,EXIT LOOP,标号,WHEN,条件表达式;,EXIT,语句主要用在,LOOP,语句中有条件的或无条件地,跳出循环。,13,当,LOOP,标号缺省时,跳到,End Loop,语句的后继位置,开始向后执行;如果标号不省略,则可以跳到多层嵌套循环的指定外层循环起始处。,当,WHEN,缺省时,无条件跳出循环。如果,“,When,条件,”,不省略,则条件为,True,时,跳出循环。,14,Next,只结束本次循环,开始下一次循环;跳向,LOOP,语句的起始点。,Exit,语句结束整个循环,跳出循环体外。跳向,LOOP,语句的终点。,Next,语句和,Exit,语句的区别,15,【,例,】,SIGNAL A,,,B,:,STD_LOGIC_VECTOR(1 DOWNTO 0),;,SIGNAL A_LESS_THEN_B,:,BOOLEAN,;,A_LESS_THEN_B=FLASE,;,-,设初始值,FOR I IN 1 DOWNTO 0 LOOP,IF (A(I)=1 AND B(I)=0) THEN,A_LESS_THEN_B=FALSE,;,EXIT,;,ELSIF (A(I)=0 AND B(I)=1) THEN,A_LESS_THEN_B=TRUE,;,-A TMP,:,= REGA AND REGB,;,WHEN “101”= TMP,:,= REGA OR REGB,;,WHEN “110”= TMP,:,= NOT REGA,;,WHEN OTHERS = NULL;,END CASE,;,此例类似于一个,CPU,内部的指令译码器功能。“,001”,,,101,和“,110”,分别代表指令操作码,对于它们所对应在寄存器中的操作数的操作算法,,CPU,只能对这三种指令码作反应,当出现其他码时,不作任何操作。,18,与其他的,EDA,工具不同,,MAX+plusII,对,NULL,语句的执行会出现擅自加入锁存器的情况,因此,应避免使用,NULL,语句,改用确定操作。,如可改为:,WHEN OTHERS = TMP,:,=REGA,;,19,WAIT UNTIL,条件表达式,;,WAIT FOR,时间,表达式,;,WAIT ON,信号列表;,WAIT,;,WAIT,的,语句格式,在进程中,(,包括过程中,),,当进程执行到,Wait,语句时,将被挂起,并设置好再次执行的条件。可以是无限等待,(Wait),或有限等待。注意:已列出敏感量的进程中不能使用任何形式的,WAIT,语句,WAIT,语句,20,信号列表可以包括一个或多个信号,信号列表中的任何一个信号的值发生变化,进程将结束挂起状态,进入执行状态,执行,Wait on,语句后面的语句。,Wait on,信号列表;,如:,Wait on a,,,b,,,s;,它等待信号,a,、,b,、,s,中的任何一个发生变化。,21,【,例,】,Entity mux2 Is,Port (,a,b,: In,std_logic,;,s,:,In,std_logic,;,f,:,Out,std_logic,);,End mux2,;,Architecture behavior Of mux2 Is,Begin,mux2:Process(a,b,s),Begin,If (s=0) Then f=a;,Else f=b;,End If;,End Process;,End behavior;,mux2:Process(),Begin,If (s=0) Then f=a;,Else f=b;,End If;,Wait on,a,b,s,;,End Process;,22,当条件表达式为,“,真,”,时,进程将结束挂起状态,进入执行状态,执行,Wait Until,语句的后继语句。,WAIT UNTIL,条件表达式,如:,Wait Until a,1;,a,的值不是,1,时,进程执行到该语句将被挂起,,a,的值为,1,时,进程再次被启动,继续执行,Wait,语句的后继语句。,23,WAIT_UNTIL,语句有以下三种表达方式:,WAIT UNTIL,信号,=VALUE,;,WAIT UNTIL,信号,EVENT AND,信号,=VALUE,;,WAIT UNTIL NOT,信号,STABLE AND,信号,=VALUE,24,CLOCK,上跳沿启动进程:,WAIT UNTIL CLOCK =1,;,WAIT UNTIL RISING_EDGE(CLOCK),;,WAIT UNTIL NOT CLOCKSTABLE AND CLOCK=1,;,WAIT UNTIL CLOCK=1 AND CLOCKEVENT,;,25,【,例,】,PROCESS,BEGIN,WAIT UNTIL CLK= 1,;,AVE=A,;,WAIT UNTIL CLK= 1,;,AVE=AVE+A,;,WAIT UNTIL CLK= 1,;,AVE=AVE+A,;,WAIT UNTIL CLK= 1,;,AVE=(AVE+A)/4,;,END PROCESS,;,功能?,26,完成一个硬件求平均的功能,每一个时钟脉冲由,A,输入一个数值,,4,个时钟脉冲后将获得此,4,个数值的平均值。,27,【,例,】,PROCESS,BEGIN,RST_LOOP,:,LOOP,WAIT UNTIL CLOCK=1 AND CLOCKEVENT,;,NEXT RST_LOOP WHEN (RST=1),;,X=A,;,WAIT UNTIL CLOCK=1AND CLOCKEVENT,;,NEXT RST_LOOP WHEN (RST=1),;,Y=B,;,END LOOP RST_LOOP,;,END PROCESS ;,每一时钟上升沿都结束进程的挂起,继而检测电路的复位是否为高。如果是,则返回循环的起点;否则,则进行正常的顺序语句执行操作。,28,WAIT For,时间表达式,如:,Wait For 30 ns;,Wait For,语句只能仿真时使用,不能被综合。,为超时语句,从执行语句开始,在规定时间段内,进程挂起,当超过这一时间段后,进程自动恢复执行。,29,例如:,Wait on,clk,until,clk,=1;,复合,Wait,语句,编程时注意等待条件的判别,不要出现,“,死锁,”,状态(即无限期等待)。,30,断言语句主要作为仿真和调试中的人机会话,给出一个文字串作为警告和错误提示信息。,当执行,Assert,语句时,就会对条件进行判别。如果条件为,“,真,”,,则执行下一条语句;如果条件为,“,假,”,,则输出由,report,指定的输出信息和由,severity,指定的错误级别。在,report,后面跟的是设计者所写的文字串,通常是说明错误的原因,文字串应该用双引号,“”,引起来。,断言语句不可综合,仅仅是为了仿真的方便。,断言语句,Assert,Assert,条件,report,输出信息,severity,级别,Assert,语句,的,格式,31,例:,Assert,(a,255,),report,”,a,o,ut,of edge,”,;,severity error,;,该断言语句的条件是信号量B,1,。如果执行到该语句时,信号量B,0,,说明条件不满足,就会输出report后跟的文字串。该文字串说明,出现了超时等待错误。severity后跟的错误级别告诉操作人员,其出错级别为error。,32,后面介绍。,子程序调用及返回语句,33,小 结,顺序语句,赋值语句,转向控制语句,(,If,、,Case,、,Loop,、,Next,、,Exit,),等待语句,(wait),子程序调用语句,断言语句,(,assert,),空操作语句,(null),34,作业,1,:设计一个,3-8,译码器,:,35,【,例,】,(a) WAIT_UNTIL,结构,(b) WAIT_ON,结构,. LOOP,WAIT UNTIL ENABLE =1,;,WAIT ON ENABLE,. EXIT WHEN ENABLE =1,;,END LOOP,;,由以上脱离挂起状态、重新启动进程的两个条件可知,例,3.4.20,结束挂起所需满足的条件,实际上是一个信号的上跳沿。因为当满足所有条件后,ENABLE,为,1,,可推知,ENABLE,一定是由,0,变化来的。因此,上例中进程的启动条件是,ENABLE,出现一个上跳信号沿。,36,一般地,在一个进程中使用了,WAIT,语句后,经综合就会产生时序逻辑电路。时序逻辑电路的运行依赖于时钟的上升沿或下降沿,同时还具有数据存储的功能。,下例就是一个比较好的说明,此例描述了一个可预置校验对比值的四位奇偶校验电路,它的功能除对输入的,4,位码,DATA(0 TO 3),进行奇偶校验外,还将把校验结果与预置的校验值,NEW_CORRECT_PARITY,进行比较,并将比较值,PARITY_OK,输出。,37,【,例,】,LIBRARY IEEE,;,USE IEEE.STD_LOGIC_1164.ALL,;,ENTITY PARI IS,PORT(CLOCK,:,IN STD_LOGIC,;,SET_PARITY,:,IN STD_LOGIC,;,NEW_CORRECT_PARITY,:,IN STD_LOGIC,;,DATA,:,IN STD_LOGIC_VECTOR(0 TO 3),;,PARITY_OK,:,OUT BOOLEAN),;,END PARI,;,38,ARCHITECTURE ART OF PARI IS,SIGNAL CORRECT_PARITY,:,STD_LOGIC,;,BEGIN,PROCESS(CLOCK),VARIABLE TEMP,:,STD_LOGIC,;,BEGIN,WAIT UNTIL CLOCKEVENT AND CLOCK= 1;,IF SET_PARITY=1THEN,FIRST,:,CORRECT_PARITY=NEW_CORRECT_PARITY,;,39,END IF,;,TEMP:=0,;,FOR I IN DATARANGE LOOP,TEMP:=TEMP XOR DATA(I),;,END LOOP,;,SECOND,:,PARITY_OK=(TEMP=CORRECT_PARITY),;,END PROCESS,;,END ART,;,40,例中,,NEW_CORRECT_PARITY,是预置校验值输入端,,SET_PARITY,是预置校验值的输入与比较控制端。从例可以看出,由于,WAIT,语句的加入,综合后引入了两个,D,触发器,用于存储数据。第一个触发器存储,CORRECT_PARITY,,,它来自标号为,FIRST,的语句;第二个触发器用于两个时钟信号间,PARITY_OK,的存储,它来自标号为,SECORD,的语句。综合器没有为变量,TEMP,的赋值行为增加触发器,因为,TEMP,是一个临时变量。,WAIT FOR,时间表达式为超时语句,在此语句中定义了一个时间段,从执行到当前的,WAIT,语句开始,在此时间段内,进程处于挂起状态,当超过这一时间段后,进程自动恢复执行。由于此语句不可综合,在此不做讨论。,41,作业,1,:将向量转化为整数输出,entity,conv_int,is,port,(,vect,:,in,bit_vector,(7,downto,0);,result,:,out,integer,);,end,conv_int,;,architecture,A,of,conv_int,is,begin,process,(,vect,),variable,tmp,:,integer,;,begin,tmp,:= 0;,for,i,in,7,downto,0,loop,if,(,vect (i,) = 1),then,tmp:= tmp + 2*,i,;,end if,;,end loop;,result =,vect, low),LOOP,IF,(,vect,(i) = 1),THEN,tmp,:=,tmp,+ 2*,i,;,END IF,;,i:= i - 1; -,修改循环变量,END LOOP,;,result =,tmp,;,END PROCESS;,END,B;,42,作业,2,:设计描述,4,选,1,总线多路选择器,43,【,例,】,用,CASE,语句描述,4,选,1,多路选择器。,LIBRARY IEEE,;,USE IEEE.STD_LOGIC_1164.ALL,;,ENTITY MUX41 IS,PORT(S1,,,S2,:,IN STD_LOGIC,;,A,,,B,,,C,,,D,:,IN STD_LOGIC,;,Z,:,OUT STD_LOGIC),;,END ENTITY MUX41,;,ARCHITECTURE ART OF MUX41 IS,SIGNAL S,:,STD_LOGIC_VECTOR(1 DOWNTO 0),;,44,BEGIN,SZZZZZreg(0)=c0;,reg(7,downto,1)=reg(6,downto,0); cyreg(0)=reg(7);,reg(7,downto,1)reg(7)=reg(0);,eg(6,downto,0)reg(7)=cy;,reg(6,downto,0)=reg(7,downto,1); cyreg(7,downto,0),reg,=,reg;cy,=cy;,49,end case;,end if;,end process;,qb(7,downto,0)=reg(7,downto,0);,cn,=cy;,end;,50,51,BEGIN,sel,:= 0,;,-,输入初始值,IF (S1= 1) THEN SEL:=SEL+1,;,ELSIF(S2= 1) THEN SEL:=SEL+2,;,ELSIF(S3= 1) THEN SEL:=SEL+4,;,ELSIF(S4= 1) THEN SEL:=SEL+8,;,ELSE NULL,;,-,注意,这里使用了空操作语句,END IF,;,Z1=0,;,Z2=0,;,Z3=0,;,Z4Z1Z2Z3Z4=1,;,-,当,SEL,为,8,15,中任一值时选中,END CASE,;,END PROCESS,;,END ART,;,设计一个二进制转,8421BCD,码的程序,用,CASE,语句实现,?,53,例,3.4.10,中的,IF_THEN_ELSIF,语句所起的作用是数据类型转换器的作用,即把输入的,S4,、,S3,、,S2,、,S1,的,4,位二进制输入值转化为能与,TEMP,对应的整数值,以便可以在条件句中进行比较,54,顺序语句,(Sequential,Staements,),和并行语句,(Concurrent Statements),是,VHDL,程序设计中两大基本描述语句系列。在逻辑系统的设计中,这些语句从多侧面完整地描述数字系统的硬件结构和基本逻辑功能,其中包括通信的方式、信号的赋值、多层次的元件例化以及系统行为等。,顺序语句是相对于并行语句而言的,其特点是每一条顺序语句的执行,(,指仿真执行,),顺序是与它们的书写顺序基本一致的,但其相应的硬件逻辑工作方式未必如此,希望读者在理解过程中要注意区分,VHDL,语言的软件行为及描述综合后的硬件行为间的差异。,55,顺序语句只能出现在进程,(Process),和子程序中。在,VHDL,中,一个进程是由一系列顺序语句构成的,而进程本身属并行语句,这就是说,在同一设计实体中,所有的进程是并行执行的。然而任一给定的时刻内,在每一个进程内,只能执行一条顺序语句。一个进程与其设计实体的其他部分进行数据交换的方式只能通过信号或端口。如果要在进程中完成某些特定的算法和逻辑操作,也可以通过依次调用子程序来实现,但子程序本身并无顺序和并行语句之分。利用顺序语句可以描述逻辑系统中的组合逻辑、时序逻辑或它们的综合体。,56,信号赋值语句,信号的赋值语句格式:,目标信号名,=,表达式,;,例:,c=,1,;,q=,“,010010,”,;,q(1)=,1,;,q(3,downto,1)=,“,001,”,;,a=b;,s=a,xor,b;,x=,y+z,;,57,例,5:,电路仿真图,58,综合电路图,59,修改之后的程序,?,60,仿真图,61,综合电路图,62,63,一般的,在书写程序时,应将,VHDL,的,保留字,大写或黑体,,设计者,自己定义的字符小写,,以使得程序,便于阅读和检查,。尽管,VHDL,仿真综合时不区分大小写,但一个优秀的硬件程序设计师应该养成良好的习惯。,例:,一些合法的标识符:,S_MACHINE,,,present_state,,,sig3,不合法的标识符:,present,-,state,,,3,states,,,cons_,_now,64,
展开阅读全文