第四章 VHDL的主要描述语句
4.1 VHDL顺序语句
4.2 VHDL并行语句
用VHDL语言进行设计时,按描述语句的执行顺序进行分类,可将VHDL语句分为顺序执行语句(Sequential)和并行执行语句(Parallel)。
4.1 VHDL顺序语句
顺序语句是指完全按照程序中书写的顺序执行各语句,并且在结构层次中前面的语句执行结果会直接影响后面各语句的执行结果。顺序描述语句只能出现在进程或子程序中,用来定义进程或子程序的算法。顺序语句可以用来进行算术运算、逻辑运算、信号和变量的赋值、子程序调用等,还可以进行条件控制和迭代。
注意,这里的顺序是从仿真软件的运行和顺应VHDL语法的编程逻辑思路而言的,其相应的硬件逻辑工作方式未必如此。应该注意区分VHDL语言的软件行为与描述综合后的硬件行为的差异。
VHDL顺序语句主要包括:
·变量赋值语句(Variable Evaluate)
·信号赋值语句(Signal Evaluate)
·WAIT语句
·IF 语句
·CASE 语句
·LOOP 语句
·NEXT 语句
·EXIT 语句
·RETURN 语句
·NULL 语句
·过程调用语句(Procedure Call)
·断言语句(Assert)
·REPORT 语句
4.1.1 变量赋值语句
变量赋值语句语法格式为:
变量赋值目标 := 赋值表达式
例:
VARIABLE s:BIT := ‘0’;
PROCESS(s)
VARIABLE count:INTEGER := ‘0’ --变量说明
BEGIN
count := s+1 --变量赋值
END PROCESS;
4.1.2 信号赋值语句
在VHDL语言中,用符号“<=”为信号赋值。
信号赋值语句的规范书写格式如下:
目的信号量 <= [TRANSPORT][INERTIAL]信号变量表达式;
其中[TRANSPORT]表示传输延迟,[INERTIAL]表示惯性延迟。要求“<=”两边的信号变量类型和位长度应该一致。
例: s <=TRANSPORT t AFTER 10ns; --传输延迟
d <= INERTIAL 2 AFTER 3ns, 1 AFTER 8ns; --惯性延迟
例:s <= a NOR(b AND c); --信号赋值由敏感信号引起
3个敏感量a,b,c中任何一个发生变化,该语句都将被执行。
4.1.3 WAIT语句
WAIT语句在进程中起到与敏感信号一样重要的作用,敏感信号触发进程的执行,WAIT语句同步进程的执行,同步条件由WAIT语句指明。进程在仿真运行中处于执行或挂起两种状态之一。当进程执行到等待语句时,就将被挂起并设置好再次执行的条件。WAIT语句可以设置4种不同的条件:无限等待、时间到、条件满足以及敏感信号量变化。这几类WAIT语句可以混合使用。现分别介绍如下:
(1)WAIT --无限等待语句
这种形式的WAIT语句在关键字“WAIT”后面不带任何信息,是无限等待的情况。
(2)WAIT ON 信号表 --敏感信号等待语句
这种形式的WAIT语句使进程暂停,直到敏感信号表中某个信号值发生变化。WAIT ON语句后面跟着的信号表,在敏感信号表中列出等待语句的敏感信号。当进程处于等待状态时,其中敏感信号发生任何变化都将结束挂起,再次启动进程。
例[A]
PROCESS
BEGIN
y <= a AND b;
WAIT ON a,b;--a,b为敏感信号,由WAIT列出
END PROCESS;
例[B]
PROCESS(a,b)--a,b为敏感信号,由PROCESS列出
BEGIN
y <= a AND b;
END PROCESS;
在例[A]中执行所有语句后,进程将在WAIT语句处被挂起,直到a或b中任何一个信号发生变化,进程才重新开始。例[A]与例[B]是等价的。
需要注意的是,在使用WAIT ON语句的进程中,敏感信号量应写在进程中的WAIT ON语句后面;而在不使用WAIT ON语句的进程中,敏感信号量应在开头的关键词PROCESS后面的敏感信号表中列出。VHDL规定,已列出敏感信号表的进程不能使用任何形式的WAIT语句。
(3)WAIT UNTIL 条件 --条件等待语句
这种形式的WAIT语句使进程暂停,直到预期的条件为真。WAIT UNTIL后面跟的是布尔表达式,在布尔表达式中隐式地建立一个敏感信号量表,当表中任何一个信号量发生变化时,就立即对表达式进行一次测评。如果其结果使表达式返回一个“真”值,则进程脱离挂起状态,继续执行下面的语句。即WAIT UNTIL语句需满足以下条件:
·在条件表达式中所含的信号发生了变化;
·此信号改变后,且满足WAIT UNTIL语句中表达式的条件。
这两个条件缺一不可,且必须按照上述顺序来完成。
WAIT UNTIL语句有以下三种表达方式:
WAIT UNTIL 信号 = VALUE;
WAIT UNTIL 信号’EVENT AND信号 = VALUE;
WAIT UNTIL 信号’STABLE AND信号 = VALUE;
例如:
WAIT UNTIL clock = “1”;
WAIT UNTIL rising_edge(clk);
WAIT UNTIL clk =‘1’AND clk’ EVENT;
WAIT UNTIL NOT clk’ STABLE AND clk= “1”;
一般的,在一个进程中使用了WAIT语句后,综合器会综合产生时序逻辑电路。时序逻辑电路的运行依赖WAIT UNTIL表达式的条件,同时还具有数据存储的功能。
(4)WAIT FOR 时间表达式 --超时等待语句
例如:WAIT FOR 40 ns;
在该语句中,时间表达式为常数40ns,当进程执行到该语句时,将等待40ns,经过40ns之后,进程执行WAIT FOR的后继语句。
例如:WAIT FOR(a*(b+c));
在此语句中,(a*(b+c))为时间表达式,WAIT FOR语句在执行时,首先计算表达式的值,然后将计算结果返回作为该语句的等待时间。
4.1.4 IF语句
在VHDL语言中,IF语句的作用是根据指定的条件来确定语句的执行顺序。IF语句可用于选择器、比较器、编码器、译码器、状态机等的设计,是VHDL语言中最常用的语句之一。IF语句按其书写格式可分为以下3种。
1.门闩控制语句
这类语句书写格式为:
IF 条件 THEN
顺序语句
END IF;
当程序执行到这种门闩控制型IF语句时,首先判断语句中所指定的条件是否成立。如果条件成立,则程序继续执行IF语句中所含的顺序处理语句;如果条件不成立,程序将跳过IF语句所包含的顺序处理语句,而向下执行IF的后继语句。
例: 利用IF语句引入D触发器
LIBRARY IEEE;
USE IEEE. STD_LOGIC_1164.ALL;
ENTITY dff IS
PORT(clk,d:IN STD_LOGIC;
q:OUT STD_LOGIC);
END dff;
ARCHITECTURE rtl OF dff IS
BEGIN
PROCESS (clk)
BEGIN
IF (clk’EVENT AND clk=’1’) THEN
q <= d;
END IF;
END PROCESS;
END rtl;
2.二选一控制语句
这种语句的书写格式为:
TF 条件 THEN
顺序语句
ELSE
顺序语句
END IF;
当IF条件成立时,程序执行THEN和ELSE之间的顺序语句部分;当IF语句的条件得不到满足时,程序执行ELSE和END IF之间的顺序处理语句。即依据IF所指定的条件是否满足,程序可以进行两条不同的执行路径。
例:二选一电路结构体的描述
ARCHITECTURE rtl OF mux2 IS
BEGIN
PROCESS (a,b,s)
BEGIN
IF (s =’1’) THEN
c <= a;
ELSE
c <= b;