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

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

Oct 13, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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)语句