海南省建设执业中心网站响应式网站价格
顺序语句和并行语句是VHDL中的两大基本描述语句系列。
一、前言
所谓顺序语句,是指在仿真意义上具有一定顺序性(或者说在逻辑上有先后之分),并不意味着这些语句对于的硬件结构也有相同的顺序性。
 所有门电路是并行地工作,并没有先后之分。以并行的工作方式实现顺序的逻辑是硬件描述语言的一大特点。
1.1 顺序语句的特点:
- 语句的执行和书写顺序相同。
 - 顺序语句只能应用在进程和子程序中。
 
1.2 VHDL中常用的几种顺序描述语句:
- 简单信号赋值语句(signal assignment)
 - 变量赋值语句(variable assignment)
 - wait语句
 - if 语句
 - case 语句
 - loop语句
 - next语句
 - exit语句
 - null 语句
 - return 语句
 - 断言(assert)语句
 
二、wait语句
进程在仿真运行中总处于两种状态:执行或者挂起。
 当执行到wait语句时,运行程序将被挂起,直到满足此语句设置的结束挂起条件后,将重新开始执行进程中的程序。
wait语句格式
对不同的结束挂起条件的设置,wait语句有以下四种不同的语句格式:
(1)WAIT;
 
表示永远挂起
(2)WAIT ON 信号表;
 
敏感信号等待语句,信号表中列出的信号是等待语句的敏感信号,敏感信号的变化将结束挂起,重新启动进程。
(3)WAIT UNTIL 条件表达式;
 
条件等待语句,被此语句结束挂起的进程需顺序满足如下两个条件,才能脱离挂起状态。
 (1)在条件表达式中所含的信号发生了变化;
 (2)此信号改变后,且满足wait语句所设的条件。
 常用表达方式:
WAIT UNTIL 信号 = Value ; 
WAIT UNTIL 信号’EVENT AND 信号 = Value;
 
例:寄存器
 
library ieee;
use ieee.std_logic_1164.all;entity example isport(pin : in bit_vector(3 downto 0);clk,cnt : in bit;pout : out bit_vector(3 downto 0));
end example;architecture behave of example is
beginprocessbeginwait until clk'event and clk='1';if cnt='1' then pout<=pin;end if;end process;
end behave;
 
(4)WAIT FOR 时间表达式;
 
超时等待语句,时间表达式说明需要等待的时间
三、if语句
if语句格式
1)
if 条件句 then 顺序语句;
end if;
 
例:带控制口的加法器
 
library ieee;
use ieee.std_logic_1164.all;entity example isport(a , b : in integer;cnt : in bit;cout : out integer);
end example;architecture behave of example isbeginprocess(cnt)beginif cnt='1' thencout<=a+b;end if;end process;
end behave;
 
2)
if 条件句 then 顺序语句; 
else 顺序语句;
end if;
 
3)
if 条件句 thenif 条件句 then…end if;
end if;
 
4)
if 条件句 then 顺序语句; elsif 条件句 then 顺序语句;…else 顺序语句; 
end if;
 
以4选1数据选择器为例
真值表:
| s | y | 
|---|---|
| 00 | a | 
| 01 | b | 
| 10 | c | 
| 11 | d | 
library ieee;
use ieee.std_logic_1164.all;entity example isport ( a,b,c,d : in std_logic_vector(3 downto 0);s : in std_logic_vector(2 downto 0);y : out std_logic_vector(3 downto 0));
end example;architecture behave of example is
beginp1:process(d) begin--if 案例if s="00" then y<=a;elsif s="01" then y<=b;elsif s="10" then y<=c;else  y<=d;  end if;end process p1;
end behave;  
四、case语句
4.1 case语句格式
CASE 表达式 ISWhen 选择值 => 顺序语句;When 选择值 => 顺序语句;...
END CASE ;
 
选择值可以有四种不同的表达方式:
- 单个普通数值,如6。
 - 数值选择范围,如(2 TO 4),表示取值为2、3或4。
 - 并列数值,如3|5,表示取值为3或者5。
 - 混合方式,以上三种方式的混合。
 
使用CASE语句需注意:
 1. 条件句中的选择值必须在表达式的取值范围内;
 2. 所有条件句中的选择值应完全覆盖case语句中表达式的取值。
 3. 每一条件句的选择值只能出现一次。
 4. case语句中至少要包含一个条件句
