5.4...

22
1 5.4 顺序语句 顺序语句和并行语句是VHDL中的两大基本描述语句系列。 顺序语句的特点: 语句的执行和书写顺序相同。 顺序语句只能应用在进程和子程序中。 VHDL中常用的几种顺序描述语句: 简单信号赋值语句(signal assignment) 变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句 null 语句 return 语句 断言(assert)语句

Upload: others

Post on 13-Oct-2020

21 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

1

5.4 顺序语句

顺序语句和并行语句是VHDL中的两大基本描述语句系列。顺序语句的特点:

语句的执行和书写顺序相同。

顺序语句只能应用在进程和子程序中。

VHDL中常用的几种顺序描述语句:

简单信号赋值语句(signal assignment)

变量赋值语句(variable assignment)

wait语句

if 语句

case 语句

loop语句

next语句

exit语句

null 语句

return 语句

断言(assert)语句

Page 2: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

2

5.4.1 wait语句

进程在仿真运行中总处于两种状态:执行或者挂起。

对不同的结束挂起条件的设置,wait语句有以下四种不

同的语句格式:

WAIT; -- 第一种语句格式

WAIT ON 信号表; -- 第二种语句格式

WAIT UNTIL 条件表达式; -- 第三种语句格式

WAIT FOR 时间表达式; -- 第四种语句格式, 超时等待语句

当执行到wait语句时,运行程序将被挂起,直到满足此

语句设置的结束挂起条件后,将重新开始执行进程中的程序。

Page 3: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

3

第一种表示永远挂起

第二种称为敏感信号等待语句,信号表中列出的信号是等待语

句的敏感信号,敏感信号的变化将结束挂起,重新启动进程。

WAIT; -- 第一种语句格式

WAIT ON 信号表; -- 第二种语句格式

WAIT UNTIL 条件表达式; -- 第三种语句格式

WAIT FOR 时间表达式; -- 第四种语句格式, 超时等待语句

第三种称为条件等待语句,被此语句结束挂起的进程需顺序

满足如下两个条件,才能脱离挂起状态。

(1)在条件表达式中所含的信号发生了变化;

(2)此信号改变后,且满足wait语句所设的条件。

第四种称为超时等待语句,时间表达式说明需要等待的时间

Page 4: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

4

下面程序中的两种表达方式是等效的,进程的启动条件

是enable出现一个上跳沿。

(b)WAIT_ON 结构

loop

wait on enable;

exit when enable ='1';

end loop;

(a)WAIT_UNTIL 结构

...

Wait until enable ='1';

...

下面是WAIT_UNTIL语句的常用表达方式:

WAIT UNTIL 信号 = Value ; -- (1)

WAIT UNTIL 信号’EVENT AND 信号 = Value; --

(2)

Page 5: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

5

WAIT语句最常用的都是用于指定时钟输入,下面语句所设的进程启动条件都是时钟上跳沿,所以它们对应的硬件结构是一样的:

WAIT UNTIL clock = '1';

WAIT UNTIL clock’EVENT AND clock = '1';【程序】...

PROCESS

BEGIN

WAIT UNTIL clk = '1';

ave <= a;

WAIT UNTIL clk = '1';

ave <= ave + a;

WAIT UNTIL clk = '1';

ave <= ave + a;

WAIT UNTIL clk = '1';

ave <= (ave + a)/4 ;

END PROCESS ;

Page 6: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

6

5.4.2 if语句

if语句是一种条件语句,其基本结构有四种:

1.if 条件句 then 顺序语句;

end if;

2.if 条件句 then 顺序语句;

else 顺序语句;

end if;

3.if 条件句 then

if 条件句 then

end if;

end if;

4.if 条件句 then 顺序语句;

elsif 条件句 then 顺序语句;

else 顺序语句;

end if;

Page 7: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

7

IF语句举例 LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY con IS

PORT (a, b, c: IN BOOLEAN;

output: OUT BOOLEAN);

END con;

ARCHITECTURE example OF con 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;

Page 8: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

8

【程序】LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY coder ISPORT ( din : IN STD_LOGIC_VECTOR(0 TO 7);

output : OUT STD_LOGIC_VECTOR(2 DOWNTO 0) );END coder;ARCHITECTURE behav OF coder ISBEGIN

PROCESS (din)BEGIN

IF (din(7)='0') THEN output <= "000" ; ELSIF (din(6)='0') THEN output <= "001" ; ELSIF (din(5)='0') THEN output <= "010" ; ELSIF (din(4)='0') THEN output <= "011" ; ELSIF (din(3)='0') THEN output <= "100" ;ELSIF (din(2)='0') THEN output <= "101" ;ELSIF (din(1)='0') THEN output <= "110" ;ELSE output <= "111" ;

