一、前言
并行语句是指能作为单独语句直接出现在结构体中的描述语句,所有的并行语句都是并发执行的,VHDL结构体中的并行语句主要有八种:
- 进程语句
- 块语句
- 并行信号赋值语句
- 并行过程调用语句
- 并行断言语句
- 类属语句
- 元件例化语句
- 生成语句
并行语句:
- 所有并行语句在结构体中的执行都是同时进行的,即他们的执行顺序与语句书写顺序无关
- 并行语句之间通过信号交换信息
- 并行是指并行语句之间没有执行顺序的先后之分,但不意味着并行语句内部也一定是并行执行的。
二、进程语句
2.1 进程的工作原理
- 当进程的敏感信号参数表中的任一敏感信号发生变化时,进程被激活,开始从上而下按顺序执行进程中的顺序语句;当最后一个语句执行完毕,进程挂起,等待下一次敏感信号的变化。从系统上电开始,这个过程就周而复始的进行。
- 虽然进程内部是顺序执行的,但进程与进程之间是并行关系。
2.2 进程语句格式(PROCESS)
PROCESS语句结构的一般表达格式如下:
[进程标号: ] PROCESS [ ( 敏感信号参数表) ] [IS]
[进程说明部分]
BEGIN
顺序描述语句
END PROCESS [进程标号];
一个结构体中可以有多个进程语句,同时并行执行。进程之间的信息传递是通过信号来完成的。
注:信号的上升沿和下降沿
- 上升沿
信号'event and 信号= '1'
rising_edge(信号)
- 下降沿
信号'event and 信号= '0'
falling_edge(信号)
2.3 进程语句要点
- 进程语句本身是并行语句,它为一无限循环语句,只有两种状态:执行和等待。
- 同一进程中的所有语句都是按照顺序来执行的。
- 进程必须由敏感信号的变化来启动或具有一个显式的wait语句来激励
- 使用了敏感表的进程不必再含有等待语句
- 信号是多个进程间的通信线,是进程间进行联系的重要途径
- 在任一进程的说明部分不能定义信号和共享变量
- 进程的敏感信号列表应保持完整,否则可能导致综合前后的仿真结果不一致。
- 一个进程中只允许描述对应于一个时钟信号的同步时序逻辑。
- 一个进程中可以放置多个条件语句,但只允许一个含有时钟边沿检测语句的条件语句
2.4 案例
以二输入与门为例:
真值表:
程序:
library ieee;
use ieee.std_logic_1164.all;
entity example is
port ( a : in std_logic;
b : in std_logic;
y : out std_logic);
end example;
architecture behave of example is
begin
p1:process(a,b)
variable comb : std_logic_vector (1downto 0);
begin
comb:= a&b;
case comb is
when "00" =>y<='0';
when "10" =>y<='0';
when "01" =>y<='0';
when "11" =>y<='1';
when others =>y<='X';
end case;
end process p1;
end behave;
三、块语句结构(BLOCK)
3.1 块语句格式
块的应用就是将一个结构体分成若干个小的功能块,这种方式的划分只是形式上进行了改变,并不改变功能,主要目的是改善程序的可读性。
块标号 : BLOCK
接口说明
类属说明
BEGIN
并行语句
END BLOCK 块标号 ;
3.2 块语句要点
- 块标号是必须的。
- 接口说明和类属说明部分是对BLOCK的接口设置及外界信号的连接状况加以说明。
- 块中定义的所有数据类型、数据对象及子程序等都是局部的,在多 层嵌套中内层块的所有定义对外层块都是不可见的。
四、并行信号赋值语句
4.1 常用的赋值语句格式
并发信号赋值语句的格式:赋值目标 <= 表达式
,结构体中的多条并发赋值语句是并行执行的。
4.2 条件信号赋值语句
条件信号赋值语句的表达方式如下:
赋值目标 <= 表达式1 WHEN 赋值条件1 ELSE
表达式2 WHEN 赋值条件2 ELSE
...
表达式n ;
注:有优先级之分
4.3 选择信号赋值语句
选择信号赋值语句的格式如下:
WITH 选择表达式 SELECT
赋值目标信号 <= 表达式1 WHEN 选择值1,
表达式2 WHEN 选择值2,
...
表达式n WHEN 选择值n;
选择信号赋值语句中也有敏感量,即关键字WITH旁边的选择信号表达式,每当选择表达式的值发生变化时,就启动此语句对各子句的选择值同时进行测试对比,没有优先级之分,若有满足条件的子句时,就将此子句表达式中的值赋给赋值目标信号。若选择条件不覆盖全部可能,编译会出错,因此,最后加”when others”。
注:
- 没有优先级之分
- 选择值需要互斥且覆盖所有可能性
例:以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
with s select
y<=a when "00",
b when "01",
c when "10",
d when "11",
"0000" when others;
end behave;
五、并行过程调用语句
并行过程调用语句常用于获得被调用过程的多个并行工作的复制电路,主要用于结构体的并行处理语句或块语句中。并行过程调用语句书写格式非常简单:过程名 (参数表);
procedure 过程名(参数说明)
begin
功能描述语句
end procedure 过程名;
过程名 (参数表);
注:
- 并行调用语句是一个完整的语句,后面要加分号;
- 并行过程调用的过程的参数必须是常量或者信号,而不能是变量;
- 并行过程调用语句应在过程名后的括号里带有in、out或者inout参数类型,反之相当于没有wait语句;
- 返回值必须通过过程中所定义的输出参数带回。
六、并行断言语句
Assert语句主要用于程序仿真、测试中的人机对话,给出一系列的警告或者错误信息。
书写格式为:
assert 条件[report 输出信息][severity 级别];
- 如果条件为真,则继续执行另一个语句;反之,则给出错误信息和错误严重程度的级别。
- VHDL语言的错误严重级别分为4个级别,failure、error、warning、note。
七、类属(Generic)语句
Generic 语句常用于不同层次之间的信息传递,例如在数据类型说明上用于位矢量长度、数组的位长以及器件的延时时间等参数的传递。
该语句主要用于行为描述方式,所涉及的数据除整数类型以外的数据类型不能进行逻辑综合。
使用generic语句易于使器件模块化和通用化。例如,在描述二输入与门的时候,输入与的上升沿和下降沿等参数不一致,为了简化设计,通常设计一个通用的二输入与门的模块化程序。该模块中的某些参数是待定的,在仿真或者逻辑综合的时候的,只要用generic语句将待定参数初始化后,就可以实现各种二输入与门的仿真或者逻辑综合。
八、元件例化语句
元件例化语句用来指明结构体需要调用的元件、单元和模块等,并把调用来的元件、单元和模块正确的嵌入到高一层的结构体描述中。
其基本语法格式为:
COMPONENT 元件名
GENERIC (类属表);
PORT (端口名表);
END COMPONENT 文件名;
例化名 :元件名 [generic map (参数名 => 参数值,..]
port map([ 端口名 => ] 连接端口名,... );
九、生成(Generate)语句
生成语句的主要功能是能够进行复制,简化有规则设计结构的逻辑描述。
生成语句的语句格式有如下两种形式:for 和 IF
9.1 for生成语句
[标号:] For 循环变量 IN 取值范围 Generate
并行语句
End Generate [标号] ;
对于for语句的结构,主要用来描述设计中的一些有规律的单元结构。
**生成参数(循环变量)**是自动产生的,它是一个局部变量,根据取值范围自动递增或递减。取值范围的语句格式,有两种形式:
格式 | 意义 |
---|---|
表达式 TO 表达式 ; | 递增方式,如 1 TO 5 |
表达式 DOWNTO 表达式 ; | 递减方式,如 5 DOWNTO 1 |
其中的表达式必须是整数。
9.2 if生成语句
[标号:] IF 条件 Generate
并行语句
End Generate [标号] ;
对于if 语句的结构,主要用来描述设计中不规则的单元结构,如某些边界条件的特殊性。该语句中,若条件为真,则执行生成语句中的并行语句,若为假则不执行该语句。
9.3 生成格式的组成
两种格式都由四部分组成:
- 生成方式:有for和if语句结构,规定并行语句的复制方式
- 说明部分:对数据类型和数据对象等进行一些说明
- 并行语句:是复制的基本单元
- 标号:标号并不是必须的,但在嵌套式生成语句中是非常重要的