5.5 进程语句结构

29
5.5 进进进进进进 进进进进进进 进进进进进进进 进进进进 进进进 一,体一 进进进进进进进进 VHDL 进进进进进进进进进 进进进进进 进进进进 进进进进进进进进 进进进进进进进进 进进进进进进进进 。体, 进进进进signal 进进进 进进进进进 进进进进进进进进 ),一 体。

Upload: auryon

Post on 15-Mar-2016

116 views

Category:

Documents


3 download

DESCRIPTION

5.5 进程语句结构. 进程语句 作为一个独立的结构,在结构体中以一个完整的结构存在,是 VHDL 语言中描述能力最强,使用最多的语句结构。进程语句是结构体的有机组成部分,各个进程之间可以通过信号( signal )通信,共同组成一个功能强大的结构体。. 在一个结构体中,允许放置任意多个进程语句结构,而每一进程的内部是由一系列顺序语句来构成的。 注: 在 VHDL 中,所谓顺序仅仅是指语句按序执行上的顺序性,但这并不意味着 process 语句结构在综合后所对应的硬件逻辑行为也具有相同的顺序性。. 5.5.1 Process 语句的结构. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 5.5  进程语句结构

5.5 进程语句结构 进程语句作为一个独立的结构,在结构体中以一个完整的结构存在,是 VHDL 语言中描述能力最强,使用最多的语句结构。进程语句是结构体的有机组成部分,各个进程之间可以通过信号( signal )通信,共同组成一个功能强大的结构体。

Page 2: 5.5  进程语句结构

在一个结构体中,允许放置任意多个进程语句结构,而每一进程的内部是由一系列顺序语句来构成的。 注:在 VHDL 中,所谓顺序仅仅是指语句按序执行上的顺序性,但这并不意味着 process 语句结构在综合后所对应的硬件逻辑行为也具有相同的顺序性。

Page 3: 5.5  进程语句结构

5.5.1 Process 语句的结构 [进程名:] process ( 信号1,信号2… ..

) [ 进程说明语句; ] begin 进程内顺序描述语句; END process ; 进程名是可选项,如果有多个进程,则以进程名加以区别。

Page 4: 5.5  进程语句结构

Process ( 信号1,信号2……… ) 括号中的信号可以是在结构体中定义的信号,也可以是在实体说明中定义的端口(但只能是输入端口、双向端口或 Buffer 类型端口)。这些信号是敏感量,它们组成敏感表,进程的启动是通过敏感表中敏感量的变化激励的,也即当且仅当敏感表中的敏感量有变化时进程才能启动。 进程说明语句是可选项,主要用途是定义进程中将要用到的中间变量或常量,但此处只能定义“变量”,而不能定义“信号” 。

Page 5: 5.5  进程语句结构

ENTITY mux21 isport (d0,d1,sel : in bit; q : out bit) ; end mux21 ; Architecture connect of mux21 is Begin Cale : process (d0,d1,sel) Variable: tmp1,tmp2,tmp3:bit; Begin Tmp1:=d0 and sel ; Tmp2:=d1 and (not sel); Tmp 3:=tmp1 or tmp2; Q<=tmp3 End process cale; End connect; 例中 tmp1,tmp2 和 tmp3 是变量,只能在进程( process )或子程序中定义,在进程或子程序之外是不可见的。

Page 6: 5.5  进程语句结构

5.5.2 process 组成 Process 语句结构由三部分组成,进程说明部分、顺序描述语句和敏感信号参数表。 ( 1 )进程说明部分主要定义一些局部量,包括数据类型、常数、变量、子程度等。( 2 )顺序描述语句部分可分为赋值语句、进程启动语句、子程序调用语句、顺序描述语句和进程跳出语句等。( 3 )多数 VHDL 综合器要求敏感信号表必须列出本进程所有输入信号名。

Page 7: 5.5  进程语句结构

1 、 process 为一无限循环语句 在同一结构体中的任一进程是一个独立的无限循环程序结构,但进程中却不必放置返回语句,它的返回是自动的。 进程只有两种运行状态,即执行状态和等待状态。进程是否进入执行状态,取决于是否满足特定的条件,即敏感信号是否发生变化。进入执行状态后,遇到 end process 语句后即停止执行,自动返回到起始语句 process ,进入再次等待的状态,直到敏感信号再次发生变化。

Page 8: 5.5  进程语句结构

2 、进程( process )中语句的顺序性 在系统仿真时, process 结构中的语句是按顺序一条一条向下执行的,因此在 process 语句中语句的描述具有顺序性。如下面的语句在进程中是按照顺序从上向下执行的:Tmp1:=d0 and sel ; Tmp2:=d1 and (not sel);

Tmp 3:=tmp1 or tmp2 ; Q<=tmp3 ;

Process 中的顺序语句的执行方式与通常的软件语言中的语句的顺序执行方式有很大不同。

Page 9: 5.5  进程语句结构

3 、 Process 语句的启动 在敏感表中的任意一个敏感量发生变化,则启动 process 语句将从上到下逐句执行一遍。当执行完成就返回到 process 语句并悬挂在该语句处,等待敏感量的再次变化。

