一般来说,结构体中的所有处理语句都是并行处理语句,那么结构体中是否存在顺序语句呢?答案是肯定的。VHDL程序的结构体中既存在并行语句又存在顺序语句。并行语句用来描述一组并发行为,它是并发执行的,与程序的书写顺序无关; 顺序语句是一个接在另一个之后严格按照顺序执行的语句,与程序的书写顺序有关。
5.1进程语句
进程语句包含在结构体中,一个结构体可以有多个进程语句,多个进程语句间是并行的,并可访问结构体或实体中定义的信号。因此进程语句称为并行描述语句。
进程语句结构内部所有语句都是顺序执行的。
进程语句的启动是由process后敏感信号表中所标明的敏感信号来触发进程。
各进程之间的通信是由信号传递的。其语法如下:
标记: process(敏感信号表)
变量说明语句;
begin
一组顺序语句;
end process 标记;
其中,标记为进程语句标号; 敏感信号表是进程语句要读取的所有敏感信号(包括端口信号)的列表。变量说明语句主要包括变量的数据类型说明、子程序说明等。从begin开始到end process结束,是一组顺序执行语句。
下面重点讨论关于进程语句书写结构中的敏感信号表的问题。
1. 进程语句的敏感信号表
所谓敏感信号表,顾名思义,就是用来存放敏感信号的列表。在进程语句中,敏感信号是指那些值发生改变后能够引起进程语句执行的信号。一般来说,敏感信号表中可以使用一个或是多个信号,每当其中的一个或是多个信号值改变时,就在进程内部引起语句执行。敏感信号表列出了进程语句对其敏感的所有信号,所以进程语句最好有一个敏感信号表。当然,敏感信号表部分可以省略,但此时进程语句中要有其他形式的敏感信号激励。
这里需要注意的是: 当进程语句中没有敏感信号表时,进程语句中必须有其他形式的敏感信号激励; 而当进程中有敏感信号表时,进程语句中不允许再显式出现wait、wait for、wait until和wait on中的任何一种敏感信号激励语句,否则编译时将会给出错误信息。
程序5.1描述的是一个简单的D触发器,结构体中只有一个进程语句,敏感信号表列出了时钟信号clk,输入信号d。
【程序5.1】
library ieee;
use ieee.std_logic_1164.all;
entity dff1 is
port(clk,d:in std_logic;
q:out std_logic);
end dff1;
architecture rtl of dff1 is
begin
p1:process(clk,d)
begin
if(clk'event and clk='1')then
q=d;
end if;
end process p1;
end rtl;
在程序5.1中,进程语句标号p1,以process(clk,d)开始,接着是进程语句中的一组顺序处理语句,用来描述d触发器的功能,当时钟上升沿到时,将输入信号d赋值给输出信号q,最后该进程语句以end process p1结束。可以看出,p1进程语句对时钟信号clk、输入信号d敏感,因此当时钟信号发生变化或是输入信号变化时将会启动进程语句。
2. 进程语句的启动
在VHDL中,进程语句有两种工作状态: 等待状态和执行状态。当敏感信号表中的信号没有变化时,进程处于等待状态; 当敏感信号表中的信号有变化时,进程处于执行状态,这时将顺序执行进程中的语句。
因此不难看出,进程语句的启动主要取决于敏感信号表中的信号,只要敏感信号表中的信号发生了变化,进程将启动。进程启动以后,begin和end process间的语句将从上到下顺序执行一次,当最后一个语句执行完后,就返回进程语句的开始,等待下一次敏感信号表中的信号变化。
3. 进程语句的同步
在VHDL程序中,同一个结构体中不仅可以有多个进程存在,而且同一个结构体中的多个进程之间还可以进行同步。一般来说,VHDL中通常采用时钟信号来同步进程,其具体操作方法就是结构体中的几个进程共用同一个时钟信号来进行激励,以启动进程。
进程的同步一般是由敏感信号表来进行控制的,敏感信号表中的信号不发生变化会暂停进程的执行,直到敏感信号发生变化时才会再次启动进程。程序5.2是一个同步进程的例子。由程序5.2产生的shizhong电路符号如图5.1所示。
……