290 likes | 515 Views
5.5 进程语句结构. 进程语句 作为一个独立的结构,在结构体中以一个完整的结构存在,是 VHDL 语言中描述能力最强,使用最多的语句结构。进程语句是结构体的有机组成部分,各个进程之间可以通过信号( signal )通信,共同组成一个功能强大的结构体。. 在一个结构体中,允许放置任意多个进程语句结构,而每一进程的内部是由一系列顺序语句来构成的。 注: 在 VHDL 中,所谓顺序仅仅是指语句按序执行上的顺序性,但这并不意味着 process 语句结构在综合后所对应的硬件逻辑行为也具有相同的顺序性。. 5.5.1 Process 语句的结构.
E N D
5.5 进程语句结构 进程语句作为一个独立的结构,在结构体中以一个完整的结构存在,是VHDL语言中描述能力最强,使用最多的语句结构。进程语句是结构体的有机组成部分,各个进程之间可以通过信号(signal)通信,共同组成一个功能强大的结构体。
在一个结构体中,允许放置任意多个进程语句结构,而每一进程的内部是由一系列顺序语句来构成的。在一个结构体中,允许放置任意多个进程语句结构,而每一进程的内部是由一系列顺序语句来构成的。 注:在VHDL中,所谓顺序仅仅是指语句按序执行上的顺序性,但这并不意味着process语句结构在综合后所对应的硬件逻辑行为也具有相同的顺序性。
5.5.1Process语句的结构 [进程名:]process (信号1,信号2….. ) [进程说明语句;] begin 进程内顺序描述语句; END process; 进程名是可选项,如果有多个进程,则以进程名加以区别。
Process (信号1,信号2………)括号中的信号可以是在结构体中定义的信号,也可以是在实体说明中定义的端口(但只能是输入端口、双向端口或Buffer类型端口)。这些信号是敏感量,它们组成敏感表,进程的启动是通过敏感表中敏感量的变化激励的,也即当且仅当敏感表中的敏感量有变化时进程才能启动。 进程说明语句是可选项,主要用途是定义进程中将要用到的中间变量或常量,但此处只能定义“变量”,而不能定义“信号” 。
ENTITY mux21 is port (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)或子程序中定义,在进程或子程序之外是不可见的。
5.5.2 process 组成 Process语句结构由三部分组成,进程说明部分、顺序描述语句和敏感信号参数表。 (1)进程说明部分主要定义一些局部量,包括数据类型、常数、变量、子程度等。 (2)顺序描述语句部分可分为赋值语句、进程启动语句、子程序调用语句、顺序描述语句和进程跳出语句等。 (3)多数VHDL综合器要求敏感信号表必须列出本进程所有输入信号名。
1、process为一无限循环语句 在同一结构体中的任一进程是一个独立的无限循环程序结构,但进程中却不必放置返回语句,它的返回是自动的。 进程只有两种运行状态,即执行状态和等待状态。进程是否进入执行状态,取决于是否满足特定的条件,即敏感信号是否发生变化。进入执行状态后,遇到end process 语句后即停止执行,自动返回到起始语句process,进入再次等待的状态,直到敏感信号再次发生变化。
2、进程(process)中语句的顺序性 Process 中的顺序语句的执行方式与通常的软件语言中的语句的顺序执行方式有很大不同。 在系统仿真时,process结构中的语句是按顺序一条一条向下执行的,因此在process语句中语句的描述具有顺序性。如下面的语句在进程中是按照顺序从上向下执行的: Tmp1:=d0 and sel; Tmp2:=d1 and (not sel); Tmp 3:=tmp1 or tmp2; Q<=tmp3;
3、Process语句的启动 在敏感表中的任意一个敏感量发生变化,则启动process 语句将从上到下逐句执行一遍。当执行完成就返回到process语句并悬挂在该语句处,等待敏感量的再次变化。
4、进程语句本身是并行语句 虽然进程语句引导的属于顺序语句,但同一结构体中的不同进程是并行运行的,或者说是根据相应的敏感信号独立运行的。 5、信号是多个进程间的通信线 结构体中多个进程是并行同步运行的,进程之间的通信是通过信号来实现的。相对于结构体来说,信号具有全局特性,它是进程间进行并行联系的重要途径。
6、一个进程中只允许描述对应于一个时钟信号的同步时序逻辑6、一个进程中只允许描述对应于一个时钟信号的同步时序逻辑 时序电路必须由进程中的顺序语句描述,而此顺序语句必须由不完全的条件语句构成。 在同一进程中可顺序放置多个条件语句,但是只能放置一个含有时钟边沿检测语句的条件语句。
两个进程:p_a和p_b,它们的敏感信号分别为a、b、selx和temp、c、sely。除temp外,两个进程完全独立运行。两个进程:p_a和p_b,它们的敏感信号分别为a、b、selx和temp、c、sely。除temp外,两个进程完全独立运行。 信号temp是连接两个进程的通信线,两个进程分别综合成两个多路选择器。 Entity mul is Port (a, b, c, selx, sely : in bit; data_out : out bit); End mul; Architecture ex of mul is signal temp : bit; Begin p_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;
9.2 VHDL并行语句 并行语句是同时执行的,即语句和书写的顺序无关。 每一并行语句内部的语句运行方式可以有两种不同的方式,即并行执行方式和顺序执行方式。
结构体中的七种并行语句 • 并行信号赋值语句 • 进程语句 • 块语句 • 条件信号赋值语句 • 元件例化语句 • 生成语句 • 并行过程调用语句
9.2.1 并行信号赋值语句 • 简单信号赋值语句 • 条件信号赋值语句 • 选择信号赋值语句 1、简单信号赋值语句 语句格式: 赋值目标<=表达式
2、条件信号赋值语句 语句格式: 赋值目标〈=表达式1 WHEN 条件1 ELSE 表达式2 WHEN 条件2 ELSE 表达式3 WHEN 条件3 ELSE … 表达式n; 从书写格式可以看出条件信号带入语句虽然有时可以写的很长,其实条件信号带入语句实际上是一条语句,因此只有最后一个表达式有分号,其它的表达式后面没有标点符号;条件信号带入语句中条件判断语句when… else是含有优先级的,在多个条件中只要条件1成立,不管其它条件是否成立,则赋值语句的结果总是表达式1,只有表达式1不成立时才会判断条件2,其它判断遵循同样的规律。
example library 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 is begin output <= input0 when sel = '0' else input1; end maxpld;
library ieee; use ieee.std_logic_1164.all; entity condsigm is Port ( high, mid, low : in std_logic; q : out integer ); end condsigm; architecture maxpld of condsigm is begin q <=3 when high = '1' else -- when high 2 when mid = '1' else -- when mid but not high 1 when low = '1' else -- when low but not mid or high 0; -- when not low, mid, or high end maxpld; 条件high=’1’的有先级最高,其次是mid。
3、选择信号代入语句 语句格式: With 条件(条件表达式) Select 目标信号〈= 表达式 1 When 条件1, 表达式 2 When 条件2, …… 表达式 n When 条件n, [表达式 n+1 When Others]; 由于使用标准数据std_logic时,条件一般很难覆盖全部的条件数据范围,因此一般情况下在最后都加一条语句:表达式 n+1 When Others ;
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 is begin with s select -- 产生一个四选一的多路选择器 output <= d0 when 0, d1 when 1, d2 when 2, d3 when 3; end maxpld;
9.2.2 块语句 当一个构造体所描述的电路比较复杂时,可以通过块结构(BLOCK)将构造体划分为几个模块,每个模块(BLOCK 模块)都可以有独立的结构,减小了程序的复杂性,同时使构造体的结构清晰易懂。 采用BLOCK语句描述局部电路的书写格式如下所示: [ 块结构名:] BLOCK 块内定义语句;-----定义BLOCK内部使用的信号或常数的名称及类型 Begin Block块内的并行描述语句; END BLOCK [块结构名] ;
“块结构名”不是必须的,但如有多个块存在,用块结构名将各个块加以区分可以使程序结构清晰,块结构以BLOCK标识符引导。BLOCK块的具体描述内容以“Begin”开始,以“END BLOCK [块结构名]”结束。“块内定义语句”部分主要用来定义将要在块内使用的信号,以这种方式定义的信号使用范围仅限于该块内,块外是不可见的,因此不同的块中定义的信号使用相同的名称不会冲突。 • Block语句本身属于并行语句, Block语句所包含的语句也是并行语句。
“b2块”是“b1块”的子块,在b1中定义的信号ma在b2中被同名的信号ma覆盖,因此在b2块中使用的ma只能是b2中定义的ma,如果想在b2块中使用b1中定义的ma,则需要使用块名b1引导,如:f<=b1.ma * c;使用块名b1引导后即可在块b2中正确引用块b1定义的信号ma。 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); begin b1: 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); begin ma<=a*b; e<=ma*c; f<=b1.ma*c; end block b2; end block b1; ma<=a-b; g<=ma*c; end ablock;
Block块中的语句描述仅仅是为了使结构体中的结构清楚,所以在构造体中有无BLOCK结构语句,结构体的功能是一样的。 • 在综合过程中,VHDL综合器将忽略所有的块语句!
9.2.4 元件例化语句 • 元件例化就是引入一种连接关系,将预先设计好的设计实体定义为一个元件,然后利用特定的语句将此元件与当前设计实体中的端口相连接,从而为当前设计实体引入一个新的低层的设计单元。 • 元件例化语句由两部分组成,前一部分是对一个现成的设计实体定义为一个元件,第二部分是将此元件输入、输出与当前设计实体中端口或信号的连接说明。其格式如下: 第一部分: Component 元件名 Generic (类属表) port (端口名表); End component; 第二部分: 例化名: 元件名 port map( [端口名=> ]连接端口名,…);
第一部分: Component 元件名 Generic (类属表) port (端口名表); End component; 第二部分: 例化名: 元件名 port map( [端口名=> ]连接端口名,…); • 第一部分语句是元件定义语句,相当于对一个现成的设计实体进行封装,使其只留出对外的接口界面。就象一个集成芯片只留几个引脚在芯片外围一样,它的类属表可列出端口的数据类型和参数。 • 元件例化语句中所定义的元件端口名与当前设计实体的连接端口名的接口有两种表达方式。一种是名字关联方式,在这种关联方式下,例化元件的端口名和关联(连接)符号“=>”两者都必须存在。这种关联,实体信号与元件端口名的关联明确指出,因此在port map 语句中的位置可以是任意的 。 • 另一种是位置关联方式。在这种方式下,元件端口名和关联连接符号都可以省略,但要求代入到元件的信号在元件中的排列方式与例化元件的端口定义在前后位置上按要求一一对应。
9.2.5 生成语句 • 生成语句具有复制作用,用来产生多个相同的结构,它有For ……generate和if……generate 两种形式。其格式如下: [标号:] for 变量 in 取值范围 generate 说明部分; 并行语句 End generate [标号] [标号:] if 条件 generate 说明部分 并行语句 End generate [标号]
对于For 语句结构,主要用来描述设计中的一些有规律的单元,其生成参数、取值范围的含义及运行方式与loop语句十分相似。需注意从软件运行的角度看,for语句生成参数(循环变量)虽然有顺序性,但最终结果是完全并行的。 • 生成参数(循环变量)是一个局部变量,在使用时不需要预先声明,它会根据取值范围自动递增或递减。如: • For L in 1 to 5 generate -------------递增方式 • For L in 5 downto 1 generate -------------递减方式
利用For …generate实现多个元件的匹配 Component comp Port( 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 generate U1: comp port map(x=>a(i);y=>b(i)); End generate m1;