资源预览内容
第1页 / 共52页
第2页 / 共52页
第3页 / 共52页
第4页 / 共52页
第5页 / 共52页
第6页 / 共52页
第7页 / 共52页
第8页 / 共52页
第9页 / 共52页
第10页 / 共52页
亲,该文档总共52页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第五章 VHDL主要描述语句第一部顺序语句,5.1.1 赋值语句 5.1.2 IF语句 5.1.3 CAS E语句 5.1.4 LOOP语句 5.1.5 NEXT语句 5.1.6 EXIT语句,5.1.7 WAIT语句 5.1.8 子程序调用语句 5.1.9 RETURN(返回)语句 5.1.10 NULL语句 5.1.11 ASSERT 5.1.12 REPORT语句,5.1 顺序语句,顺序语句(Sequential Statements)和并行语句(Concurrent Parallel Statements)是VHDL程序设计中两大基本描述语句系列。在逻辑系统的设计中,这些语句从多侧面完整地描述数字系统的硬件结构和基本逻辑功能,其中包括通信的方式、信号的赋值、多层次的元件例化以及系统行为等。 顺序语句是相对于并行语句而言的,其特点是每一条顺序语句的执行(指仿真执行)顺序是与它们的书写顺序基本一致的,但其相应的硬件逻辑工作方式未必如此,在理解过程中要注意区分VHDL语言的软件行为及描述综合后的硬件行为间的差异。,顺序语句只能出现在进程(Process)和子程序中。在VHDL中,一个进程是由一系列顺序语句构成的,而进程本身属并行语句,这就是说,在同一设计实体中,所有的进程是并行执行的。然而任一给定的时刻内,在每一个进程内,只能执行一条顺序语句。一个进程与其设计实体的其他部分进行数据交换的方式只能通过信号或端口。如果要在进程中完成某些特定的算法和逻辑操作,也可以通过依次调用子程序来实现,但子程序本身并无顺序和并行语句之分。利用顺序语句可以描述逻辑系统中的组合逻辑、时序逻辑或它们的综合体。 顺序语句包括:赋值语句、IF语句、CASE语句、LOOP语句、NEXT语句、EXIT语句、WAIT语句、过程调用语句、RETURN语句、NULL语句、断言语句、 REPORT语句。,变量赋值语句和信号赋值语句的语法格式如下: 变量赋值目标 := 赋值源; 信号赋值目标 = 赋值源; 在信号赋值中,需要注意的是,当在同一进程中,同一信号赋值目标有多个赋值源时,信号赋值目标获得的是最后一个赋值源的赋值,其前面相同的赋值目标则不作任何变化。,例 SIGNAL s1,s2 :STD_LOGIC; SIGNAL svec :STD_LOGIC_VECTOR(0 TO 7); . PROCESS(s1,s2 ) IS VARIABLE v1,v2:STD_LOGIC; BEGIN v1 := 1; -立即将v1置位为1 v2 := 1; -立即将Vv置位为1 s1 = 1; -s1被赋值为1 s2 = 1; -由于在本进程中,这里的s2不是最后一个赋值语句故 不作任何赋值操作 svec(0) = v1; -将v1在上面的赋值1,赋给svec(0) svec(1) = v2; -将v2在上面的赋值1,赋给svec(1) svec(2) = s1; -将s1在上面的赋值1,赋给svec(2) svec(3) = s2; -将最下面的赋予s2的值0,赋给svec(3) v1 := 0; -将v1置入新值0 v2 := 0; -将v2置入新值0 s2 := 0; -由于这是s2最后一次赋值,赋值有效,此0将上面准 备赋入的1覆盖掉 svec(4) = v1; -将v1在上面的赋值0,赋给svec(4) svec(5) = v2; -将v2在上面的赋值0,赋给svec(5) svec(6) = s1; -将 s1在上面的赋值1,赋给svec(6) svec(7) = s2; -将s2在上面的赋值0,赋给svec(7) END PROCESS,赋值目标 赋值语句中的赋值目标有四种类型。 标识符赋值目标及数组单元素赋值目标 标识符赋值目标是以简单的标识符作为被赋值的信号或变量名。 数组单元素赋值目标的表达形式为: 数组类信号或变量名 下标名可以是一个具体的数字,也可以是一个文字表示的数字名,它的取值范围在该数组元素个数范围内。下标名若是未明确表示取值的文字(不可计算值),则在综合时,将耗用较多的硬件资源,且一般情况下不能被综合。(见上例),段下标元素赋值目标及集合块赋值目标 段下标元素赋值目标可用以下方式表示: 数组类信号或变量名(下标1 TO/DOWNTO 下标2) 括号中的两个下标必须用具体数值表示,并且其数值范围必须在所定义的数组下标范围内,两个下标的排序方向要符合方向关键词TO或DOWNTO,具体用法如下例所示: VARIABLE a,b:STD_LOGIC_VECTOR (1 TO 4); a (1 TO 2) := 10 ; - 等效于A(1):=1, A(2):=0 a (4 DOWNTO 1) :=1011;,集合块赋值目标 集合块赋值目标,是以一个集合的方式来赋值的。对目标中的每个元素进行赋值的方式有两种,即位置关联赋值方式和名字关联赋值方式,具体用法如下例所示: SIGNAL a,b, c, d :STD_LOGIC: SIGNAL s: STD_LOGIC_VECTOR( 1 TO 4) . VARIABLE e,f :STD_LOGIC; VARIABLE g :STD_LOGIC_VECTOR(1 TO 2 ); VARIABLE h :STD_LOGIC_VECTOR(1 TO 4 ); s e, 4=f, 2 =g(1), 1=g(2) ):=h;-名字关联方式赋值,示例中的信号赋值语句属位置关联赋值方式,其赋值结果等效于: a =0;b =1;c =0 ;d =0; 示例中的变量赋值语句属名字关联赋值方式,赋值结果等效于: g(2) := h(1) ;g(1) := h(2) ;e := h(3) ;f := h(4) ;,IF语句是一种条件语句,它根据语句中所设置的一种或多种条件,有选择地执行指定的顺序语句,其语句结构如下: IF 标号: IF 条件句 THEN 顺序语句; ELSIF 条件句 THEN 顺序语句; ELSE 顺序语句; END IF IF 标号:,5.1.2 IF语句,所以,IF语句共有三种类型。,例 利用IF语句完成一个具有2输入与门功能的函数定义: FUNCTION and_func (x,y:IN BIT) RETURN BIT IS BEGIN IF x=1 AND y=1 THEN RETURN 1; ELSE RETURN 0; END IF; END and_func ;,例 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY control_stmts IS PORT (a,b,c: IN BOOLEAN; output:OUT BOOLEAN); END control_stmts ; ARCHITECTURE example OF control_stmts IS BEGIN PROCESS(a,b,c) VARIABLE n: BOOLEAN; BEGIN IF a THEN n:=b; ELSE n :=c; END IF; output =n; END PROCESS, END example;,上例对应的硬件电路如下图所示:,例 SIGNAL a,b,c,p1,p2,z: BIT; . IF (p1=1) THEN z=a; -满足此语句的执行条件是(p1=1) ELSIF (p2=0) THEN z=b; -满足此语句的执行条件是(p1=0)AND (p2=0) ELSE z=c; -满足此语句的执行条件是(p1=0)AND (p2=1) END IF;,该例是由两个2选1 多路选择器构成的电路逻辑描述,其中,p1和p2分别是两个多路选择器的通道选择开关,当为高电平时下端的通道接通。,双2选1多路选择器电路,5.1.3 CASE语句,CASE语句根据满足的条件直接选择多项顺序语句中的一项执行。 CASE语句的结构如下: CASE 表达式 IS WHEN 选择值 =顺序语句; WHEN 选择值 =顺序语句; WHEN OTHERS =顺序语句; END CASE;,使用CASE语句需注意以下几点: 条件句中的选择值必须在表达式的取值范围内。 除非所有条件句中的选择值能完整覆盖CASE语句中表达式的取值,否则最末一个条件句中的选择必须用“OTHERS”表示。 CASE语句中每一条语句的选择只能出现一次,不能有相同选择值的条件语句出现。 CASE语句执行中必须选中,且只能选中所列条件语句中的一条。这表明CASE语句中至少要包含一个条件语句。,例:用CASE语句描述4选1多路选择器: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux41 IS PORT(s1,s2 :IN STD_LOGIC; a, b, c, d :IN STD_LOGIC; z :OUT STD_LOGIC); END ENTITY mux41; ARCHITECTURE activ OF mux41 IS SIGNAL s :STD_LOGIC_VECTOR(1 DOWNTO 0); BEGIN s z z z z z=x; END CASE; END PROCESS; END activ;,注意本例的第五个条件名是必需的,因为对于定义STD_LOGIC_VECTOR数据类型的s,在VHDL综合过程中,它可能的选择值除了00、01、10和11外,还可以有其他定义于STD_LOGIC的选择值。本例的逻辑图如下所示:,4选1多路选择器,CASE语句与IF语句比较: CASE语句组的程序可读性比较好,这是因为它把条件中所有可能出现的情况全部列出来了,可执行条件一目了然。而且CASE语句的执行过程不像IF语句那样有一个逐项条件顺序比较的过程。CASE语句中条件句的次序是不重要的,它的执行过程更接近于并行方式。一般地,综合后,对相同的逻辑功能,CASE语句比IF语句的描述耗用更多的硬件资源,而且有的逻辑,CASE语句无法描述,只能用IF语句来描述。这是因为IF_THEN_ELSIF语句具有条件相与的功能和自动将逻辑值“-”包括进去的功能(逻辑值“-”有利于逻辑化简),而CASE语句只有条件相或的功能。,5.1.4 LOOP语句,LOOP语句就是循环语句,它可以使所包含的一组顺序语句被循环执行,其执行次数可由设定的循环参数决定,循环的方式由 NEXT和EXIT语句来控制。其语句格式如下: LOOP 标号: 重复模式 LOOP 顺序语句 END LOOPLOOP 标号; 重复模式有两种:FOR 和WHILE,格式分别为: LOOP 标号: FOR 循环变量 IN 循环次数范围 LOOP -重复次数已知 LOOP 标号:WHILE 循环控制条件 LOOP -重复次数未知,例: 简单LOOP语句的使用。 L2: LOOP a:=a+1; EXIT L2 WHEN a10; -当a大于10时跳出循环 END LOOP L2; ,例: FORLOOP语句的使用(8位奇偶校验逻辑电路的VHDL程序)。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY p_check IS PORT (a:IN STD_LOGIC_VECTOR(7 DOWNTO 0); y:OUT STD_LOGIC); END ENTITY p_check ; ARCH
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号