EDA技术VHDL顺序语句演示文稿_第1页
EDA技术VHDL顺序语句演示文稿_第2页
EDA技术VHDL顺序语句演示文稿_第3页
EDA技术VHDL顺序语句演示文稿_第4页
EDA技术VHDL顺序语句演示文稿_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

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

文档简介

EDA技术VHDL顺序语句演示文稿1现在是1页\一共有63页\编辑于星期日

FORLOOP重复次数已知;循环变量是整数型变量,不需要在结构体或进程中定义,在循环体中不能通过信号或变量给循环变量赋值。

WHILELOOP重复次数未知;标号是可省略;2现在是2页\一共有63页\编辑于星期日【例】SIGNALbyte:STD_LOGIC_VECTOR(3DOWNTO0);…VARIABLEsum:integerrange0to100:=0;...loop1:WHILEi<=9LOOPi:=i+1;sum:=sum+1;endlooploop1;loop2:foriinbyte’rangeloopsum:=sum+2;endlooploop2;loop3:foriinbyte’lowtobyte’highloopsum:=sum+3;endloop;3DOWNTO00TO33现在是3页\一共有63页\编辑于星期日【例】

For循环(奇偶校验电路):Entityparity_checkerIs

Port(data:Instd_logic_vector(7downto

0);

p:Outstd_logic);Endparity_checker;ArcLitecturebehaviorOfparity_checkerIs

Begin

4现在是4页\一共有63页\编辑于星期日Process(data)

Variabletmp:std_logic;

Begin

tmp:=‘0’;

Forn

in7downto0Loop

tmp:=tmpxordata(n);

EndLoop;

p<=tmp;EndProcess;Endbehavior;5现在是5页\一共有63页\编辑于星期日思考:如果中间变量tmp修改为信号,电路的功能还能正常实现吗?(实验中练习)6现在是6页\一共有63页\编辑于星期日【例】利用LOOP语句简化同类顺序语句的表达式SIGNALA,B,C:STD_LOGIC_VECTOR(1TO3);…FORNIN1TO3LOOPA(N)<=B(N)ANDC(N);ENDLOOP;等效于:A(1)<=B(1)ANDC(1);A(2)<=B(2)ANDC(2);A(3)<=B(3)ANDC(3);7现在是7页\一共有63页\编辑于星期日NEXT[LOOP标号][WHEN条件表达式];NEXT的语句格式NEXT语句四种形式:NEXT;NEXTLOOP标号;NEXTWHEN条件表达式;NEXTLOOP标号WHEN条件表达式;NEXT语句主要用在LOOP语句中有条件的或无条件地开始下次循环。8现在是8页\一共有63页\编辑于星期日当LOOP标号缺省时,跳回到本次循环LOOP语句开始处,开始下一次循环;否则跳转到指定标号的LOOP语句开始处,重新开始执行循环操作。当WHEN缺省时,即刻无条件终止当前的循环;若WHEN子句出现,则当条件表达式的值为TRUE,则执行NEXT语句,进入跳转操作,否则继续向下执行。9现在是9页\一共有63页\编辑于星期日【例】…L1:FORCNT_VALUEIN1TO8LOOPA(CNT_VALUE):=‘0’;NEXTWHEN(B=C);A(CNT_VALUE+8):=‘0’;ENDLOOPL1;10现在是10页\一共有63页\编辑于星期日在多重循环中,NEXT语句必须加上跳转标号。11现在是11页\一共有63页\编辑于星期日【例】…L_X:FORCNT_VALUEIN1TO8LOOPA(CNT_VALUE):=‘0’;

K:=0;

L_Y:LOOPB(k):=‘0’;

NEXTL_XWHEN(E>F):B(k+8):=‘0’;

K:=K+1;

NEXTLOOPL_Y;NEXTLOOPL_X;…12现在是12页\一共有63页\编辑于星期日EXIT[LOOP标号][WHEN条件表达式];EXIT的语句格式EXIT语句四种形式:EXIT;EXITLOOP标号;EXITWHEN条件表达式;EXITLOOP标号WHEN条件表达式;EXIT语句主要用在LOOP语句中有条件的或无条件地跳出循环。13现在是13页\一共有63页\编辑于星期日当LOOP标号缺省时,跳到EndLoop语句的后继位置,开始向后执行;如果标号不省略,则可以跳到多层嵌套循环的指定外层循环起始处。当WHEN缺省时,无条件跳出循环。如果“When条件”不省略,则条件为True时,跳出循环。14现在是14页\一共有63页\编辑于星期日Next只结束本次循环,开始下一次循环;跳向LOOP语句的起始点。Exit语句结束整个循环,跳出循环体外。跳向LOOP语句的终点。Next语句和Exit语句的区别15现在是15页\一共有63页\编辑于星期日【例】SIGNALA,B:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALA_LESS_THEN_B:BOOLEAN;…A_LESS_THEN_B<=FLASE;--设初始值FORIIN1DOWNTO0LOOPIF(A(I)=‘1’ANDB(I)=‘0’)THENA_LESS_THEN_B<=FALSE;

