您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > VHDL程序设计及应用
VHDL程序设计及应用浙江科技学院信息学院杨翊VHDL的基本语句1.顺序语句⑴IF语句IF条件1THEN顺序语句1;ELSEIF条件2THEN顺序语句2;……ELSEIF条件nTHEN顺序语句n;ELSE顺序语句n+1;ENDIF;两种简化形式:IF条件THEN顺序语句1;ELSE顺序语句2;ENDIF;IF条件THEN顺序语句;ENDIF在VHDL语言中,IF语句的作用是根据指定的条件来确定语句的执行顺序。IF语句可用于选择器、比较器、编码器、译码器、状态机等的设计,是VHDL语言中最常用的语句之一。IF条件THEN顺序语句ENDIF;当程序执行到这种门闩控制型IF语句时,首先判断语句中所指定的条件是否成立。如果条件成立,则程序继续执行IF语句中所含的顺序处理语句;如果条件不成立,程序将跳过IF语句所包含的顺序处理语句,而向下执行IF的后继语句。门闩控制语句LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdffISPORT(clk,d:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDdff;ARCHITECTURErtlOFdffISBEGINPROCESS(clk)BEGINIF(clk’EVENTANDclk=’1’)THENq=d;ENDIF;ENDPROCESS;ENDrtl;例:利用IF语句引入D触发器二选一控制语句IF条件THEN顺序语句ELSE顺序语句ENDIF;当IF条件成立时,程序执行THEN和ELSE之间的顺序语句部分;当IF语句的条件得不到满足时,程序执行ELSE和ENDIF之间的顺序处理语句。即依据IF所指定的条件是否满足,程序可以进行两条不同的执行路径。例:二选一电路结构体的描述MUX2cabsARCHITECTURErtlOFmux2ISBEGINPROCESS(a,b,s)BEGINIF(s=’1’)THENc=a;ELSEc=b;ENDIF;ENDPROCESS;ENDrtl;多选择控制语句IF条件THEN顺序语句ELSEIF顺序语句ELSEIF顺序语句┇ELSE顺序语句ENDIF;这种多选择控制的IF语句,实际上就是条件嵌套。它设置了多个条件,当满足所设置的多个条件之一时,就执行该条件后的顺序处理语句。当所有设置的条件都不满足时,程序执行ELSE和ENDIF之间的顺序处理语句。例:利用多选控制语句设计的四选一多路选择器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(input:INSTD_LOGIC_VECTOR(3DOWNTO0);sel:INSTD_LOGIC_VECTOR(1DOWNTO0);y:OUTSTD_LOGIC);ENDmux4;mux4ysel3210inputARCHITECTURErtlOFmux4ISBEGINPROCESS(input,sel)BEGINIF(sel=“00”)THENy=input(0);ELSIF(sel=“01”)THENy=input(1);ELSIF(sel=“10”)THENy=input(2);ELSEy=input(3);ENDIF;ENDPROCESS;ENDrtl;⑵CASE语句CASE语句根据满足的条件直接选择多项顺序语句中的一项执行,它常用来描述总线行为、编码器、译码器等的结构。CASE语句的结构为:CASE表达式ISWHEN条件选择值=顺序语句,┇WHEN条件选择值=顺序语句,ENDCASE;其中WHEN条件选择值可以有四种表达方式;(1)单个普通数值,形如WHEN选择值=顺序语句;(2)并列数值,形如WHEN值/值/值=顺序语句;(3)数值选择范围,形如WHEN值TO值=顺序语句;(4)WHENOTHERS=顺序语句;当执行到CASE语句时,首先计算CASE和IS之间的表达式的值,然后根据条件语句中与之相同的选择值,执行对应的顺序语句,最后结束CASE语句。使用CASE语句需注意以下几点:·CASE语句中每一条语句的选择值只能出现一次,即不能有相同选择值的条件语句出现。·CASE语句执行中必须选中,且只能选中所列条件语句中的一条,即CASE语句至少包含一个条件语句。·除非所有条件语句中的选择值能完全覆盖CASE语句中表达式的取值,否则最末一个条件语句中的选择必须用“OTHERS”表示,它代表已给出的所有条件语句中未能列出的其他可能的取值。关键词OTHERS只能出现一次,且只能作为最后一种条件取值。使用OTHERS是为了使条件语句中的所有选择值能覆盖表达式的所有取值,以免综合过程中插入不必要的锁存器。这一点对于定义为STD_LOGIC和STD_LOGIC_VECTOR数据类型的值尤为重要,因为这些数据对象的取值除了1、0之外,还可能出现输入高阻态Z,不定态X等取值。例[1]CASE语句使用CASEcommandISWHEN“00”=c=a;WHEN“01”=c=b;WHEN“10”=c=e;WHEN“11”=c=f;WHENOTHERS=NULL;--无效ENDCASE;例[2]CASE语句使用CASEselISWHEN1TO9=c=1;WHEN11/12=c=2;WHENOTHERS=c=3;ENDCASE;在例[2]中,第一个WHEN语句的意思是当sel的值是从1到9中任意一个数值时,信号c的值取1;第二个WHEN语句的意思是当sel的值为11或12两者之一时,信号c的取值为2;第三个WHEN语句的意思是当sel的值不为前面两种情况时,信号c的取值为3。--适合4选1数据选择器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdecoder3_8ISPORT(a,b,c,g1,g2a,g2b:INSTD_LOGIC;y:OUTSTD_LOGIC_VECTOR(7DOWNTO0);ENDdecoder3_8;ARCHITECTURErtlOFdecoder3_8ISSIGNALindata:STD_LOGIC_VECTOR(2DOWNTO0);BEGINindata=c&b&a;PROCESS(indata,g1,g2a,g2b)BEGIN例[3]3-8译码器IF(g1=‘1’ANDg2a=‘0’ANDg2b=‘0’)THENCASEISWHEN“indata000”=y=“11111110”;WHEN“001”=y=“11111101”;WHEN“010”=y=“11111011”;WHEN“011”=y=“11110111”;WHEN“100”=y=“11101111”;WHEN“101”=y=“11011111”;WHEN“110”=y=“10111111”;WHEN“111”=y=“01111111”;WHENOTHERS=y=“XXXXXXXX”;ENDCASE;ELSE--指不满足g1=‘1’ANDg2a=‘0’ANDg2b=‘0’情况y=“11111111”;ENDIF;ENDPROCESS;ENDrtl;与IF语句相比,CASE语句组的程序语句是没有先后顺序的,所有表达式的值都并行处理。IF语句是有序的,先处理最起始、最优先的条件,后处理次优先的条件。⑶LOOP语句LOOP语句就是循环语句,它可以使包含的一组顺序语句被循环执行,其执行的次数受迭代算法控制。在VHDL中常用来描述迭代电路的行为。1.单个LOOP语句单个LOOP语句的书写格式如下:[标号:]LOOP顺序语句ENDLOOP[标号];这种循环语句需引入其他控制语句(如EXIT)后才能确定,否则为无限循环。其中的标号是可选的。例如:loop1:LOOPWAITUNTILclk=‘1’;q=dAFTER2ns;ENDLOOPloop1;2.FOR_LOOP语句该语句语法格式为:[标号:]FOR循环变量IN离散范围LOOP顺序处理语句ENDLOOP[标号];例:8位奇偶校验电路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYparity_checkISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDparity_check;ARCHITECTURErtlOFparity_checkISBEGINPROCESS(a)VARIABLEtmp:STD_LOGICBEGINtmp:=‘0’;FORiIN0TO7LOOPtmp:=tmpXORa(i);ENDLOOP;y=tmp;--y=1,a为奇数个‘1’。y=0,a为偶数个‘1’。ENDPROCESS;ENDrtl;3.WHILE_LOOP语句这种语句的书写格式为:[标号:]WHILE条件LOOP顺序处理语句ENDLOOP[标号];在该LOOP语句中,没有给出循环次数的范围,而是给出了循环执行顺序语句的条件;没有自动递增循环变量的功能,而是在顺序处理语句中增加了一条循环次数计算语句,用于循环语句的控制。循环控制条件为布尔表达式,当条件为“真”时,则进行循环,如果条件为“假”,则结束循环。例:8位奇偶校验电路的WHILE_LOOP设计形式LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYparity_checkISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDparity_check;ARCHITECTUREbehavOFparity_checkISBEGINPROCESS(a)VARIABLEtmp:STD_LOGICBEGINtmp:=‘0’;i:=0;WHILE(i8)LOOPtmp:=tmpXORa(i);i:=i+1;ENDLOOP;y=tmp;ENDPROCESS;ENDbehav;⑷NEXT语句NEXT语句的书写格式为:NEXT[标号][WHEN条件]该语句主要用于LOOP语句内部的循环控制。当NEXT语句后不跟[标号],NEXT语句作用于当前最内层循环,即从LOOP语句的起始位置进入下一个循环。若NEXT语句不跟[WHEN条件],NEXT语句立即无条件跳出循环。例:NEXT语句应用举例┇WHILEdata1LOOPdata:=data+1;NEXTWHENdata=3--条件成立而无标号,跳出循环data:=data*data;ENDLOOP;N1:FORiIN10DOWNTO1LOOPN2:FORjIN0TOiLOOPNEXTN1WHENi=j;--条件成立,跳到N1处matrix(i,j):=j*i+1;--条件不成立,继续内层循环N2ENDLOOPN2;ENDLOOPN1;⑸EXIT语句EXIT语句的书写格式为:EXIT[LOOP标号][WHEN条件];EXIT语句也是用来控制LOOP的内部循环,与NEXT语句不同的是EXIT语句跳向LOOP终点,结束LOOP语句;而NEXT语句是跳向LOOP语句的起始点,结束本次循环,开始下一次循环。当EXIT语句中含有标号时,表明跳到标号处继续执行。含[WHEN条件]时,如果条件为“真”,跳出LOOP语句;如果条件为“假”,则继续执行LOOP循环。EXIT语句不含标号和条件时,表明无条件结束LOOP语句的执行,因此,它为程序需要处理保护、出错和警告状态,提供了一种快捷、简便的调试方法。例:两个元素位矢量a、b进行比较,当发现a与b不同时,跳出循环比较程序并报告比较结果。SIGNALa,b:STD_LOGIC_VECTOR(0TO1);SIGNALa_less_than_b:BOOLEAN;┇a_less_than_b=FALSE;FORiIN1TO0LOOPIF(a(i)=‘1’ANDb(i)=‘0’)THENa_less_than_b=FALSE;EXIT;ELSE
本文标题:VHDL程序设计及应用
链接地址:https://www.777doc.com/doc-3132415 .html