Page 10: 5.5  进程语句结构

4 、进程语句本身是并行语句 虽然进程语句引导的属于顺序语句,但同一结构体中的不同进程是并行运行的,或者说是根据相应的敏感信号独立运行的。

5 、信号是多个进程间的通信线 结构体中多个进程是并行同步运行的,进程之间的通信是通过信号来实现的。相对于结构体来说,信号具有全局特性,它是进程间进行并行联系的重要途径。

Page 11: 5.5  进程语句结构

6 、一个进程中只允许描述对应于一个时钟信号的同步时序逻辑 时序电路必须由进程中的顺序语句描述,而此顺序语句必须由不完全的条件语句构成。 在同一进程中可顺序放置多个条件语句,但是只能放置一个含有时钟边沿检测语句的条件语句。

Page 12: 5.5  进程语句结构

Entity mul isPort (a, b, c, selx, sely : in bit; data_out : out bit);End mul;Architecture ex of mul is signal temp : bit;Beginp_a: process (a, b, selx ) begin if (selx=‘0’) then temp<=a; else temp <= b; end if; end process p_a;p_b: process ( temp, c, sely ) begin if (sely=‘0’) then data_out<= temp; else data_out<= c; end if; end process p_b;End ex;

两个进程: p_a和 p_b,它们的敏感信号分别为 a 、 b 、selx 和 temp 、 c 、 sely 。除 temp 外,两个进程完全独立运行。 信号 temp 是连接两个进程的通信线,两个进程分别综合成两个多路选择器。

Page 13: 5.5  进程语句结构

9.2 VHDL 并行语句 并行语句是同时执行的,即语句和书写的顺序无关。 每一并行语句内部的语句运行方式可以有两种不同的方式,即并行执行方式和顺序执行方式。

Page 14: 5.5  进程语句结构

并行信号赋值语句 进程语句 块语句 条件信号赋值语句 元件例化语句 生成语句 并行过程调用语句

结构体中的七种并行语句

Page 15: 5.5  进程语句结构

9.2.1 并行信号赋值语句 简单信号赋值语句 条件信号赋值语句 选择信号赋值语句

1 、简单信号赋值语句语句格式:赋值目标 <= 表达式

Page 16: 5.5  进程语句结构

2、条件信号赋值语句语句格式: 赋值目标〈 = 表达式 1 WHEN 条件 1 ELSE  表达式 2 WHEN 条件 2 ELSE  表达式 3 WHEN 条件 3 ELSE

…  表达式 n ;   从书写格式可以看出条件信号带入语句虽然有时可以写的很长,其实条件信号带入语句实际上是一条语句,因此只有最后一个表达式有分号,其它的表达式后面没有标点符号;条件信号带入语句中条件判断语句 when… else 是含有优先级的,在多个条件中只要条件 1 成立,不管其它条件是否成立,则赋值语句的结果总是表达式 1 ,只有表达式 1 不成立时才会判断条件 2 ,其它判断遵循同样的规律。

Page 17: 5.5  进程语句结构

examplelibrary ieee;use ieee.std_logic_1164.all;entity condsig is

port (input0, input1, sel : in std_logic;      output : out std_logic);end condsig;architecture maxpld of condsig isbegin

output <= input0 when sel = '0' else input1;end maxpld;

Page 18: 5.5  进程语句结构

library ieee; use ieee.std_logic_1164.all;entity condsigm isPort ( high, mid, low : in std_logic;

q : out integer );end condsigm;architecture maxpld of condsigm isbegin q <=3 when high = '1' else -- when high

2 when mid = '1' else -- when mid but not high1 when low = '1' else -- when low but not mid or high0; -- when not low, mid, or high

end maxpld;条件 high=’1’ 的有先级最高,其次是 mid 。

输入 输出High mid Low Q

‘1’ ‘X’ ‘X’ 3

‘0’ ‘1’ ‘X’ 2‘0’ ‘0’ ‘1’ 1

Page 19: 5.5  进程语句结构

3 、选择信号代入语句 语句格式:With 条件(条件表达式) Select

目标信号〈 = 表达式 1 When 条件 1 ,表达式 2 When 条件 2 , 

      ……表达式 n When 条件 n ,[ 表达式 n+1 When Others];  由于使用标准数据 std_logic 时,条件一般很难覆盖全部的条件数据范围,因此一般情况下在最后都加一条语句:表达式 n+1 When Others ;

Page 20: 5.5  进程语句结构

library ieee;use ieee.std_logic_1164.all;entity selsig is

port (d0, d1, d2, d3 : in std_logic; s : in integer range 0 to 3; output : out std_logic);

end selsig;architecture maxpld of selsig isbegin with s select -- 产生一个四选一的多路选择器

output <= d0 when 0,d1 when 1,d2 when 2,d3 when 3;

end maxpld;

Page 21: 5.5  进程语句结构