EXIT;ELSIF(A(I)=‘0’ANDB(I)=‘1’)THENA_LESS_THEN_B<=TRUE;--A<BEXIT;ELSE;

NULL;ENDIF;ENDLOOP;16现在是16页\一共有63页\编辑于星期日NULL;NULL的语句格式空语句不会执行任何操作;NULL常用于CASE语句中,为满足所有可能的条件,利用NULL来表示所余的不用条件下的操作行为。NULL语句17现在是17页\一共有63页\编辑于星期日【例】CASEOPCODEISWHEN“001”=>TMP:=REGAANDREGB;

WHEN“101”=>TMP:=REGAORREGB;

WHEN“110”=>TMP:=NOTREGA;

WHENOTHERS=>NULL;ENDCASE;此例类似于一个CPU内部的指令译码器功能。“001”,"101"和“110”分别代表指令操作码,对于它们所对应在寄存器中的操作数的操作算法,CPU只能对这三种指令码作反应,当出现其他码时,不作任何操作。18现在是18页\一共有63页\编辑于星期日与其他的EDA工具不同,MAX+plusII对NULL语句的执行会出现擅自加入锁存器的情况,因此,应避免使用NULL语句,改用确定操作。如可改为:

WHENOTHERS=>TMP:=REGA;19现在是19页\一共有63页\编辑于星期日WAITUNTIL条件表达式;WAITFOR时间表达式;WAITON信号列表;WAIT;WAIT的语句格式在进程中(包括过程中),当进程执行到Wait语句时,将被挂起,并设置好再次执行的条件。可以是无限等待(Wait)或有限等待。注意:已列出敏感量的进程中不能使用任何形式的WAIT语句WAIT语句20现在是20页\一共有63页\编辑于星期日信号列表可以包括一个或多个信号,信号列表中的任何一个信号的值发生变化,进程将结束挂起状态,进入执行状态,执行Waiton语句后面的语句。Waiton信号列表;如:

Waitona,b,s;它等待信号a、b、s中的任何一个发生变化。21现在是21页\一共有63页\编辑于星期日【例】Entitymux2Is

Port(a,b:Instd_logic;

s:Instd_logic;

f:Outstd_logic);Endmux2;ArchitecturebehaviorOfmux2IsBegin

mux2:Process(a,b,s)

Begin

If(s=‘0’)Thenf<=a;

Elsef<=b;

EndIf;

EndProcess;Endbehavior;mux2:Process()Begin

If(s=‘0’)Thenf<=a;

Elsef<=b;

EndIf;

Waitona,b,s;EndProcess;22现在是22页\一共有63页\编辑于星期日当条件表达式为“真”时,进程将结束挂起状态,进入执行状态,执行WaitUntil语句的后继语句。WAITUNTIL条件表达式如:

WaitUntila=’1’;

a的值不是’1’时,进程执行到该语句将被挂起,a的值为’1’时,进程再次被启动,继续执行Wait语句的后继语句。23现在是23页\一共有63页\编辑于星期日WAIT_UNTIL语句有以下三种表达方式:WAITUNTIL信号=VALUE; WAITUNTIL信号'EVENTAND信号=VALUE;WAITUNTILNOT信号'STABLEAND信号=VALUE24现在是24页\一共有63页\编辑于星期日CLOCK上跳沿启动进程:WAITUNTILCLOCK=‘1’;WAITUNTILRISING_EDGE(CLOCK);WAITUNTILNOTCLOCK'STABLEANDCLOCK='1';WAITUNTILCLOCK=‘1’ANDCLOCK'EVENT;25现在是25页\一共有63页\编辑于星期日【例】PROCESSBEGINWAITUNTILCLK=‘1’;AVE<=A;WAITUNTILCLK=‘1’;AVE<=AVE+A;WAITUNTILCLK=‘1’;AVE<=AVE+A;WAITUNTILCLK=‘1’;AVE<=(AVE+A)/4;ENDPROCESS;功能?26现在是26页\一共有63页\编辑于星期日完成一个硬件求平均的功能,每一个时钟脉冲由A输入一个数值,4个时钟脉冲后将获得此4个数值的平均值。27现在是27页\一共有63页\编辑于星期日【例】PROCESSBEGINRST_LOOP:LOOPWAITUNTILCLOCK=‘1’ANDCLOCK'EVENT;

NEXTRST_LOOPWHEN(RST=‘1’); X<=A;

WAITUNTILCLOCK=‘1’ANDCLOCK'EVENT;

NEXTRST_LOOPWHEN(RST=‘1’);Y<=B;

