顺序语句和并行语句是VHDL中的两大基本描述语句系列。
所谓顺序语句,是指在仿真意义上具有一定顺序性(或者说在逻辑上有先后之分),并不意味着这些语句对于的硬件结构也有相同的顺序性。
所有门电路是并行地工作,并没有先后之分。以并行的工作方式实现顺序的逻辑是硬件描述语言的一大特点。
进程在仿真运行中总处于两种状态:执行或者挂起。
当执行到wait语句时,运行程序将被挂起,直到满足此语句设置的结束挂起条件后,将重新开始执行进程中的程序。
对不同的结束挂起条件的设置,wait语句有以下四种不同的语句格式:
WAIT;
表示永远挂起
WAIT ON 信号表;
敏感信号等待语句,信号表中列出的信号是等待语句的敏感信号,敏感信号的变化将结束挂起,重新启动进程。
WAIT UNTIL 条件表达式;
条件等待语句,被此语句结束挂起的进程需顺序满足如下两个条件,才能脱离挂起状态。
(1)在条件表达式中所含的信号发生了变化;
(2)此信号改变后,且满足wait语句所设的条件。
常用表达方式:
WAIT UNTIL 信号 = Value ;
WAIT UNTIL 信号’EVENT AND 信号 = Value;
library ieee;
use ieee.std_logic_1164.all;
entity example is
port(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
begin
process
begin
wait until clk'event and clk='1';
if cnt='1' then
pout<=pin;
end if;
end process;
end behave;
WAIT FOR 时间表达式;
超时等待语句,时间表达式说明需要等待的时间
if 条件句 then 顺序语句;
end if;
library ieee;
use ieee.std_logic_1164.all;
entity example is
port(a , b : in integer;
cnt : in bit;
cout : out integer
);
end example;
architecture behave of example is
begin
process(cnt)
begin
if cnt='1' then
cout<=a+b;
end if;
end process;
end behave;
if 条件句 then 顺序语句;
else 顺序语句;
end if;
if 条件句 then
if 条件句 then
…
end if;
end if;
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 is
port ( 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
begin
p1: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 表达式 IS
When 选择值 => 顺序语句;
When 选择值 => 顺序语句;
...
END CASE ;
选择值可以有四种不同的表达方式:
使用CASE语句需注意:
1. 条件句中的选择值必须在表达式的取值范围内;
2. 所有条件句中的选择值应完全覆盖case语句中表达式的取值。
3. 每一条件句的选择值只能出现一次。
4. case语句中至少要包含一个条件句
以8-3译码器为例
library ieee;
use ieee.std_logic_1164.all;
entity example is
port ( d : in std_logic_vector(7 downto 0);
q : out std_logic_vector(2 downto 0)
);
end example;
architecture behave of example is
begin
p1:process(d)
begin
--case 案例
case d is
when "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语句就是循环语句,使所包含的一组顺序语句被循环执行,循环次数可由设定的参数决定。一般用来描述片逻辑及迭代电路的行为。
[标号:] FOR 循环变量 IN 离散范围 LOOP
顺序语句
END LOOP [标号];
说明:
sum:=0;
for i in 0 to 9 loop
sum:=sum+i;
end loop;
[标号:] WHILE 循环控制条件 LOOP
顺序处理语句
END LOOP [标号];
与FOR_LOOP语句不同的是:WHILE_LOOP语句并没有给出循环次数范围,没有自动递增循环变量的功能,而是给出了循环执行顺序语句的条件。
这里的循环控制条件可以是任何布尔表达式,当条件为TRUE时继续循环,否则跳出循环。
[标号:] LOOP
顺序语句
END LOOP [ 标号 ];
这种循环方式是一种最简单的语句形式,它的循环方式需引入其他控制方式(如next语句、exit语句)后才能确定。
next [标号][when条件];
NEXT;
执行到NEXT时,无条件中止当前循环,返回循环起点,开始下次循环。
NEXT LOOP标号;
执行到NEXT时,无条件中止当前循环,返回LOOP标号处,开始下次循环。
NEXT LOOP标号 WHEN 条件表达式;
WHEN 条件表达式 是执行NEXT语句的条件,条件表达式的值为真时,执行NEXT语句,进入跳转操作,否则继续向下执行。
EXIT[标号][WHEN条件];
EXIT;
执行到NEXT时,无条件中止当前循环,跳出循环。
EXIT LOOP标号;
执行到NEXT时,无条件中止当前循环,返回LOOP循环语句的结束处,跳出循环。
EXIT LOOP标号 WHEN 条件表达式;
WHEN 条件表达式 是执行NEXT语句的条件,条件表达式的值为真时,执行EXIT语句,跳出循环。
注:EXIT语句与NEXT语句十分相似,都是LOOP语句的内部循环控制语句。
NEXT语句与EXIT 语句的区别:
null语句表示一个空操作,不发生任何行为,目的只是使得程序执行到下一句。
空操作语句的语句格式:NULL;
断言语句主要用于程序仿真、调试时使用,在综合时忽略。
其格式为:ASSERT 条件 [REPORT 输出信息] [SEVERITY 级别]
当执行ASSERT语句时,如果条件为真,则继续向下执行;如果条件为假,则输出错误信息和错误严重程度的级别,在REPORT后面跟的是设计者所写的字符串,通常是说明错误的
原因,并且用双引号“ ”将字符串括起来。在VHDL中,错误的严重程度可分为4个级别,并跟在SEVERITY后面,按严重程度由重到轻分别是:NOTE、WARNING、ERROR、FAILURE。