9.2.2 块语句   当一个构造体所描述的电路比较复杂时,可以通过块结构( BLOCK )将构造体划分为几个模块,每个模块( BLOCK 模块)都可以有独立的结构,减小了程序的复杂性,同时使构造体的结构清晰易懂。 采用 BLOCK 语句描述局部电路的书写格式如下所示:  [ 块结构名: ] BLOCK 块内定义语句; ----- 定义 BLOCK 内部使用的信号或常数的名称及类型 Begin Block块内的并行描述语句; END BLOCK [块结构名 ] ;

Page 22: 5.5  进程语句结构

“块结构名”不是必须的,但如有多个块存在,用块结构名将各个块加以区分可以使程序结构清晰,块结构以 BLOCK标识符引导。 BLOCK块的具体描述内容以“ Begin”开始,以“ END BLOCK [块结构名 ]” 结束。“块内定义语句”部分主要用来定义将要在块内使用的信号,以这种方式定义的信号使用范围仅限于该块内,块外是不可见的,因此不同的块中定义的信号使用相同的名称不会冲突。

Block 语句本身属于并行语句, Block 语句所包含的语句也是并行语句。

Page 23: 5.5  进程语句结构

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity tblock is port (a,b,c: in std_logic_vector(3 downto 0); d,e,f,g: out std_logic_vector(7 downto 0) );end tblock;Architecture ablock of tblock is signal ma:std_logic_vector(7 downto 0); beginb1: block

signal ma:std_logic_vector(7 downto 0);begin

ma<=a+b; d<=ma-c;b2: block signal ma:std_logic_vector(7 downto 0);

beginma<=a*b; e<=ma*c; f<=b1.ma*c ;

end block b2; end block b1; ma<=a-b; g<=ma*c;end ablock;

“b2块”是“ b1块”的子块,在 b1 中定义的信号 ma 在 b2中被同名的信号 ma覆盖,因此在 b2块中使用的 ma 只能是 b2 中定义的 ma ,如果想在 b2块中使用 b1 中定义的ma ,则需要使用块名 b1 引导,如: f<=b1.ma * c; 使用块名 b1 引导后即可在块 b2中正确引用块 b1 定义的信号ma 。

Page 24: 5.5  进程语句结构

• Block块中的语句描述仅仅是为了使结构体中的结构清楚,所以在构造体中有无 BLOCK 结构语句,结构体的功能是一样的。

• 在综合过程中, VHDL 综合器将忽略所有的块语句!

Page 25: 5.5  进程语句结构

9.2.4 元件例化语句 元件例化就是引入一种连接关系,将预先设计好的设计实体定义为一个元件,然后利用特定的语句将此元件与当前设计实体中的端口相连接,从而为当前设计实体引入一个新的低层的设计单元。 元件例化语句由两部分组成,前一部分是对一个现成的设计实体定义为一个元件,第二部分是将此元件输入、输出与当前设计实体中端口或信号的连接说明。其格式如下: 第一部分: Component 元件名

Generic ( 类属表 ) port ( 端口名表 ) ;End component ;第二部分:例化名: 元件名 port map( [ 端口名 => ]连接端口名,… );

Page 26: 5.5  进程语句结构

第一部分: Component 元件名

Generic ( 类属表 ) port ( 端口名表 ) ;End component ;第二部分:例化名: 元件名 port map( [ 端口名 => ]连接端口名,… );

第一部分语句是元件定义语句,相当于对一个现成的设计实体进行封装,使其只留出对外的接口界面。就象一个集成芯片只留几个引脚在芯片外围一样,它的类属表可列出端口的数据类型和参数。 元件例化语句中所定义的元件端口名与当前设计实体的连接端口名的接口有两种表达方式。一种是名字关联方式,在这种关联方式下,例化元件的端口名和关联(连接)符号“ =>” 两者都必须存在。这种关联,实体信号与元件端口名的关联明确指出,因此在 port map 语句中的位置可以是任意的 。 另一种是位置关联方式。在这种方式下,元件端口名和关联连接符号都可以省略,但要求代入到元件的信号在元件中的排列方式与例化元件的端口定义在前后位置上按要求一一对应。

Page 27: 5.5  进程语句结构

9.2.5 生成语句 生成语句具有复制作用,用来产生多个相同的结构,它有

For ……generate 和 if……generate 两种形式。其格式如下:[标号: ] for 变量 in 取值范围 generate说明部分;并行语句

End generate [标号 ] [标号: ] if 条件 generate说明部分并行语句

End generate [标号 ]

Page 28: 5.5  进程语句结构

对于 For 语句结构,主要用来描述设计中的一些有规律的单元,其生成参数、取值范围的含义及运行方式与 loop 语句十分相似。需注意从软件运行的角度看, for 语句生成参数(循环变量)虽然有顺序性,但最终结果是完全并行的。 生成参数(循环变量)是一个局部变量,在使用时不需要预先声明,它会根据取值范围自动递增或递减。如: For L in 1 to 5 generate -------------递增方式 For L in 5 downto 1 generate -------------递减方式

Page 29: 5.5  进程语句结构

利用 For …generate 实现多个元件的匹配Component compPort( x: in std_logic;

y: out std_logic);End component;Signal a, b: std_logic_vector(0 to 7);m1: for i in a’range generateU1: comp port map(x=>a(i);y=>b(i));End generate m1;