网站策划的前景自建站平台
顺序语句和并行语句是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。