5.1 并发执行和顺序执行
①组合逻辑电路:当前输出的值仅取决于当前的输入;
时序逻辑电路:当前输入不仅取决于当前的输入,还与以前的输入有关。时序逻辑电路中通常存在寄存器这类元件,当前的输出结果是由当前输入和电路内部所有寄存器的状态共同决定的。
②VHDL代码是并发执行的。
注意,在PROCESS、FUNCTION和PROCEDURE这些模块内部的代码是顺序执行的,但是它们作为一个整体,与其他模块之间又是并发执行的。
并发代码中可以使用以下各项:
-运算操作符
-WHEN语句(WHEN/ELSE或者WITH/SELECT/WHEN)
-GENERATE语句
-BLOCK语句
5.2 并发代码各项
①运算操作符
②WHEN语句(适用于枚举类型)
注意:WHEN语句适用于枚举类型,且只允许执行一个赋值操作。
两种语法结构:
WHEN/ELSE:
assignment1 WHEN condition1 ELSE --无分号间隔
assignment2 WHEN condition2 ELSE
...
assignmentN-1 WHEN conditionN-1 ELSE
assignmentN;
WITH/
SELECT/
WHEN:
WITH identifier SELECT
assignment1 WHEN value1, --逗号分隔
assignment2 WHEN value2,
...
UNAFFECTED WHEN valueM,
...
assignmentN WHEN OTHERS;
"UNAFFECTED"表示空(不进行任何操作),原来的值保值不变;“OTHERS”表示其余情况下。
例
--------------with WHEN/ELSE--------------
output <= "000" WHEN input = '0' ELSE
"001" WHEN input = '1' ELSE
"010"; --其余情况下output为“010”
----------with WITH/SELECT/WHEN-----------
WITH input SELECT
output <= "000" WHEN '0',
"001" WHEN '1',
UNAFFECTED WHEN OTHERS; --input取其他值时output的值保持不变
另外,WHEN value语句的描述方式包括以下3种:
WHEN value --针对单个值进行判断
WHEN value1|value2|... --针对多个值进行判断
WHEN value1 to value2 --针对取值范围进行判断
③GENERATE 语句(枚举型的循环操作)
具体语法结构有两种:
FOR/GENERATE:
label: FOR identifier IN range GENERATE
(concurrent assignments) --并发描述语句
END GENERATE;
注意,该语句用于循环执行某项操作,故identifier的range范围的上界和下界都必须是静态的。
IF/GENERATE:
label: IF condition GENERATE
(concurrent assignments) --不允许使用ELSE
END GENERATE;
④块语句(
BLOCK)
简单块(simple BLOCK):仅仅是一种对原有代码进行 区域分割的方式,通过将一系列的并发描述语句放在一个simple BLOCLK中,目的是为了增强整个代码的可读性和可维护型。其语法结构如下:
label: BLOCK
[declarative part] --声明部分
BEGIN
(concurrent statement) --并行陈述
END BLOCK label;
卫式块(guarded
BLOCK):相比于simple
BLOCK,这种特殊的
BLOCK多了一个卫式表达式。只有当卫式表达式为真时,在guarded
BLOCK中前面有关键词
GUARDED的语句才能执行。语法结构如下:
label: BLOCK(卫式表达式)
[声明部分]
BEGIN
(卫式语句和其他并发描述语句) --含有关键字GUARDED
END BLOCK label;
例
b1: BLOCK(clk = '1')
BEGIN
q <= GUARDED d; --关键字GUARDED
END BLOCK b1;