《【精品】eda技术与vhdl设计(西电版第5章 vhdl基本语句(可编辑.ppt》由会员分享,可在线阅读,更多相关《【精品】eda技术与vhdl设计(西电版第5章 vhdl基本语句(可编辑.ppt(219页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、EDA技术与VHDL设计(西电版)第5章 VHDL基本语句2 2第5章 VHDL基本语句 5.1 并并 行行 语语 句句VHDL中既具有并行语句(如元件例化语句),也具有顺序语句(如IF语句)。不同的语句使用在不同的地方。对于VHDL设计者来说,重要的是要知道哪些语句结构中需要使用并行语句,哪些语句结构中需要使用顺序语句。可以简单地概括为:结构体中除进程(PROCESS)、函数(FUNCTION)和过程(PROCEDURE)结构内部以外的其他VHDL代码都是并行语句,如图5-1所示。需要注意的是,信号赋值语句既可以出现在进程中,也可以出现在结构体的并行语句部分,只是运行的含义不同(参考4.2.
2、3节)。3 3第5章 VHDL基本语句 图5-1 结构体中的语句使用示例 4 4第5章 VHDL基本语句 5.1.1 并行语句的特点并行语句的特点并行语句是硬件描述语言的一大特点,它与C语言等计算机高级程序设计语言最大的不同是:并行语句在结构体中的执行是并行的,不会因为书写顺序的前后而产生执行顺序的先后。例5-1和例5-2结构体内都含有3条相同的并行语句,它们体现了在不同的描述顺序下,仍然能够综合出一致的电路结构,如图5-2所示。5 5第5章 VHDL基本语句 图5-2 例5-1和例5-2综合后电路结构 6 6第5章 VHDL基本语句 7 7第5章 VHDL基本语句 8 8第5章 VHDL基本
3、语句 正如图5-2的硬件电路图所表明的,只有当信号a或者b的值改变后才能执行赋值语句“x=a AND b;”,即信号a或b的值改变之前信号x的值不会发生变化。同样,信号x的值改变之前,y的值也不会发生变化;信号c或y的值改变之前,z的值也不会发生变化。由此可以看出,VHDL代码的执行是由事件控制的,这就意味着并行VHDL语句可以按任意顺序书写,其设计的功能不变。例5-3再次显示了并行语句的特点,L13L15这3条语句对应生成了3个加法器(见图5-3),即3个加法器同时在进行加法操作,没有顺序关系,而不是一个加法器顺序执行3条加法操作指令。VHDL代码最终实现的是具体的硬件电路,而不是在CPU中
4、的逐条指令执行,这是VHDL语言相对于传统软件语言的不同。9 9第5章 VHDL基本语句【例5-3】10 10第5章 VHDL基本语句 图5-3 例5-3综合后电路结构 11 11第5章 VHDL基本语句 在一个结构体内部,可以有一种或是几种类型的并行语句。并行语句之间通过信号进行信息的传递。图5-4所示是结构体中并行语句的结构示意图,从图中可以看到,VHDL支持的并行语句主要有进程语句、元件例化语句(包括类属参数传递映射语句)、并行信号赋值语句、生成语句、并行过程(或函数)调用语句以及块语句。下面分别讲述每一种语句的结构和应用。12 12第5章 VHDL基本语句 图5-4 并行语句结构示意图
5、 13 13第5章 VHDL基本语句 5.1.2 进程语句进程语句在一个结构体内可以有一个或多个进程,不同进程的地位是相同的。进程间的执行是并行的、独立的,由各自敏感信号的变化触发。一个进程有两个状态:等待状态和执行状态。在等待状态下,当任一敏感信号发生变化时,进程立即启动进入执行状态。当进程顺序执行到END PROCESS语句时,重新进入等待状态,等待下一次敏感信号的改变。进程语句内部结构由一系列顺序语句构成,能够很好地体现VHDL语言的行为描述能力。进程语句的语法格式已在3.5.3节中讲述,这里不再赘述。14 14第5章 VHDL基本语句 VHDL中的进程有两种类型:组合进程和时序进程。组
6、合进程用于设计组合逻辑电路,时序进程用于设计引入了触发器的时序逻辑电路。在组合进程中,所有输入信号必须都包含到敏感信号参数表中,包括赋值符号“=”右边的所有信号以及IF语句、CASE语句的判断表达式中的所有信号。如果有一个信号没有包含在敏感信号参数表中,则当这个被忽略的信号变化时,该进程不会被激活,输出信号也不会得到新的赋值。15 15第5章 VHDL基本语句 时序进程又可分为同步和异步两类。同步进程只对时钟信号敏感,即仅在时钟的边沿启动;异步进程除了对时钟信号敏感外,还对影响异步行为的输入信号敏感,即该输入信号的变化也能启动进程。例5-4显示了一个带有异步复位信号reset的D触发器。当信号
7、reset取值为“1”时,输出q立即被复位为“0”,而不管此时是否有时钟信号clk的上升沿到来,即信号reset的变化也能够启动进程。当信号reset取值为“0”时,如果有时钟信号的上升沿到来,则输出q被赋值为d,仿真结果如图5-5所示。16 16第5章 VHDL基本语句【例5-4】17 17第5章 VHDL基本语句 图5-5 例5-4异步复位D触发器时序仿真波形 18 18第5章 VHDL基本语句 例5-5是同步时序进程,只有时钟信号的上升沿到来时才能启动进程,即使信号reset发生改变(从“0”变化到“1”)也不能启动进程。例5-5的仿真结果见图5-6。可以看到,当复位信号reset从“0
8、”变为“1”时,由于此时并无时钟信号clk的上升沿到来,所以进程仍处于等待状态,输出q维持原值。当clk上升沿到来后,进程被启动,此时再判断信号reset的取值,如果为“1”,则输入q被复位为“0”。19 19第5章 VHDL基本语句【例5-5】2020第5章 VHDL基本语句 图5-6 例5-5同步复位D触发器时序仿真波形 21 21第5章 VHDL基本语句 电路系统有时既需要利用到时钟信号的上升沿又需要利用到下降沿,即在两个边沿时刻都需要处理数据;然而VHDL一般不允许对同一信号在时钟的两个边沿进行数据的赋值处理,且不论是在一个进程中(见例5-6)还是在不同的进程中(见例5-7)。例5-6
9、的本意是想实现当时钟信号clk上升沿到来时,将数据d1赋值给q;当时钟下降沿到来时,将数据d2赋值给q。编译后出现图5-7所示错误,显示无法在时钟的边沿实现寄存器的操作。例5-7省略了实体描述,它在不同的进程中对同一信号q赋值,可以看成是两条并行语句(一个进程可以看做一条并行语句)对同一信号赋值,这也是错误的。2222第5章 VHDL基本语句【例5-6】2323第5章 VHDL基本语句【例5-7】2424第5章 VHDL基本语句 图5-7 例5-6编译出现错误 2525第5章 VHDL基本语句 例5-8是一个正确的示例,虽然它也同时用到了时钟信号的上升沿和下降沿,但由于不是对同一信号赋值所以能
10、够通过编译。在时钟信号clk上升沿到来时刻,将输入信号d赋值给信号q1;而在时钟信号clk下降沿到来时刻,输出信号q得到信号q1的赋值,即输出信号q在时钟信号clk下降沿到来时刻才能得到输入信号d的值,仿真波形如图5-8所示。2626第5章 VHDL基本语句【例5-8】2727第5章 VHDL基本语句 图5-8 例5-8时序仿真波形2828第5章 VHDL基本语句 5.1.3 元件例化语句元件例化语句元件例化就是将预先设计好的设计实体定义为一个元件,然后利用特定的语句将此元件与当前设计实体中指定的端口连接,从而为当前设计实体引入一个新的低一级的设计层次。元件例化可以是多层次的,即在当前设计实体
11、中调用的元件本身也是一个低层次的设计实体,它也可以通过调用其他的元件来实现。元件可以是一个已经设计好的设计实体(采用VHDL语言或者采用Verilog语言设计的实体),也可以是来自FPGA元件库中的元件,或是LPM模块、IP核等。元件例化语句一般由两部分组成:元件声明和元件例化。元件声明放在结构体说明语句部分(关键词ARCHITECTURE和BEGIN之间),元件例化放于结构体功能描述语句部分(关键词BEGIN后),其基本语法格式已在3.7节中讲述,这里不再赘述。2929第5章 VHDL基本语句 5.1.4 并行信号赋值语句并行信号赋值语句并行信号赋值语句有三种形式,分别是简单信号赋值语句、条
12、件信号赋值语句(WHEN/ELSE语句)和选择信号赋值语句(WITH/SELECT/WHEN语句)。这三种语句的共同点是:赋值目标都必须是信号,且语句在结构体内的执行是并行的。3030第5章 VHDL基本语句 1简单信号赋值语句简单信号赋值语句简单信号赋值语句是VHDL并行语句结构中最基本的单元,在前面的章节中已经多次用到该语句,如例5-1(L12L14)、例5-2(L12L14)和例5-3(L13L15)都使用了简单信号赋值语句。需要注意的是,赋值符号“=”左右两边的数据类型必须一致。每一条简单信号赋值语句都相当于一条缩写的进程语句,而这条语句的所有输入(或读入)信号都被隐形地列入此缩写进程
13、的敏感信号参数表中。任何输入信号的变化都将启动相关并行语句的赋值操作,而这种启动是完全独立于其他语句的。31 31第5章 VHDL基本语句 2条件信号赋值语句(WHEN/ELSE语句)例5-9是采用WHEN/ELSE语句实现的4选1多路选择器,其元件图见图5-9。该设计实体有4个数据输入端a、b、c、d,数据类型为STD_LOGIC;有一个数据选择控制端sel,数据类型是STD_LOGIC_VECTOR,可以有“00”、“01”、“10”、“11”4个取值。当sel取值为“00”时,输出y被赋值a;当sel取值为“01”时,y被赋值b;当sel取值为“10”时,y被赋值c;当sel取值为“11
14、”时,y被赋值d。仿真结果如图5-10所示。3232第5章 VHDL基本语句 图5-9 4选1多路选择器3333第5章 VHDL基本语句【例5-9】3434第5章 VHDL基本语句 图5-10 4选1多路选择器时序仿真波形 3535第5章 VHDL基本语句 WHEN/ELSE语句的功能与在进程中的IF语句功能相似,它通过判别条件是否为真来决定是否执行与该条件相对应的表达式的赋值,其一般语句格式如下:赋值目标=表达式1 WHEN 条件1 ELSE表达式2 WHEN 条件2 ELSE表达式3 WHEN 条件3 ELSE.表达式n;3636第5章 VHDL基本语句 WHEN/ELSE语句使用中要注意
15、以下几点:(1)“WHEN 条件 ELSE”称为条件子句,条件子句后不需要加分号(或逗号)。(2)条件的判别是按照书写的顺序逐项进行测定的,一旦发现条件为TRUE,即将对应表达式的值赋予赋值目标。也就是说,执行赋值的表达式是第一个满足布尔条件为真所对应的表达式。(3)当所有条件都不满足时,执行最后一条表达式的赋值。最后一条表达式没有条件子句,需要加分号,代表WHEN/ELSE语句的结束。(4)条件中允许使用不同的信号,这使得WHEN/ELSE语句在设计时非常灵活。3737第5章 VHDL基本语句 例5-10是一个简单的3选1数据选择器,再次显示了WHEN/ELSE语句条件判别的顺序性。此例条件
16、中的信号不同,分别是s1和s2,代表两个选择控制端。当s1和s2同时取值“1”时,由于书写的顺序性,导致第一条子句具有最高的优先级,即y获得的赋值是a。图5-11是利用Quartus软件综合后的电路结构,由两个2选1选择器构成。当选择控制端s2取值“1”时,第一个选择器输出b,则第2个选择器在a和b这两个数据中选择。当选择控制端s1也取值“1”时,第2个选择器输出a,功能与WHEN/ELSE语句的优先级相同。时序仿真波形见图5-12。虽然WHEN/ELSE语句的条件判别具有顺序性,但其实质是生成硬件电路,语句本身是并行的;即当有多条WHEN/ELSE语句时,由各自的敏感信号(语句的所有输入信号
17、,如例5-10中的a、b、c、s1、s2)触发。总结来说,在多条WHEN/ELSE语句之间,书写顺序并不重要;但在WHEN/ELSE语句内部,顺序是重要的,决定了赋值的结果。3838第5章 VHDL基本语句【例5-10】3939第5章 VHDL基本语句 图5-11 例5-10 3选1数据选择器综合后电路结构 4040第5章 VHDL基本语句 图5-12 例5-10 3选1数据选择器时序仿真波形 41 41第5章 VHDL基本语句 3选择信号赋值语句选择信号赋值语句(WITH/SELECT/WHEN语句语句)例5-11是利用WITH/SELECT/WHEN语句实现的4选1多路选择器。从中可以发现
18、选择信号赋值语句与条件信号赋值语句类似,都是根据条件选择相应的表达式对目标信号进行赋值的。4242第5章 VHDL基本语句【例5-11】4343第5章 VHDL基本语句 选择信号赋值语句的一般格式如下:WITH 选择表达式 SELECT赋值目标=表达式1 WHEN 选择值1,表达式 2 WHEN 选择值2,表达式 n-1 WHEN 选择值n,表达式 n WHEN OTHERS;4444第5章 VHDL基本语句 WITH/SELECT/WHEN语句使用中要注意以下几点:(1)关键词WITH后的选择表达式是选择信号赋值语句的敏感量。每当选择表达式的值发生变化时,就将启动语句对各子句的选择值进行对比
19、,当发现有满足条件的子句时,就将此子句中的表达式的值赋给目标信号。(2)选择值需要覆盖选择表达式的所有可能取值,如果不能将其覆盖,最后必须加上WHEN OTHERS子句。(3)选择信号赋值语句对子句选择值的对比具有同期性,不像条件信号赋值语句那样按照书写顺序从上至下逐条测试。因此,选择信号赋值语句中的选择值不能出现重复的情况。4545第5章 VHDL基本语句(4)与条件信号赋值语句相比,选择信号赋值语句只允许一个选择表达式;而条件信号赋值语句允许在条件中使用不同的信号。(5)特别注意选择信号赋值语句的每一子句结尾用逗号分割,最后一条子句结尾用分号表示结束;而条件信号赋值语句每一子句的结尾没有任
20、何标点,只有最后一条子句的结尾用分号表示结束。4646第5章 VHDL基本语句 5.1.5 块语句块语句块语句(BLOCK语句)是并行语句,内部所包含的语句也是并行语句。块语句可以将结构体中的并行语句进行分割和组合,有利于对较长代码的管理和提高可读性。块语句有两种基本形式:简单块语句和保护块语句。1简单块语句简单块语句简单块语句的语句格式如下:标号:BLOCK块声明部分;BEGIN并行语句;END BLOCK标号;4747第5章 VHDL基本语句 标号是设计者自定义的标识符,是块的名称。在关键词BLOCK前的标号是必需的,而在END BLOCK后的标号可以省略。块声明部分可以声明块的局部对象,
21、包括数据类型、常量、信号、子程序等,块声明部分也不是必需的。例5-12是一个简单的块语句的示例。4848第5章 VHDL基本语句【例5-12】ARCHITECTURE construct OF ex ISBEGIN b1:BLOCK SIGNAL y:BIT;BEGIN y=a AND b;END BLOCK;END;4949第5章 VHDL基本语句 块语句(不管是简单块语句还是保护块语句)能够嵌套在另一个块语句中。例5-13显示了三个嵌套的块语句b1、b2和b3,其中块b2嵌套在块b1中,块b3嵌套在块b2中。块中声明的对象对这个块以及嵌套在其中的所有块都是可见的,且当子块声明的对象与父块声
22、明的对象具有相同的名称时,子块将忽略父块的声明。5050第5章 VHDL基本语句【例5-13】b1:BLOCK SIGNAL s:BIT;-声明块b1中的信号sBEGIN s=a AND b;-此处的信号s是块b1所声明的 b2:BLOCK SIGNAL s:BIT -声明块b2中的信号s BEGIN s=c AND d;-此处的信号s是块b2中声明的 b3:BLOCK BEGIN x=s;-此处的信号s是块b2中声明的 END BLOCK b3;END BLOCK b2;y 实参表达式,形参名=实参表达式,);形参名是待调用过程中已经声明的参数名。在调用过程时,形参名和连接符号“=”可以省略
23、,类似于元件例化时端口映射语句PORT MAP的两种映射方式:名称映射和位置映射。例5-15中声明了一个过程halfadd,该过程用于实现半加器的功能。随后进行了两次调用,一次是并行过程调用,使用名称映射的方式;一次是在进程中的顺序调用,使用位置映射的方式。这两条过程调用语句是并行的,且完成的功能一致。5757第5章 VHDL基本语句【例【例5-15】PROCEDURE halfadd(SIGNAL a,b:IN STD_LOGIC;-声明一个名为halfadd的过程SIGNAL sum:OUT STD_LOGIC);halfadd(a=a1,b=b1,sum=sum1);-并行过程调用 PR
24、OCESS(x1,x2)BEGIN halfadd(x1,x2,s1);-顺序过程调用END PROCESS;并行过程的调用可以获得被调用过程的多个复制电路。函数与过程类似,也可以实现并行调用和顺序调用,函数的调用将在第7章中讲述。5858第5章 VHDL基本语句 5.1.7 生成语句生成语句生成语句(GENERATE 语句)与LOOP语句类似,可以实现某一段代码的重复多次执行。这意味着生成语句有一种复制作用,能够产生多个完全相同的元件。生成语句有FOR/GENERATE和IF/GENERATE两种使用形式。1FOR/GENERATE语句FOR/GENERATE语句的格式如下:标号:FOR 循
25、环变量 IN 取值范围 GENERATE 并行语句END GENERATE 标号;5959第5章 VHDL基本语句 需要注意的是,关键词前的标号是设计者自行定义的标识符,它是必需的。循环变量是自动由生成语句声明的,不需要事先声明,它仅是一个局部变量,根据取值范围自动递增或递减。取值范围必须是一个可计算的整数范围,它的语句格式有两种形式,分别是:(1)表达式 TO 表达式;-递增方式(2)表达式 DOWNTO 表达式;-递减方式6060第5章 VHDL基本语句 FOR/GENERATE语句中的并行语句可以是本节中讲述的任何并行语句,包括:进程语句、元件例化语句、并行信号赋值语句、块语句、并行过程
26、调用语句,甚至是生成语句本身。如果FOR/GENERATE语句中的并行语句是生成语句,这意味着生成语句允许存在嵌套结构。例5-16是一个利用FOR/GENERATE语句实现两个4 bit数组相与的简单示例。图5-13是Quartus综合后的电路结构,可以看到生成了4个完全相同的与逻辑门电路。61 61第5章 VHDL基本语句【例5-16】6262第5章 VHDL基本语句 图5-13 例5-16电路结构 6363第5章 VHDL基本语句 如果将例5-16稍作改动,如例5-17所示,增加了输入信号x作为循环变量取值范围的上限值。由于x的不确定性导致取值范围的不确定,使得编译综合时会出现图5-14所
27、示错误。6464第5章 VHDL基本语句【例5-17】6565第5章 VHDL基本语句 例5-18也是一个错误的示例,综合时会认为输出信号z有多个驱动源(有多个赋值),正确的代码见例5-19。图5-14 例5-17代码错误原因 6666第5章 VHDL基本语句【例5-18】g1:FOR i IN 3 DOWNTO 0 GENERATEz=“1111”WHEN(a(i)AND b(i)=1 ELSE “0000”;END GENERATE;【例5-19】g2:FOR i IN 3 DOWNTO 0 GENERATEz(i)=1 WHEN(a(i)AND b(i)=1 ELSE 0;END GEN
28、ERATE;6767第5章 VHDL基本语句 生成语句通常的作用是创建多个复制的元件、进程或块。例5-20利用FOR/GENERATE语句实现了由D触发器构成的移位寄存器。在结构体gen_shift 中有两条并行的简单信号赋值语句(L17和L21)以及一条FOR/GENERATE语句(L18L20)。FOR/GENERATE语句能够产生4个完全一致的D触发器。图5-15是与例5-20相对应的电路结构原理图。6868第5章 VHDL基本语句【例5-20】6969第5章 VHDL基本语句 图5-15 4个D触发器构成的一个移位寄存器 7070第5章 VHDL基本语句 例5-20使用一条FOR/GE
29、NERATE语句就能够实现4条PORT MAP()语句的功能,使代码更加简练,而且可以通过改变循环变量i的取值范围描述任意长度的移位寄存器。71 71第5章 VHDL基本语句 2IF/GENERATE语句语句IF/GENERATE语句的格式如下:标号:IF 条件表达式 GENERATE 并行语句;END GENERATE 标号;IF/GENERATE语句仅在条件表达式为真时才执行结构内部的并行语句,即条件表达式的结果是布尔型的。IF/GENERATE语句与顺序语句IF不同的是,IF/GENERATE语句中没有ELSE或ELSIF分支语句。7272第5章 VHDL基本语句 从例5-20中可以看出
30、,移位寄存器的输入端和输出端信号的连接无法用FOR/GENERATE语句来实现,只能用两条并行信号赋值语句来完成。也就是说,FOR/GENERATE语句只能处理规则的电路结构,对于串入、串出两个末端的不一样的电路结构无法实现。但是在实际中大多数情况电路的两端(输入和输出)总是具有不规则性。为了解决这种不规则电路的统一描述方法,可以采用IF/GENERATE语句。例5-21使用FOR/GENERATE和IF/GENERATE语句的嵌套实现了一个任意长度的移位寄存器。7373第5章 VHDL基本语句【例5-21】7474第5章 VHDL基本语句 7575第5章 VHDL基本语句 例5-21中,类属
31、参量Length是移位寄存器的长度,由GENERIC语句声明,默认值是5;它同时也是信号z的数组长度。类属参量length也可以从外部传递取值。本例采用了FOR/GENERATE语句和IF/GENERATE语句嵌套的形式,二者可以相互嵌套,即也可以把FOR/GENERATE语句嵌套在IF/GENERATE语句中。本例在FOR/GENERATE语句中,通过IF/GENERATE语句判断循环变量i的取值。如果i=0,则是第一级的D触发器;如果i=length-1,则是最后一级的D触发器。图5-16是综合后产生的RTL电路结构,与设计要求一致。7676第5章 VHDL基本语句 图5-16 例5-21
32、实现的移位寄存器电路结构 7777第5章 VHDL基本语句 5.2 顺顺 序序 语语 句句顺序语句与并行语句共同构成了VHDL基本语句。顺序语句是VHDL在行为描述时普遍用到的语句,主要用在进程与子程序中。顺序语句是相对于并行语句而言的,它按照代码书写的顺序执行语句(仅指仿真执行),这一点与传统软件设计语言非常相似。但需要注意的是,顺序语句的本质仍然是实现硬件电路,而电路的本质是并行的,即电路中的所有元件都可以看做并行执行的单元。读者应从硬件电路的角度出发,理解顺序语句只是一种描述方式,顺序语句中几个常用的、重要的语句在语法意义上更贴近传统的程序设计语句7878第5章 VHDL基本语句 的语法
33、。常用的顺序语句主要有:顺序赋值语句、IF语句、CASE语句、LOOP语句、EXIT语句、NEXT语句、WAIT语句和NULL语句等。数据对象变量被限制用于顺序语句中,即它只能用在进程和子程序内部。作为局部变量,它与信号的用法相反,不能将数据带出进程或子程序。7979第5章 VHDL基本语句 5.2.1 顺序赋值语句顺序赋值语句前面的章节中已多次出现过赋值语句的使用示例,如“x=a AND b”、“y:=a”。其中出现在并行语句结构部分的赋值语句属于并行赋值语句,如5.1.4节中介绍的并行信号赋值语句;而出现在进程和子程序内部的赋值语句可归为顺序赋值语句。由于在进程和子程序内部可以声明变量,因
34、此顺序赋值语句包括信号赋值语句和变量赋值语句两类,即在顺序语句结构中允许对信号和变量两种数据对象进行赋值。反过来,由于变量不能把数据或信息带出声明它的进程和子程序,所以并行赋值语句只有并行信号赋值语句,即在并行语句结构部分只能对信号进行赋值。信号赋值和变量赋值的区别已在第4章中讲述,这里不再赘述。8080第5章 VHDL基本语句 5.2.2 IF语句语句IF语句是顺序语句中最重要与最常用的顺序语句,与传统程序设计中IF语句的语法含义一致,VHDL中的IF语句也是通过对判断表达式(或称条件)进行判断后有选择地执行相应分支的顺序语句。IF语句的形式一般有4种:单分支IF语句、双分支IF语句、多分支
35、IF语句以及嵌套IF语句。其语句格式如下:IF 条件 THEN -单分支IF语句 顺序语句;END IF;IF 条件 THEN-双分支IF语句顺序语句;81 81第5章 VHDL基本语句 ELSE 顺序语句END IF;IF 条件1 THEN -多分支IF语句 顺序语句;ELSIF 条件2 THEN 顺序语句;ELSEIF 条件3 THEN 顺序语句;8282第5章 VHDL基本语句 ELSE 顺序语句;END IF;IF 条件 THEN -嵌套IF语句 IF 条件 THEN END IF;END IF;在前面的章节中已经多次使用过不同类型的IF语句,也对其基本用法有一定的介绍,下面对不同形式
36、的IF语句进行总结和比较。8383第5章 VHDL基本语句(1)单分支IF语句是一种不完整的条件语句,当判断表达式的值为真时,执行关键词THEN后的顺序语句,直到END IF结束;而当判断表达式的值为假时,跳过顺序语句不执行,直接结束IF语句。当条件为假时,不执行IF语句即保持原值不变,这意味着需要引入存储元件。因此,利用单分支IF语句能够构成时序逻辑电路。设计者在进行组合逻辑电路设计时需要特别注意,如果没有将电路中所有可能出现的判断条件考虑完全,就有可能被综合器综合出设计者不希望出现的组合与时序混合的电路。8484第5章 VHDL基本语句(2)双分支IF语句是完整条件语句,当判断表达式的值为
37、真时,执行关键词THEN后的顺序语句;而当判断表达式的值为假时,执行关键词ELSE后的顺序语句。这种结构的条件语句不会出现单分支IF语句不执行任何顺序语句的情况,所以不会产生存储元件,一般用于组合逻辑电路的设计。8585第5章 VHDL基本语句(3)多分支IF语句通过关键词ELSIF设定多个判断条件。语句首先判断第一个条件(即关键词IF后的条件),如果满足则执行对应的顺序语句;如果不满足,则判断第二个条件(即第一个ELSIF后的条件)。如果第二个条件满足,则执行与它对应的顺序语句;如果不满足,则继续判断第三个条件,以此类推。可以看出,多分支IF语句中任一分支对应的顺序语句的执行条件是以上各分支
38、条件均不满足,而该分支条件满足。在所有的条件都不满足的情况下,如果语句中有ELSE分支,则执行该分支;如果没有,则不作任何操作,直接结束多分支IF语句。例5-4就是一个利用多分支IF语句实现带异步复位信号的D触发器的示例。8686第5章 VHDL基本语句(4)嵌套IF语句与多分支IF语句一样能够产生比较丰富的条件描述。嵌套IF语句中任一分支顺序语句的执行,要求以上各分支的条件都满足。使用嵌套IF语句需要注意END IF的数量应与嵌入条件的数量一致。例5-5是一个利用嵌套IF语句实现同步复位的D触发器。例5-22是一个利用多分支IF语句和嵌套IF语句实现含有异步清零信号和同步使能信号的4位十进制
39、加法计数器。清零信号clr与时钟信号clk无关,即只要清零信号clr取值为“1”,不需要等待时钟信号clk上升沿的到来就能够启动进程,执行赋值语句“cqi 0)”,这种独立于时钟控制的清零信号被称为异步清零信号。8787第5章 VHDL基本语句 计数使能信号en必须在时钟信号clk上升沿到来的前提下,取值为“1”才有效,才能够进行加法计数,这种依赖于时钟信号的使能信号被称为同步使能信号。图5-17是加法计数器时序仿真结果。可以看到,当clr取值为“1”时,计数结果q立即清零。当en取值为“1”时,还必须等待时钟信号clk上升沿的到来,计数结果q才能重新加1。总结来说,时序电路中总有一些必要的控
40、制信号,如清零信号、使能信号、置数信号等,如果它们是独立的、不依赖于时钟信号的,就是异步信号;反之,则是同步信号。8888第5章 VHDL基本语句【例5-22】8989第5章 VHDL基本语句 9090第5章 VHDL基本语句 图5-17 4位十进制加法计数器时序仿真结果 91 91第5章 VHDL基本语句 5.2.3 CASE语句语句CASE语句也是顺序语句中最重要、最常用的语句之一,其功能对应于VHDL并行语句WITH/SELECT/WHEN。它的语句格式如下:CASE 表达式 IS WHEN 选择值1 =顺序语句1;WHEN 选择值2 =顺序语句2;WHEN OTHERS =顺序语句n;
41、END CASE;9292第5章 VHDL基本语句 执行CASE 语句时,首先计算表达式的值,然后寻找与其相同的选择值,执行对应的顺序语句。如果表达式的值与选择值1相等,则执行顺序语句1;如果与选择值2相等,则执行顺序语句2;如果所有选择值与表达式的值均不相等,则执行WHEN OTHERS分支下的顺序语句n。在使用CASE语句时需要特别注意以下几点:(1)选择值的取值必须在表达式的取值范围内,且数据类型必须匹配。(2)各个选择值不能有重复,只允许出现一次。9393第5章 VHDL基本语句(3)如果选择值不能将表达式的所有取值列举完全,最后必须加上WHEN OTHERS 子句,代表以上所列所有选
42、择值中未能列出的其他可能取值。(4)WHEN OTHERS子句只能出现一次。(5)符号“=”不是操作符,它的含义相当于“THEN”(或“于是”)。例5-23仍然以4选1多路选择器为例说明CASE语句的使用。L20中的关键词NULL表示不做任何操作。9494第5章 VHDL基本语句【例5-23】9595第5章 VHDL基本语句 CASE语句中每一个选择值对应的顺序语句允许有多条赋值语句,如例5-24,但WITH/SELECT/WHEN语句只允许有一条赋值语句。【例5-24】CASE ctl IS WHEN“00”=x=a;y x=b;y x=“0000”;y b b b b=3;-正确,其他剩余
43、可能取值 END CASE;例5-27是利用CASE语句实现带有异步复位信号的D触发器的示例,显示了CASE语句的分支中可以嵌套IF语句。9999第5章 VHDL基本语句【例5-27】100100第5章 VHDL基本语句 5.2.4 LOOP语句语句LOOP语句的功能是循环执行一条或多条语句。在第3章中例3-16已经简单介绍过FOR/LOOP语句,它是LOOP语句中的一类。LOOP语句主要有三种基本形式:FOR/LOOP、WHILE/LOOP以及条件跳出形式。1FOR/LOOP语句语句FOR/LOOP语句的格式如下:标号:FOR 循环变量IN循环次数范围LOOP顺序语句;END LOOP 标号
44、;101101第5章 VHDL基本语句 关键词FOR后的循环变量是一个临时变量,属于FOR/LOOP语句的局部变量,由语句自动定义,不必事先声明。这个变量只能作为赋值源,不能被赋值。使用时应当注意,在FOR/LOOP语句范围内不能再使用其他与此循环变量同名的标识符。循环次数范围用来规定FOR/LOOP语句中的顺序语句被执行的次数。循环变量从循环次数范围的初值开始,每执行完一次顺序语句后递增1,直至达到循环次数范围指定的最大值。FOR/LOOP语句循环的范围应以常量表示,是一个确定的值。综合器不支持没有约束条件的循环,这是因为VHDL的循环语句与C等程序设计语言不同,在VHDL中的每一次循环都将
45、产生一个硬件模块。随着循环次数的增加,硬件资源将大量消耗,所以在VHDL设计中要谨慎使用循环语句。例5-28显示了通过4次循环产生了4个相同的逻辑与电路。例5-28综合后的电路结构如图5-18所示。102102第5章 VHDL基本语句【例5-28】103103第5章 VHDL基本语句 图5-18 例5-28综合后电路结构 104104第5章 VHDL基本语句 例5-29利用FOR/LOOP语句实现一个带异步清零信号的串入并出的8位移位寄存器。请读者注意变量与移位方向的关系。仿真结果如图5-19所示。【例5-29】105105第5章 VHDL基本语句 106106第5章 VHDL基本语句 图5-
46、19 移位寄存器时序仿真结果 107107第5章 VHDL基本语句 2WHILE/LOOP语句语句与高级程序设计语言中的WHILE循环结构一样,VHDL中的条件循环是通过WHILE/LOOP语句实现的,它的一般格式如下:标号:WHILE 循环条件 LOOP顺序语句;END LOOP 标号;当循环条件不满足(即循环条件表达式取值为FALSE)时,跳出WHILE/LOOP语句循环。例5-30中,当i10时,一直重复执行LOOP内的顺序语句。108108第5章 VHDL基本语句【例5-30】WHILE(i10)LOOP IF clkEVENT AND clk=1 THEN q=q+1;END IF;
47、END LOOP;例5-31利用WHILE/LOOP语句实现了一个8位奇偶校验电路:当元素“1”的个数为偶数时,输出信号q取值为“1”;反之,q为“0”。需要注意的是,WHILE/LOOP语句循环条件中的变量需要事先进行显式的声明(如例5-31中的变量i)。仿真结果见图5-20。109109第5章 VHDL基本语句【例5-31】110110第5章 VHDL基本语句 图5-20 奇偶校验电路时序仿真结果 111111第5章 VHDL基本语句 3条件跳出语句条件跳出语句前面讲述的FOR/LOOP和WHILE/LOOP循环语句是通过循环次数或循环条件来限定执行循环次数的。当需要人为地跳出本次或整个循
48、环语句,转去执行下一次循环或循环语句之外的其他操作语句时,可以采用NEXT语句(跳出本次循环)和EXIT语句(跳出整个循环)。(1)NEXT语句。NEXT语句在LOOP语句执行中进行无条件的或有条件的转向控制,其格式如下:NEXT标号:NEXT LOOP 标号 WHEN 条件表达式;112112第5章 VHDL基本语句 可以看到,NEXT 标号、LOOP标号以及WHEN子句都是可选项,因此,可以将NEXT语句具体分为4种形式:NEXT;NEXT LOOP标号;NEXT WHEN 条件表达式;NEXT LOOP标号 WHEN 条件表达式;第一种语句格式是无条件跳出循环,即当LOOP内的顺序语句执
49、行到NEXT语句时就无条件终止本次循环,跳回到LOOP语句处,重新开始下一次循环。第二种语句格式的作用与第一种类似,只是当有多重LOOP语句嵌套时,可以跳到指定标号的LOOP语句处,重新开始执行循环操作。113113第5章 VHDL基本语句 第三种语句格式带有条件表达式,即如果条件表达式的取值为TRUE,则执行NEXT语句跳出本次循环,进入下一次循环;否则不执行NEXT语句。第四种语句格式既带有条件表达式,又带有LOOP标号。如果条件表达式取值为TRUE,则执行NEXT语句,跳转到LOOP标号处;否则,不执行NEXT语句。例5-32中使用了带有条件表达式的NEXT语句。当条件表达式为真,即ct
50、l(i)=0时,跳出本次循环,循环变量i加1,进行下一次循环。如果ctl=11111111,则每次循环都不会被强行跳出,最后的结果是y=x;如果ctl=00000000,则每次循环都会跳出,不能执行y(i)=x(i)的赋值语句,最后的结果是y仍然等于初值00000000。例5-32的仿真结果如图5-21所示。114114第5章 VHDL基本语句【例5-32】115115第5章 VHDL基本语句 图5-21 例5-32仿真结果 116116第5章 VHDL基本语句 例5-33是LOOP语句的嵌套,用LOOP标号进行区别(L1和L2)。当i=j时,满足条件表达式,NEXT语句被执行,跳出内循环L2