您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 第七、八讲(1)-VHDL语句---顺序语句
--邹云海--1第七讲(1)VHDL顺序语句2006-1027.1顺序语句顺序语句和并行语句是VHDL程序中的两大基本描述语句系列;顺序语句是相对于并行语句而言的;顺序语句执行顺序(指仿真执行)与书写顺序基本一致。前面的执行结果会直接影响后面各语句的执行结果;顺序语句结构类似传统的编程语言;2006-103赋值语句变量赋值语句和信号赋值语句流程控制语句If语句、case语句、loop语句、next语句、exit语句等待语句(wait)子程序调用语句过程调用、函数调用返回语句(return)空操作语句(null)VHDL具有六类基本顺序语句2006-104一、赋值语句1.将一个值或表达式的运算结果传递给某一数据对象。如信号、变量或由信号、变量构成的数组。2.VHDL设计实体内的数据传递以及对端口界面外部数据的读写都必须通过赋值语句来实现。3.两种赋值语句:信号赋值语句和变量赋值语句VHDL中所有对象均分为:变量和信号变量赋值目标:=赋值源;--变量赋值,无延迟信号赋值目标=赋值源;--信号赋值,有延迟要求:表达式的值必须与目标的类型、宽度一致。4.赋值目标:标识符、数组单元素、段下表元素、集合块2006-105变量与信号的差异:1)赋值方式的不同:变量:=赋值源;信号=赋值源;2)硬件实现的功能不同:信号代表电路单元、功能模块间的互联,代表实际的硬件连线;变量代表电路单元内部的操作,代表暂存的临时数据。2006-1063)有效范围的不同:信号:程序包、实体、结构体;--全局量。变量:进程、子程序;--局部量。{SIGNALDeclarations}label1:PROCESS{VARIABLEDeclarations}label2:PROCESS{VARIABLEDeclarations}┇2006-1074)赋值行为的不同:信号赋值延迟更新数值、时序电路;变量赋值立即更新数值、组合电路。5)信号的多次赋值a.一个进程:最后一次赋值有效b.多个进程:多源驱动线与、线或、三态2006-108例:信号的多次赋值architecturertlofexissignala:std_logic;beginprocess(…)begina=b;…a=c;endprocess;endrtl;--后一个赋值语句有效architecturertlofexissignala:std_logic;beginprocess(…)begina=b;…endprocess;process(…)begina=c;...endprocess;endex;2006-109例:信号赋值与变量赋值的比较信号赋值:architecturertlofsigissignala,b:std_logic;--定义信号beginprocess(a,b)begina=b;b=a;endprocess;endrtl;--结果是a和b的值互换2006-1010变量赋值:architecturertlofvarisbeginprocessvariablea,b:std_logic;--定义变量begina:=b;b:=a;endprocess;endrtl;--结果是a和b的值都等于b的初值2006-1011二、流程控制语句流程控制语句通过条件控制开关决定是否执行一条或几条语句,或重复执行一条或几条语句,或跳过一条或几条语句。五种流程控制语句If语句Case语句Loop语句Next语句Exit语句2006-10121、if语句if语句是一种条件语句,它根据语句中所设置的一种或多种条件,有选择地执行指定的顺序语句。有3种结构:1)if语句的门闩控制例:if(ena=‘1’)thenq=d;endif;综合后生成锁存器(latch)if条件then顺序处理语句;endif;2006-1013条件改为时钟沿,则生成D触发器:2006-10142)if语句的2选1选择控制格式:用条件来选择两条不同程序执行的路径。if条件then顺序处理语句;else顺序处理语句;endif;2006-1015此描述的典型电路是二选一电路:architecturertlofmux2isbeginprocess(a,b,sel)beginif(sel=‘1’)theny=a;elsey=b;endif;endprocess;endrtl;2006-10163)if语句的多选择控制if语句的多选择控制又称为if语句的嵌套。格式:if条件then顺序处理语句;elsif条件then顺序处理语句;┇elsif条件then顺序处理语句;else顺序处理语句;endif;通过elseif设定了多个判断条件,(或条件嵌套),当满足条件之一时,就执行条件后的顺序处理语句;当所设置的条件都不满足时,程序执行else和endif之间的顺序处理语句。2006-1017典型电路:多选一(四选一)电路。2006-1018if_then_elsif语句中隐含了优先级别的判断,最先出现的条件优先级最高,可用于设计具有优先级的电路。如8-3优先级编码器。libraryieee;useieee.std_logic_1164.all;entitycoderisport(din:instd_logic_vector(7downto0);output:outstd_logic_vector(2downto0));endcoder;2006-1019architecturebehavofcoderisbeginprocess(dint)beginifdint(7)=‘0’thenoutput=“000”;elsifdint(6)=‘0’thenoutput=“001”;elsifdint(5)=‘0’thenoutput=“010”;elsifdint(4)=‘0’thenoutput=“011”;2006-1020elsifdint(3)=‘0’thenoutput=“100”;elsifdint(2)=‘0’thenoutput=“101”;elsifdint(1)=‘0’thenoutput=“110”;elseoutput=“111”;endif;endprocess;endbehav;2006-10212、case语句(page214)case语句常用来描述总线或编码、译码行为,可读性比if语句强。格式如下:case表达式iswhen选择值=顺序处理语句;when选择值=顺序处理语句;...when选择值=顺序处理语句;endcase;┇2006-1022其中的选择值可有以下的形式1、单个普通数值:如:when值=顺序处理语句;2、数值选择范围:when值to值=顺序处理语句;3、并列数值:when值|值|值|…|值=顺序处理语句;4、三种方式的混合;whenothers=顺序处理语句;2006-1023Case语句使用注意:1)分支条件的值必须在表达式的取值范围内。2)两个分支条件不能重叠。3)语句执行时必须选中且只能选中一个分支条件.4)如果没有others分支条件存在,则分支条件必须覆盖表达式所有可能的值。对std_logic,std_logic_vector数据类型要特别注意使用others分支条件。2006-1024例:用case语句描述四选一电路2006-1025【例7-1’】:描述了一个4选1数据选择器,用IF语句和Case语句共同完成。它可以根据4位输入码来确定4位输出中哪一位输出为1libraryieee;useieee.std_logic_1164.all;entitymux41isport(s4,s3,s2,s1:instd_logic;z4,z3,z2,z1:outstd_logic);endmux41;architectureartiveofmux41isbegin---注意此程序和书上程序的不同之处2006-1026process(s4,s3,s2,s1)variablesel:integerrange0to15;beginsel:=0;ifs1=‘1’thensel:=sel+1;endif;ifs2=‘1’thensel:=sel+2;endif;ifs3=‘1’thensel:=sel+4;endif;ifs4=‘1’thensel;:=sel+8;endif;2006-1027z1=‘0’;z2=‘0’;z3=‘0’;z4=‘0’;caseseliswhen0=z1=‘1’;when1|3=z2=‘1’;when4to7|2=z3=‘1’;whenothers=z4=‘1’;endcase;endprocess;endart;2006-1028例:case语句的误用(page215)signalvalue:integerrange0to15;signalout_1:bit;casevalueis--缺少when条件语句endcase;casevalueis--value2到15值未包含when0=out_1=‘1’;when1=out_1=‘0’;endcase;casevalueis--在5到10上发生重叠when0to10=out_1=‘1’;when5to15=out_1=‘0’;endcase;例7-3请自行研读2006-10293、Loop语句(page216)Loop语句就是循环语句,它可以是所包含的一组顺序语句被循环执行,其执行次数可由设定的循环参数决定。Loop语句有两种格式。1)单个loop语句需和其他控制语句(如Exit)配合使用VHDL重复执行loop循环内的语句,直至遇到exit语句结束循环。[Loop标号]:LOOP顺序语句EXITloop标号;ENDLOOP;2006-1030……L1:loopa:=a+1;exitL1whena10;endloopL1;--当a大于10时跳出循环……2006-10312)for…loop语句特点:①循环变量是loop内部自动声明的局部量,仅在loop内可见,不必事先定义,只能做赋值源②循环次数范围必须是可计算的整数范围:整数表达式to整数表达式整数表达式downto整数表达式[标号]:for循环变量in循环次数范围loop顺序语句;endloop[标号];2006-1032例:用for…loop语句描述的8位奇偶校验电路--奇校验2006-10334、Next语句在loop语句中next语句用来跳出本次循环。格式:分三种情况:1)无条件终止当前的循环,跳回到本次循环LOOP语句开始处,开始下次循环。next[标号][when条件表达式];next;2006-10342)无条件终止当前的循环,跳转到指定标号的LOOP语句开始处,重新开始执行循环操作。3)当条件表达式的值为true,则执行next语句,进入跳转操作,否则继续向下执行。next[标号];next[标号][when条件表达式];2006-10355、Exit语句exit语句将结束循环状态。格式:next语句与exit语句的格式与操作功能非常相似,区别是:next语句是跳向loop语句的起始点,而exit语句则是跳向loop语句的终点。exit[标号][when条件表达式];2006-10365、wait语句进程在仿真时的两个状态:执行或挂起。进程状态的变化受wait语句或敏感信号量变化的控制。可设置4种不同的条件:wait--无限等待waiton--敏感信号量变化waituntil--条件满足(可综合)waitfor--时间到2006-10371)、waiton语句格式:例:以下两种描述是完全等价的敏感信号量列表和wait语句只能选其一,两者不能同时使用。waiton信号[,信号];process(a,b)beginy=aandb;endprocess;processbeginy=aandb;waitona,b;endprocess;2006-10382)
本文标题:第七、八讲(1)-VHDL语句---顺序语句
链接地址:https://www.777doc.com/doc-3596775 .html