4.2 案例
以8-3译码器为例
library ieee;
use ieee.std_logic_1164.all;entity example isport ( d : in std_logic_vector(7 downto 0);q : out std_logic_vector(2 downto 0));
end example;architecture behave of example is
beginp1:process(d) begin--case 案例case d iswhen "01111111" =>q<="111";when "10111111" =>q<="110";when "11011111" =>q<="101";when "11101111" =>q<="100";when "11110111" =>q<="011";when "11111011" =>q<="010";when "11111101" =>q<="001";when "11111110" =>q<="000";when others =>null;end case;end process p1;
end behave;  
五、LOOP语句
LOOP语句就是循环语句,使所包含的一组顺序语句被循环执行,循环次数可由设定的参数决定。一般用来描述片逻辑及迭代电路的行为。
常用的书写格式
1)FOR循环变量
[标号:] FOR 循环变量 IN 离散范围 LOOP顺序语句END LOOP [标号];
 
说明:
- FOR后的循环变量是一个临时变量,属LOOP语句的局部变量,不必事先定义;每次循环中,循环变量都要在离散范围内变化。
 - LOOP循环的次数最好以常数表示,否则,在LOOP体内的逻辑可以重复任何可能的次数。
例:0~9累加 
sum:=0;
for i in 0 to 9 loopsum:=sum+i;
end loop;
 
2)While条件
[标号:] WHILE 循环控制条件 LOOP 顺序处理语句END LOOP [标号];
 
与FOR_LOOP语句不同的是:WHILE_LOOP语句并没有给出循环次数范围,没有自动递增循环变量的功能,而是给出了循环执行顺序语句的条件。
 这里的循环控制条件可以是任何布尔表达式,当条件为TRUE时继续循环,否则跳出循环。
3)单个LOOP语句
[标号:] LOOP顺序语句END LOOP [ 标号 ];
 
这种循环方式是一种最简单的语句形式,它的循环方式需引入其他控制方式(如next语句、exit语句)后才能确定。
六、NEXT语句
6.1 语句格式next [标号][when条件];
 
1)NEXT;
 
执行到NEXT时,无条件中止当前循环,返回循环起点,开始下次循环。
2)NEXT LOOP标号;
 
执行到NEXT时,无条件中止当前循环,返回LOOP标号处,开始下次循环。
3)NEXT LOOP标号 WHEN 条件表达式;
 
WHEN 条件表达式 是执行NEXT语句的条件,条件表达式的值为真时,执行NEXT语句,进入跳转操作,否则继续向下执行。
七、EXIT语句
7.1语句格式EXIT[标号][WHEN条件];
 
1)EXIT;
 
执行到NEXT时,无条件中止当前循环,跳出循环。
2)EXIT LOOP标号;
 
执行到NEXT时,无条件中止当前循环,返回LOOP循环语句的结束处,跳出循环。
3)EXIT LOOP标号 WHEN 条件表达式;
 
WHEN 条件表达式 是执行NEXT语句的条件,条件表达式的值为真时,执行EXIT语句,跳出循环。
注:EXIT语句与NEXT语句十分相似,都是LOOP语句的内部循环控制语句。
NEXT语句与EXIT 语句的区别:
- NEXT语句跳转到LOOP标号指定的LOOP处----即跳到LOOP语句的起点。
 - EXIT 语句跳转到LOOP循环语句的结束处----即跳出循环
 
八、null语句
null语句表示一个空操作,不发生任何行为,目的只是使得程序执行到下一句。
 空操作语句的语句格式:NULL;
九、顺序断言(ASSERT)语句
断言语句主要用于程序仿真、调试时使用,在综合时忽略。
其格式为:ASSERT 条件 [REPORT 输出信息] [SEVERITY 级别]
当执行ASSERT语句时,如果条件为真,则继续向下执行;如果条件为假,则输出错误信息和错误严重程度的级别,在REPORT后面跟的是设计者所写的字符串,通常是说明错误的
 原因,并且用双引号“ ”将字符串括起来。在VHDL中,错误的严重程度可分为4个级别,并跟在SEVERITY后面,按严重程度由重到轻分别是:NOTE、WARNING、ERROR、FAILURE。