END IF;END PROCESS;END behav;

--优先编码器描述

Page 9: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

9

5.4.3 case语句

CASE 表达式 ISWhen 选择值 => 顺序语句;When 选择值 => 顺序语句;...

END CASE ;

选择值可以有四种不同的表达方式:

单个普通数值,如6。

数值选择范围,如(2 TO 4),表示取值为2、3或4。

并列数值,如35,表示取值为3或者5。

混合方式,以上三种方式的混合。

使用CASE语句需注意:

1.条件句中的选择值必须在表达式的取值范围内;

2.所有条件句中的选择值应完全覆盖case语句中表达式的取值。

3.每一条件句的选择值只能出现一次。

4.case语句中至少要包含一个条件句。

CASE语句结构:

Page 10: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

10

【程序】 --半加器描述(1)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL; ENTITY h_adder IS

PORT ( a, b : IN STD_LOGIC; co, so : OUT STD_LOGIC);

END ENTITY h_adder; ARCHITECTURE fh1 OF h_adder is

SIGNAL abc : STD_LOGIC_VECTOR(1 DOWNTO 0) ;BEGIN

abc <= a & b ; PROCESS(abc)BEGIN

CASE abc ISWHEN "00" => so<='0'; co<='0' ;WHEN "01" => so<='1'; co<='0' ;WHEN "10" => so<='1'; co<='0' ;WHEN "11" => so<='0'; co<='1' ;WHEN OTHERS => NULL ;

END CASE;END PROCESS;

END ARCHITECTURE fh1 ;

Page 11: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

11

5.4.4 LOOP语句

LOOP语句就是循环语句,使所包含的一组顺序语句被循环执行,

循环次数可由设定的参数决定。一般用来描述片逻辑及迭代电路的行为。

常用的书写格式有三种:

1. FOR循环变量

[标号:] FOR 循环变量 IN 离散范围 LOOP

顺序语句

END LOOP [标号];

格式:

FOR后的循环变量是一个临时变量,属LOOP语句的局部变量,不必事先定义;每次循环中,循环变量都要在离散范围内变化。

LOOP循环的次数最好以常数表示,否则,在LOOP体内的逻辑可以重复任何可能的次数。

说明:

Page 12: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

12

sum:for i in 1 to 9 loop

summ:=i+summ;

end loop sum; 功能:1~9的累加计算

SIGNAL a, b, c : STD_LOGIC_VECTOR (1 TO 3);

...

FOR n IN 1 To 3 LOOP

a(n) <= b(n) AND c(n);

END LOOP;

【程序2】

【程序1】

此段程序等效于顺序执行以下三个信号赋值操作:

a(1) <= b(1) AND c(1); a(2) <= b(2) AND c(2);

a(3) <= b(3) AND c(3);

Page 13: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

13

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;

ENTITY p_check ISPORT ( a : IN STD_LOGIC_VECTOR (7 DOWNTO 0);

y : OUT STD_LOGIC );END p_check;

ARCHITECTURE opt OF p_check ISBEGINPROCESS(a) variable tmp :STD_LOGIC ;BEGINtmp <='0';FOR n IN 0 TO 7 LOOP

tmp <= tmp XOR a(n);END LOOP ;y <= tmp;

END PROCESS;END opt;

8位奇偶校验电路

【程序3】

Page 14: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

14

2. While条件

[标号:] WHILE 循环控制条件 LOOP

顺序处理语句

END LOOP [标号];

格式:

与FOR_LOOP语句不同的是:WHILE_LOOP语句并没有给出循环次数范围,没有自动递增循环变量的功能,而是给出了循环执行顺序语句的条件。

这里的循环控制条件可以是任何布尔表达式,当条件为TRUE时继续循环,否则跳出循环。

例: i:=1;

summ:=0;

bcdsumm: while (i<10) loop

summ:=i+summ;

i:=i+1;

end loop bcdsumm;

sum:for i in 1 to 9 loop

summ:=i+summ;

end loop sum;

Page 15: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

15

3. 单个LOOP语句

这种循环方式是一种最简单的语句形式,它的循环方式需

引入其他控制方式(如next语句、exit语句)后才能确定。

格式: [标号:] LOOP

顺序语句

END LOOP [ 标号 ];

Page 16: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

16

5.4.5 NEXT语句

next语句用于loop语句跳出本次循环的描述,格式为:

next [标号][when条件];

标号和when条件语句可以缺省:

NEXT; --第一种语句格式

NEXT LOOP标号; --第二种语句格式

