|
第六章 VHDL并行语句
并行语句包括六种:(见图6-1)
生成语句(Generate Assignments)
元件例化语句(Component Instantiations)
并行信号赋值语句(Concurrent Signal Assignments)(包括 条件信号赋值语句
Selected Signal Assignments)
块语句(Block statements)
进程语句(Process Statements)
并行过程调用语句(Concurrent Procedure Calls)
特点:
1)并行语句是VHDL语言的特点之一,有多种语句格式,
2)各种并行语句在结构体中同步执行,与书写次序无关。
3)在执行中,并行语句之间可以有信息往来,也可以互为独立、互不相关,异步运行。
4)并行语句的内部运行方式又可分为并行执行方式和顺序执行方式。
5)并行语句之间的信息交换是通过信号实现的。
6)各并行语句模块间的运行方式可以是同时运行、同步运行、异步运行等;
7)并行语句对应的硬件电路可以是组合逻辑方式、同步时序逻辑方式和异步时序逻辑方式。
并行语句在结构体中的使用格式
ARCHITECTURE 结构体名 OF 实体名 IS
说明语句;
BEGIN
并行语句;
END ARCHITECTURE 结构体名;
注意:并行语句和顺序语句不是相互独立的语句,它们往往相互包含、互为依从,更应注意的是,同一种语句,在不同的场合表现为不同的方式。
§6.1 进程语句
特点:
1)一个进程是由各种顺序语句构成的。
2)在一个结构体中,如果有多个进程,各个进程之间是并行执行的(一个进程可等效地看成是一种并行语句。它们之间可以依靠信号来传递信息,也可以相互独立工作)。
3)进程是靠敏感信号启动的,使用中通常把各个(全部)输入信号列为该进程的敏感信号。
4)一个进程在综合后可以与一个组合逻辑电路对应,也可以与一个时序逻辑电路对应。一般说来,由IF语句构成的进程与组合逻辑电路对应,而出现WAIT时将会与时序逻辑电路对应。
[例6-1] 由进程、组合逻辑电路构成的带有清零的十进制加一电路。
对应图6.2:AND4与1001对应。
OR2与十进制、清零对应
ADDER是1BIT加4BIT加法器
MUX42是受S0控制的多路开关。
电路没有记忆功能(当输入变化时输出立刻变化)。
[例6-2] 增加WAIT 语句,使例6-1对应的电路具有记忆功能。
程序
图6.3 增加了四个D触发器。
其输出反馈回来作为加法器的输入,可看出,这是一个十进制加法计数器。
[例6-3]含有内部清零的4状态有限状态机。
[例6-4] 3 BIT的三态缓冲电路。硬件结构如图6-5。
§6.2 块语句
特点:
1)块语句本身是并行语句,块内的语句也要求是并行语句(包括进程)。
2)块的设置主要是使程序层次化、清晰化。
3)块中定义的数据类型、数据对象(信号、变量和常量)、子程序等都是局部的。在块嵌套时,外层定义的内容可被内层接受,反之则不然。如果某些块中出现同名数据对象,则遵循相邻优先的原则。
[例6-5] 三重嵌套块程序,对应的电路图见图6-6。
§6.3 并行信号赋值语句
并行信号赋值语句可以理解为一条进程语句的缩写,该进程的敏感信号就是这条并行语句中的全部输入信号(IN)和输入输出信号(INOUT)。因此,只要并行语句中的任何输入信号或输入输出信号发生变化,并行信号赋值语句就立即运行。
一、简单信号赋值语句
格式: 赋值目标 <= 表达式 ;
注意:赋值目标必须是信号,<=两边的数据类型必须一致。
[例6-6] 下面程序中的五条信号赋值语句是并行发生的。仿真过程如下:初试时刻,运行一次结构体中的五条并行语句,并将结果顺延下去。只有当一个或多个输入、输入输出信号发生变化时,对应的并行语句才再被执行一次,以后又一直维持这种状态,直到下次对应的信号再发生改变时为止。
e
f
h
二、条件信号赋值语句
格式: 赋值目标 <= 表达式 WHEN 赋值条件 ELSE --第一句
表达式 WHEN 赋值条件 ELSE --第二句
……
表达式; --最后一句
说明:1)执行该语句的过程是,首先判断第一句中的赋值条件是否满足,若满足时就把对应的表达式的值传递个赋值目标,并且结束该赋值语句(整个语句);否则,判断第二句中的赋值条件,……,如果所有的赋值条件都不满足,就把最后一句表达式的值传递给赋值目标。
2)语句的执行具有优先次序,第一条优先级最高;
3)赋值目标与表达式的值数据类型应相同;
4)赋值条件是布尔量,为真时表示条件满足。
5)各个赋值条件可以互相重叠,甚至完全相同。
[例6-7] 见书
三、选择信号赋值语句
格式: WITH 选择表达式 SELECT --第一句
赋值目标信号 <= 表达式 WHEN 选择值, --第二句
表达式 WHEN 选择值, --第三句
……
表达式 WHEN 选择值(OTHER); --最后一句
说明:1)"敏感量"是选择表达式, 当它发生变化时,该选择信号赋值语句被运行一次;
2)执行该语句的过程是, 首先判断第二句中的选择值是否与选择表达式的值一致,一致时就把对应的表达式的值传递个赋值目标信号,并且结束该赋值语句(整个语句);否则,判断第三句中的选择值是否与选择表达式的值是否一致,……,直到最后一句为止;
2)各个句子中的选择值是互斥的,它们的组合必须覆盖选择表达式的范围;不存在优先次序;
3)赋值目标信号与表达式的值数据类型应相同;
4)选择表达式的值与选择值数据类型应相同;
5)该语句与CASE语句类似,但该语句不能在进程中使用。
[例6-8] 见书,注意并置操作&、OTHERS、“,与 ;”
[例6-9] 见书
§6.4 并行过程调用语句
把过程放在一个并行语句结构中,此时的调用就是并行过程调用(当把过程放在进程中时,调用过程是顺序的)。
[例6-10] 按书讲
PROCEDURE adder(……)…… --定义过程
……
adder(a1,b1,sum1); --并行过程调用,只要敏感量a1、b1发生变化就会调用
adder(a2,b2,sum2); --并行过程调用,只要敏感量a2、b2发生变化就会调用
……
PROCESS(……)
BEGIN
IF ena=1 THEN
adder(a3,b3,sum3);--顺序过程调用
ELSE
adder(a4,b4,sum4);--顺序过程调用
ENDIF;
END PROCESS;
[例6-11]定义一个过程,在一个位矢(例如一个字节)中,检测是否含有“1”,若只含有一个“1”,则输出 ERROR为FALSE,否则输出ERROR为TRUE;注意程序中的RETURN起“结束过程”的作用(不是对LOOP而言的)。
[例6-12]利用上面的过程对不同宽度的位矢进行检测。
§6.5 元件例化语句
作用:将设计好的实体定义为一个元件,并把该元件的端口与当前的设计实体连接起来。
格式: COMPONENT 元件名 IS
GENERIC(类属表);
PORT(端口名表);
END COMPONENT 元件名;
例化名:元件名 PORT MAP(
[端口名=> ] 连接端口名, ……);
说明:1)元件定义语句,对设计实体进行封装,规定其对外的接口界面。类属表列出了端口的数据类型和参数,端口名表列出了对外通信的端口信号名。
2)元件例化语句,例化名指出所用元件的设计标号,元件名指出所要用的器件型号,PORT MAP 是端口映射的意思,端口名是所用元件的端口名字,连接端口名是当前系统与准备接入的元件对应端口相连的通信端口。
3)连接方式分为名字关联和位置关联两种,前者如格式中的情形;后者只需写出连接端口名即可,但要注意位置上的对应关系。(另外还有二者混合关联方式)
[例6-13] 图6-9,定义与门,实现连接,完成z1=a1•b1 + c1•d1 功能。
§6.6 生成语句 July 7
作用:复制一组完全相同的并行元件或设计单元电路结构。
两种格式:
[标号:] FOR 循环变量 IN 取值范围 GENERATE
说明语句;
BEGIN
并行语句;
END GENERATE [标号]
[标号:] IF 条件GENERATE
说明语句;
BEGIN
并行语句;
END GENERATE [标号]
说明:
(1)生成方式—— FOR 形式可以复制多个结构, IF形式一次最多只能复制一个结构。
(2)说明部分——对数据类型、子程序、数据对象 等作局部说明。
(3)并行语句:被复制的基本单元,可以是元件语句、进程语句、块语句、并行过程调用语句、并行信号赋值语句,甚至生成语句(生成语句可以嵌套)。
(4)标号:可有可无,但在生成语句嵌套时有标号更易于阅读。
(5)FOR结构,随循环变量递增(或递减)顺序取值,但最后生成的设计结构是完全并行的(意味着生成语句中的可执行部分由并行语句组成)。
(6)FOR结构,取值范围有两种形式,
表达式 TO 表达式
表达式 DOWNTO 表达式
[例6-14] 生成语句应用举例
注意 i 的取值是0 7
[例6-15] 设计74373器件
器件说明—— 8D锁存器,当G=1时,D数据进入器件,并被锁存
G=0时,D数据不能进入器件,锁存值不变,
当OEN=0时,被锁存的信号由Q端输出,
OEN=1时,Q端为高阻态。
器件符号见图6-11、内部结构见图6-12(锁存器、三态门等)
程序见书 ARCHITECTURE one 用生成语句描述
ARCHITECTURE two 用进程语句描述
|
|