第六章VHDL中的语句详解

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第六章VHDL中的语句主要内容顺序语句If语句、case语句、Loop语句并行语句进程、元件例化、并行信号赋值语句描述风格行为描述、数据流描述、结构描述一、顺序语句1、if语句If语句执行一序列的语句,其次序依赖于一个或多个条件的值。一般表达形式IF条件THEN顺序语句;ENDIF;IF条件THEN顺序处理语句;ELSE顺序处理语句;ENDIF;IF条件THEN顺序处理语句;ELSIF条件THEN顺序处理语句;……ELSE顺序处理语句;ENDIF;一、顺序语句(续1)计数器的设计例1:EntityCNT4ISPORT(CLK:INBIT;Q:BUFFERINTEGERRANGE15DOWNTO0);END;ARCHITECTUREONEOFCNT4ISBEGINPROCESS(CLK)BEGINIFCLK’EVENTANDCLK=‘1’THENQ=Q+1;ENDIF;ENDPROCESS;END;定义整数需要限定取值范围思考:整数类型的数据规范?1、定义时需要限定取值范围,否则会采用32位,造成浪费2、整数的表达不加引号一、顺序语句(续2)例2:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT4ISPORT(CLK:INSTD_LOGIC;Q:OUTSTD_LOGIC_VECTOR(3DOWNTO0));END;ARCHITECTUREONEOFCNT4ISSIGNALQ1:STD_LOGIC_VECTOR(3DOWNTO0);BEGINPROCESS(CLK)BEGINIFCLK’EVENTANDCLK=’1’THENQ1=Q1+1;ENDIF;ENDPROCESS;Q=Q1;END;思考:1、是否可以不定义信号Q1?直接使用Q=Q+1;2、是否可以用变量替代信号Q1?3、添加程序包STD_LOGIC_UNSIGNED的原因?VARIABLEQ1:STD_LOGIC_VECTOR(3DOWNTO0)运算符重载一、顺序语句(续3)例3:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNT10ISPORT(CLK,RST,EN:INSTD_LOGIC;CQ:OUTSTD_LOGIC_VECTOR(3DOWNTO0);COUT:OUTSTD_LOGIC);END;ARCHITECTUREONEOFCNT10ISBEGINPROCESS(CLK,RST,EN)VARIABLECQI:STD_LOGIC_VECTOR(3DOWNTO0)BEGINIFRST=’1’THENCQI:=(OTHERS=’0’);ELSIFCLK’EVENTANDCLK=’1’THENIFEN=‘1’THENIFCQI9THENCQI:=CQI+1;ELSECQI:=(OTHERS=’0’);ENDIF;ENDIF;ENDIF;CQ=CQI;ENDPROCESS;END;CQI:=“0000”;异步清零同步使能一、顺序语句(续4)RTL电路一、顺序语句(续5)波形仿真时序仿真功能仿真一、顺序语句(续6)省略赋值操作符优点:简化赋值表达,与矢量长度无关例:d1=(1=’1’,4=’1’,others=’0’);d2=(1=e(3),3=’1’,others=e(1));同步和异步的概念不依赖于时钟而有效的信号称为异步信号,否则称为同步信号。If语句的嵌套注意ENDIF的数量IF条件THENIF条件THEN……ENDIF;ENDIF;一、顺序语句(续7)不完整if语句-产生时序电路的关键例1:entitycomp2isport(a1,b1:inbit;q1:outbit);end;architectureoneofcomp2isbeginprocess(a1,b1)beginifa1b1thenq1='1';elseq1='0';endif;endprocess;end;完整if语句一、顺序语句(续8)例2:entitycomp1isport(a1,b1:inbit;q1:outbit);end;architectureoneofcomp1isbeginprocess(a1,b1)beginifa1b1thenq1='1';elsifa1b1thenq1='0';endif;endprocess;end;不完整if语句一、顺序语句(续9)完整条件语句只能构成组合逻辑电路。因此,在利用条件语句设计纯组合电路设计时,如果没有充分考虑所有可能出现的条件,将导致不完整条件语句的出现,从而综合出不希望的组合与时序电路的混合体。整数的使用使用RANGE子句定义取值范围运算符重载一、顺序语句(续10)2、case语句一般表达形式CASE表达式ISWHEN选择值或标识符=顺序语句;WHEN选择值或标识符=顺序语句;……WHENOTHERS=顺序语句;ENDCASE;计算表达式的值,根据WHEN条件句中与之相同的选择值或标识符,执行对应顺序语句选择值在表达式取值范围内,数据类型必须匹配,且只能出现一次当选择值不能完整覆盖表达式取值时,最后必须加上WHENOTHERSWHENOTHERS只能出现一次,作为最后一种条件取值相当于THEN,于是一、顺序语句(续11)例1:libraryieee;useieee.std_logic_1164.all;entitymux21aisport(a,b,c,d:instd_logic;ctl:instd_logic_vector(1downto0);q:outstd_logic);end;architectureoneofmux21aisbeginprocess(a,b,c,d,ctl)begincasectliswhen00=q=a;when01=q=b;when10=q=c;when11=q=d;endcase;endprocess;end;功能:4选1多路选择器一、顺序语句(续12)例2:libraryieee;useieee.std_logic_1164.all;entityshiftisport(clk,c0:instd_logic;md:instd_logic_vector(2downto0);d:instd_logic_vector(7downto0);q:outstd_logic_vector(7downto0);cn:outstd_logic);end;architectureoneofshiftissignalreg:std_logic_vector(7downto0);signalcy:std_logic;beginprocess(clk,md,c0)beginifclk'eventandclk='1'thencasemdiswhen001=reg(0)=c0;reg(7downto1)=reg(6downto0);cy=reg(7);when010=reg(0)=reg(7);reg(7downto1)=reg(6downto0);when011=reg(7)=reg(0);reg(6downto0)=reg(7downto1);when100=reg(7)=c0;reg(6downto0)=reg(7downto1);cy=reg(0);when101=reg(7downto0)=d(7downto0);whenothers=reg=reg;cy=cy;endcase;endif;endprocess;q=reg;cn=cy;end;思考:1、语句顺序是否有影响?会覆盖原值否?将reg、cy改成变量可以吗?reg(0)=c0;reg(7downto0)=reg(6downto0);cy=reg(7);2、改用if语句完成循环左移when“001”=cy:=reg(7);reg(7downto1):=reg(6downto0);reg(0):=c0;带进位左移保持Whenothers=NULL;一、顺序语句(续14)3、loop语句循环语句,使一组顺序语句循环执行一般表达形式单个loop语句[标号:]LOOP顺序语句;ENDLOOP[标号];单个loop语句需要引入其他语句进行循环控制,如:EXIT、NEXT、WAIT;For_loop语句由循环变量范围决定循环次数[标号:]FOR循环变量IN循环范围LOOP顺序语句;ENDLOOP[标号];FOR_LOOP语句一、顺序语句(续15)例1:单个loop语句L2:LOOPa:=a+1;EXITL2WHENa10;ENDLOOPL2;循环标号,用于多个循环语句条件为真时,跳出循环语句EXIIT语句格式:EXIT;EXITLOOP语句;EXITLOOP标号WHEN条件表达式;直接跳出循环NEXT语句格式:NEXT;NEXTLOOP语句;NEXTLOOP标号WHEN条件表达式;跳出循环,跳转到循环结束处跳出循环,跳转到循环开始处NEXTL2WHENa10;一、顺序语句(续15)例2:FOR_LOOP语句libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitycntcisport(din:instd_logic_vector(7downto0);cnt:outstd_logic_vector(3downto0));end;architectureoneofcntcisbeginprocess(din)variableq:std_logic_vector(3downto0);beginq:=0000;FORnin0to7LOOPif(din(n)='1')thenq:=q+1;endif;endloop;cnt=q;endprocess;end;循环变量循环变量:1、临时变量(局部变量);2、不需要事先定义,由LOOP语句自动定义;3、在LOOP语句的范围内不能再使用同名的标识符循环次数,以常数表示功能:计算“1”码个数一、顺序语句(续17)仿真波形一、顺序语句(续18)例3:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityandcisport(a:instd_logic_vector(3downto0);b:instd_logic_vector(3downto0);c:outstd_logic_vector(3downto0));end;architectureoneofandcisbeginprocess(a,b)beginfornin0to3loopc(n)=b(n)ANDa(n);endloop;endprocess;end;缺点:每次循环都将产生一个硬件模块,硬件资源大量耗用二、并行语句进程语句、元件例化语句、信号赋值语句1、简单信号赋值语句VHDL并行语句结构中最基本的单元一般表达格式:赋值目标=表达式;赋值目标和表达式数据类型一致;信号赋值语句简单信号赋值语句条件信号赋值语句选择信号赋值语句ARCHITECTUREoneOFmux21aISSIGNALd,e:BIT;BEGINd=aAND(NOTS);e=bANDs;y=dORe;ENDARCHITECTUREone;二、并行语句(续1)2、条件信号赋值语句一般语法格式赋值目标=表达式WHEN赋值条件ELSE表达式WHEN赋值条件ELSE……表达式;要执行的表达式是第一个满足布尔条件值为true的表达式当所有条件都不满足时,执行最后一条表达式,最后一条表达式没有条件子句功能

1 / 46
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功