NEXT LOOP标号 WHEN 条件表达式; --第三种语句格式

第一种语句:执行到NEXT时,无条件中止当前循环,返回循环起点,开始下次循环。

第二种语句:执行到NEXT时,无条件中止当前循环,返回LOOP标号处,开始下次循环。

第三种语句: WHEN 条件表达式是执行NEXT语句的条件,条件表达式的值为真时,执行NEXT语句,进入跳转操作,否则继续向下执行。

Page 17: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

17

【程序】

……

PROCESS

BEGIN

rst_loop : LOOP

WAIT UNTIL ' clock’EVENT AND clock ='1; --等待时钟信号

NEXT rst_loop WHEN (rst='1'); --检测复位信号rst

x <= a ; --无复位信号,执行赋值操作

WAIT UNTIL clock’EVENT AND clock ='1'; --等待时钟信号

NEXT rst_loop WHEN (rst='1'); --检测复位信号rst

y <= b ; --无复位信号,执行赋值操作

END LOOP rst_loop ;

END PROCESS;

……

该程序描述的是一个具有同步复位功能的电路

Page 18: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

18

5.4.6 EXIT语句

EXIT; --第一种语句格式

EXIT LOOP标号; --第二种语句格式

EXIT LOOP标号WHEN条件表达式; --第三种语句格式

两者的区别:

NEXT语句跳转到LOOP标号指定的LOOP处----即跳到LOOP语

句的起点。

EXIT语句跳转到LOOP循环语句的结束处-----即跳出循环。

下例是使用EXIT控制的循环语句,注意和NEXT语句的区别。

EXIT语句与NEXT语句十分相似,都是LOOP语句的内部循环控制语句

,其格式如下:EXIT[标号][WHEN条件];

标号和WHEN条件语句可以缺省:

Page 19: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

19

【程序】

SIGNAL a, b : STD_LOGIC_VECTOR (1 DOWNTO 0);

SIGNAL a_less_then_b : Boolean;

... ... ... ... ... ... ... ...

a_less_then_b <= FALSE ; --设初始值

FOR i IN 1 DOWNTO 0 LOOP

IF (a(i)= '1' AND b(i)='0') THEN

a_less_then_b <= FALSE ; -- a > b

EXIT ;

ELSIF (a(i)='0' AND b(i)='1') THEN

a_less_then_b <= TRUE ; -- a < b

EXIT;

ELSE NULL; --为空操作语句

END IF;

END LOOP; --当 i=1时返回LOOP语句继续比较

... ... ... ... ... ... ... ...

Page 20: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

20

5.4.7 null语句

空操作语句的语句格式如下:

NULL;

在下例的CASE语句中,NULL用于排除一些不用的条件。

case muxval iswhen 0 => q<=i0;when 1 => q<=i1;when 2 => q<=i2;when 3 => q<=i3;when others => null;

end case;

null语句表示一个空操作,不发生任何行为,目的只是使得程序执行到下一句。

Page 21: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

21

5.4.8 顺序断言(ASSERT)语句

断言语句主要用于程序仿真、调试时使用,在综合时忽略。

其格式为:

ASSERT 条件 [REPORT 输出信息] [SEVERITY 级别]

当执行ASSERT语句时,如果条件为真,则继续向下执行;

如果条件为假,则输出错误信息和错误严重程度的级别,在

REPORT后面跟的是设计者所写的字符串,通常是说明错误的

原因,并且用双引号“”将字符串括起来。在VHDL中,错误

的严重程度可分为4个级别,并跟在SEVERITY后面,按严重程

度由重到轻分别是:NOTE、WARNING、ERROR、

FAILURE。

Page 22: 5.4 顺序语句course.sdu.edu.cn/Download/06026b64-be50-42bd-9a24-97fd1...变量赋值语句(variable assignment) wait语句 if 语句 case 语句 loop语句 next语句 exit语句

22

VHDL 小节VHDL结构: 实体、结构体、库、程序包、配置

VHDL语法规则:

文字规则:标识符、数字、字符和字符串、位串、注释

数据对象:常量、变量、信号、文件

数据类型:VHDL预定义、IEEE预定义、用户自定义(枚举类型)

运算符:逻辑运算符、算数运算符、关系运算符、并置运算符

VHDL语句:

并行语句:进程语句、块语句、并行信号赋值语句、并行过程调用

语句、并行断言语句、类属语句、元件例化语句、生成语句

顺序语句: 简单信号赋值语句、变量赋值语句、 wait语句、 if 语句、

case 语句、 loop语句、 next语句、 exit语句、 null 语句、顺序断言

(assert)语句