ENDLOOPRST_LOOP;ENDPROCESS;每一时钟上升沿都结束进程的挂起,继而检测电路的复位是否为高。如果是,则返回循环的起点;否则,则进行正常的顺序语句执行操作。28现在是28页\一共有63页\编辑于星期日WAITFor时间表达式如:

WaitFor30ns;

WaitFor语句只能仿真时使用,不能被综合。

为超时语句,从执行语句开始,在规定时间段内,进程挂起,当超过这一时间段后,进程自动恢复执行。29现在是29页\一共有63页\编辑于星期日例如:

Waitonclkuntilclk=‘1’;

复合Wait语句编程时注意等待条件的判别,不要出现“死锁”状态(即无限期等待)。30现在是30页\一共有63页\编辑于星期日断言语句主要作为仿真和调试中的人-机会话,给出一个文字串作为警告和错误提示信息。当执行Assert语句时,就会对条件进行判别。如果条件为“真”,则执行下一条语句;如果条件为“假”,则输出由report指定的输出信息和由severity指定的错误级别。在report后面跟的是设计者所写的文字串,通常是说明错误的原因,文字串应该用双引号“”引起来。断言语句不可综合,仅仅是为了仿真的方便。断言语句AssertAssert条件[report输出信息]

[severity级别]Assert语句的格式31现在是31页\一共有63页\编辑于星期日例:

Assert

(a<=255)report”a

outofedge”;

severityerror;

该断言语句的条件是信号量B=’1’。如果执行到该语句时,信号量B=’0’,说明条件不满足,就会输出report后跟的文字串。该文字串说明,出现了超时等待错误。severity后跟的错误级别告诉操作人员,其出错级别为error。32现在是32页\一共有63页\编辑于星期日后面介绍。子程序调用及返回语句33现在是33页\一共有63页\编辑于星期日小结顺序语句赋值语句转向控制语句

(If、Case、Loop、Next、Exit)等待语句(wait)子程序调用语句断言语句(assert)空操作语句(null)34现在是34页\一共有63页\编辑于星期日作业1:设计一个3-8译码器:35现在是35页\一共有63页\编辑于星期日

【例】(a)WAIT_UNTIL结构(b)WAIT_ON结构

... LOOPWAITUNTILENABLE=‘1’;WAITONENABLE... EXITWHENENABLE=‘1’;

ENDLOOP;由以上脱离挂起状态、重新启动进程的两个条件可知,例3.4.20结束挂起所需满足的条件,实际上是一个信号的上跳沿。因为当满足所有条件后ENABLE为1,可推知ENABLE一定是由0变化来的。因此,上例中进程的启动条件是ENABLE出现一个上跳信号沿。36现在是36页\一共有63页\编辑于星期日一般地,在一个进程中使用了WAIT语句后,经综合就会产生时序逻辑电路。时序逻辑电路的运行依赖于时钟的上升沿或下降沿,同时还具有数据存储的功能。下例就是一个比较好的说明,此例描述了一个可预置校验对比值的四位奇偶校验电路,它的功能除对输入的4位码DATA(0TO3)进行奇偶校验外,还将把校验结果与预置的校验值NEW_CORRECT_PARITY进行比较,并将比较值PARITY_OK输出。37现在是37页\一共有63页\编辑于星期日【例】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYPARIISPORT(CLOCK:INSTD_LOGIC;

SET_PARITY:INSTD_LOGIC;

NEW_CORRECT_PARITY:INSTD_LOGIC;

DATA:INSTD_LOGIC_VECTOR(0TO3);

PARITY_OK:OUTBOOLEAN);ENDPARI;38现在是38页\一共有63页\编辑于星期日ARCHITECTUREARTOFPARIISSIGNALCORRECT_PARITY:STD_LOGIC;

BEGINPROCESS(CLOCK)VARIABLETEMP:STD_LOGIC;

BEGINWAITUNTILCLOCK'EVENTANDCLOCK=‘1’;IFSET_PARITY=‘1’THENFIRST:CORRECT_PARITY<=NEW_CORRECT_PARITY;39现在是39页\一共有63页\编辑于星期日

ENDIF;

TEMP:=‘0’;

FORIINDATA'RANGELOOPTEMP:=TEMPXORDATA(I);

ENDLOOP;

SECOND:PARITY_OK<=(TEMP=CORRECT_PARITY);

ENDPROCESS;ENDART;40现在是40页\一共有63页\编辑于星期日例中,NEW_CORRECT_PARITY是预置校验值输入端,SET_PARITY是预置校验值的输入与比较控制端。从例可以看出,由于WAIT语句的加入,综合后引入了两个D触发器,用于存储数据。第一个触发器存储CORRECT_PARITY,它来自标号为FIRST的语句;第二个触发器用于两个时钟信号间PARITY_OK的存储,它来自标号为SECORD的语句。综合器没有为变量TEMP的赋值行为增加触发器,因为TEMP是一个临时变量。

WAITFOR时间表达式为超时语句,在此语句中定义了一个时间段,从执行到当前的WAIT语句开始,在此时间段内,进程处于挂起状态,当超过这一时间段后,进程自动恢复执行。由于此语句不可综合,在此不做讨论。41现在是41页\一共有63页\编辑于星期日作业1:将向量转化为整数输出ENTITYconv_intISPORT(vect:IN

BIT_VECTOR(7DOWNTO0);

result:OUT

INTEGER);ENDconv_int;

ARCHITECTUREAOFconv_intISBEGIN

PROCESS(vect)

VARIABLEtmp:INTEGER;

BEGIN tmp:=0; FORiIN7DOWNTO0LOOP IF(vect(i)='1')THEN tmp:=tmp+2**i; ENDIF; ENDLOOP; result<=tmp;

ENDPROCESS;ENDA;ARCHITECTUREBOFconv_intISBEGIN

PROCESS(vect)

VARIABLEtmp:INTEGER;

VARIABLEi:INTEGER;

BEGIN tmp:=0; i:=vect'high WHILE(i>=vect'low)LOOP IF(vect(i)='1')THEN

tmp:=tmp+2**i; ENDIF; i:=i-1;--修改循环变量 ENDLOOP; result<=tmp;

ENDPROCESS;ENDB;42现在是42页\一共有63页\编辑于星期日作业2:设计描述4选1总线多路选择器43现在是43页\一共有63页\编辑于星期日【例】用CASE语句描述4选1多路选择器。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYMUX41ISPORT(S1,S2:INSTD_LOGIC;

A,B,C,D:INSTD_LOGIC;

Z:OUTSTD_LOGIC);ENDENTITYMUX41;ARCHITECTUREARTOFMUX41ISSIGNALS:STD_LOGIC_VECTOR(1DOWNTO0);44现在是44页\一共有63页\编辑于星期日BEGINS<=S1&S2;PROCESS(S1,S2,A,B,C,D)BEGINCASESISWHEN"00"=>Z<=A;

WHEN"01"=>Z<=B;

WHEN"10"=>Z<=C;

WHEN"11"=>Z<=D;

WHENOTHERS=>Z<='X';

ENDCASE;

ENDPROCESS;ENDART;如何用IF语句实现?45现在是45页\一共有63页\编辑于星期日注意本例的第五个条件名是必需的,因为对于定义STD_LOGIC_VECTOR数据类型的S,在VHDL综合过程中,它可能的选择值除了00、01、10和11外,还可以有其他定义于STD_LOGIC的选择值。本例的逻辑图如图3.8所示。46现在是46页\一共有63页\编辑于星期日4选1多路选择器47现在是47页\一共有63页\编辑于星期日例:libraryieee;useieee.std_logic_1164.all;entityshiftisport(clk,c0:instd_logic;md:instd_logic_vector(2downto0);d:instd_logic_vector(7downto0);qb:outstd_logic_vector(7downto0);cn:outstd_logic);end;architecturebhofshiftissignalreg:std_logic_vector(7downto0);signalcy:std_logic;48现在是48页\一共有63页\编辑于星期日beginprocess(clk,md,c0)isbeginifclk'eventandclk='1'thencasemdiswhen"001"=>reg(0)<=c0;reg(7downto1)<=reg(6downto0);cy<=reg(7);when"010"=>reg(0)<=reg(7);reg(7downto1)<=reg(6downto0);when"011"=>reg(7)<=reg(0);eg(6downto0)<=reg(7downto1);when"100"=>reg(7)<=cy;reg(6downto0)<=reg(7downto1);cy<=reg(0);when"101"=>reg(7downto0)<=d(7downto0);whenothers=>reg<=reg;cy<=cy;49现在是49页\一共有63页\编辑于星期日endcase;endif;endprocess;qb(7downto0)<=reg(7downto0);cn<=cy;end;50现在是50页\一共有63页\编辑于星期日51现在是51页\一共有63页\编辑于星期日BEGINsel:=0; --输入初始值

IF(S1=‘1’)THENSEL:=SEL+1;

ELSIF(S2=‘1’)THENSEL:=SEL+2;

ELSIF(S3=‘1’)THENSEL:=SEL+4;

ELSIF(S4=‘1’)THENSEL:=SEL+8;

ELSENULL; --注意,这里使用了空操作语句

ENDIF;

Z1<=‘0’;Z2<=‘0’;Z3<=‘0’;Z4<=‘0’;--输入初始值52现在是52页\一共有63页\编辑于星期日CASETEMPISWHEN0=>Z1<=‘1’; --当SEL=0时选中

WHEN1|3=>Z2<=‘1’;--当SEL为1或3时选中

温馨提示

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

评论

0/150

提交评论