1、六、VHDL语言的并行语句,1、并行信号赋值语句,4、进程语句,3、块语句,2、条件信号赋值语句,5、元件例化语句,6、生成语句,7、并行过程调用语句,结构体,结构体中的并行语句模块,1、并行信号赋值语句,赋值目标 = 表达式,例 ARCHITECTURE curt OF bc1 IS SIGNAL s1, e, f, g, h : STD_LOGIC ; BEGINoutput1 = a AND b ;output2 = c + d ;g = e OR f ;h = e XOR f ;s1 = g ; END ARCHITECTURE curt;,2、条件信号赋值语句,赋值目标 = 表达式
2、WHEN 赋值条件 ELSE表达式 WHEN 赋值条件 ELSE.表达式 ;,例 ENTITY mux ISPORT ( a,b,c : IN BIT ;p1,p2 : IN BIT ;z : OUT BIT );END;ARCHITECTURE behv OF mux ISBEGINz = a WHEN p1 = 1 ELSEb WHEN p2 = 1 ELSEc ;END;,选择信号赋值语句,WITH 选择表达式 SELECT 赋值目标信号 =表达式 WHEN 选择值,表达式 WHEN 选择值,.,表达式 WHEN 选择值;,例 . WITH selt SELECT muxout = a
3、WHEN 0|1 , - 0或1b WHEN 2 TO 5 , - 2或3,或4或5c WHEN 6 ,d WHEN 7 ,Z WHEN OTHERS ;.,3、块语句,块标号 : BLOCK (块保护表达式)接口说明;类属说明;BEGIN并行语句;END BLOCK 块标号 ;,与大部分的VHDL语句不同,BLOCK语句的应用,包括其中的类属说明和端口定义,都不会影响对原结构体的逻辑功能的仿真结果。,例 .b1 : BLOCKSIGNAL s1: BIT ; BEGINS1 = a AND b ; b2 : BLOCKSIGNAL s2: BIT ; BEGINs2 = c AND d ;
4、b3 : BLOCKBEGINZ = s2 ; END BLOCK b3 ;END BLOCK b2 ;y = s1 ; END BLOCK b1 ; .,4、进程语句,进程标号: PROCESS ( 敏感信号参数表 ) IS进程说明部分BEGIN顺序描述语句;END PROCESS 进程标号;,PROCESS语句结构的一般表达格式如下,在一个结构体中多个PROCESS语句可以同时并发运行,而进程内部语句之间是顺序关系。PROCESS语句在VHDL程序中,是描述硬件并行工作行为的最常用、最基本的语句。,PROCESS 组成,PROCESS语句结构,进程说明,顺序描述语句,敏感信号参数表,信号赋
5、值语句,变量赋值语句,进程启动语句,子程序调用语句,顺序描述语句,进程跳出语句,(1) 进程说明部分主要定义一些局部量,可包括数据类型、常数、属性、子程序等。但需注意,在进程说明部分中不允许定义信号和共享变量。,(2) 顺序描述语句部分可分为赋值语句、进程启动语句、子程序调用语句、顺序描述语句和进程跳出语句等。,(3)为启动进程,在进程中必须包含有一个显式的敏感信号量表或者包含一个WAIT语句;敏感信号表应当紧跟在PROCESS之后,含有敏感信号表的进程语句中不允许再显式出现WAIT语句。,说明,1. PROCESS为一无限循环语句,2. PROCESS语句具有顺序/并行运行双重性,3. 进程
6、必须由敏感信号的变化来启动,4. 信号是多个进程间的通信线,PROCESS语句特点,5. 一个进程中只允许描述对应于一个时钟信号的同步时序逻辑,例:ENTITY mul IS PORT (a, b, c, selx, sely : IN BIT;data_out : OUT BIT ); END mul; ARCHITECTURE ex OF mul ISSIGNAL temp : BIT; BEGIN p_a : PROCESS (a, b, selx)BEGINIF (selx = 0) THEN temp = a; ELSE temp = b;END IF;END PROCESS p_a
7、; p_b: PROCESS(temp, c, sely)BEGINIF (sely = 0) THEN data_out = temp;ELSE data_out = c;END IF;END PROCESS p_b; END ex;,上例的综合结果,例: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CNT10 IS PORT(CLR: IN STD_LOGIC;IN1:IN STD_LOGIC_VECTOR(3 DOWNTO 0);OUT1:OUT STD_LOGIC_
8、VECTOR(3 DOWNTO 0); END ENTITY CNT10; ARCHITECTURE ART OF CNT10 IS BEGIN PROCESS (IN1,CLR) ISBEGIN IF (CLR= 1 OR IN1= “1001“) THEN OUT1=“0000“; -有清零信号,或计数已达9,OUT1输出0ELSE -否则作加1操作OUT1=IN1+1; -注意,使用了重载算符“+“,重载算符“+“是在库ENG IF; -STD_LOGIC_UNSIGNED中预先声明的 END PROCESS; END ARCHITECTURE ART;,组合电路型十进制加法器CNT10
9、综合后的RTL硬件结构图,一般用于组合电路进程模式,_进程标记: PROCESS (_信号名, _信号名, _信号名)VARIABLE _变量名 : STD_LOGIC;VARIABLE _变量名 : STD_LOGIC; BEGIN- 指定信号- 指定变量- 过程调用- 如果语句- CASE语句- 循环语句 END PROCESS _进程标记;,用于时序电路进程模式,_进程标记: PROCESS (_信号名, _信号名, _信号名)VARIABLE _变量名 : STD_LOGIC;VARIABLE _变量名 : STD_LOGIC; BEGINWAIT UNTIL _时钟信号 = 1;或
10、CLK event and CLK=1- 指定信号- 指定变量- 过程调用- 如果语句- CASE语句- 循环语句 END PROCESS _进程标记;,5、元件例化语句,例化名 :元件名 PORT MAP( - 元件例化语句端口名 = 连接端口名,.) ;,元件例化就是将预先设计好的设计实体定义为一个元件,然后利用特定的语句将此元件与当前的设计实体中的指定端口相连接,从而为当前设计实体引入一个新的低一级的设计层次。,COMPONENT 元件名 IS GENERIC (类属表); - 元件定义语句PORT (端口名表); END COMPONENT 文件名;,元件定义(声明)语句,元件例化语句
11、,例:利用元件例化语句设计如下所示电路,LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY ND2 IS PORT(A,B:IN STD_LOGIC;C:OUT STD_LOGIC); END ENTITY ND2; ARCHITECTURE ARTND2 OF ND2 IS BEGINCC1,C=S2,B=D1); -名字关联方式U3:ND2 PORT MAP (S1,S2,C=Z1); -混合关联方式 END ARCHITECTURE ARTORD41;,例:,6、生成语句,标号: FOR 循环变量 IN 取值范围 GENERATE说明;BE
12、GIN并行语句;END GENERATE 标号 ;,表达式 TO 表达式 ; - 递增方式,如1 TO 5 表达式 DOWNTO 表达式 ; - 递减方式,如5 DOWNTO 1,标号: IF 条件 GENERATE说明;BEGIN并行语句;END GENERATE 标号 ;,取值范围,生成语句有一种复制作用,在设计中,只要根据某些条件,设定好某一元件或设计单位,就可以利用生成语句复制一组完全相同的并行元件或设计单元电路结构。,:,生成语句的两种形式,例:利用生成语句产生的八个相同的电路模块,主要的VHDL程序如下: COMPONENT COMP ISPORT (X:IN STD_LOGIC;
13、Y: OUT STD_LOGIC); END COMPONENT COMP;SIGNAL A,B:STD_LOGIC_VECTOR (0 TO 7); GEN: FOR I IN ARANGE GENERATEU1:COMP PORT MAP (X= A(I), Y=B(I); END GENERATE GEN; ,7、并行过程调用语句,PROCEDURE 过程名(参数1;参数2;) IS声明语句; BEGIN顺序处理语句; END 过程名;,并行过程调用语句可以作为一个并行语句直接出现在结构体或块语句中。并行过程调用语句的功能等效于包含了同一个过程调用语句的进程。并行过程调用语句的语句调用格
14、式与前面讲的顺序过程调用语句是相同的。,过程调用的实质内容要先装入程序包中(Package):,过程名(关联参数表);,并行过程调用:,位置关联方式,名字关联方式 =,参数关联方式,例:设有一过程PROCEDURE vect(a,b:IN BIT;x,y:INOUT BIT); 则调用时: 位置关联方式:vect(in1,in2,out1,out2); 名字关联方式:vect(a=in1,b=in2,x=out1,y=out2);,使用说明,1、过程的参数表中可以使用IN、OUT、INOUT三种;(不能理解为端口) 2、过程可以返回多个变量(通过OUT、INOUT 定义的参数返回); 3、参数
15、对象可以为常量(IN方式)、信号、变量; 4、在进程外的过程调用为并行过程调用;在进程内的为顺序过程调用;,函数调用:,FUNCTION 函数名(参数1;参数2) RETURN 数据类型名 IS 定义变量语句; BEGIN顺序处理语句; RETURN 返回变量名; END 函数名;,函数调用的实质内容要先装入程序包中(Package):,函数名(关联参数表);,使用说明,1、函数的参数表中只能为IN的信号与常量; 2、函数返回值只有一个(通过RETURN实现,由函数名传给调用者); 3、也可以像过程一样使用位置关联方式和名字关联方式;,1、过程可以有多个返回值,函数只有一个; 2、参数传递方式
16、不同: 过程(IN OUT INOUT)函数(IN),过程(Procedure) 函数(Function)两者的主要区别:,1 库的种类,A. IEEE库,B. STD库,C. WORK库,D. VITAL库,七、VHDL库,2 库的用法,LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.STD_ULOGIC ;USE IEEE.STD_LOGIC_1164.RISING_EDGE ;,USE语句的使用有两种常用格式: USE 库名.程序包名.项目名 ; USE 库名.程序包名.ALL ;,库的作用范围从一个实体说明开始到它所属的结构体、配置为止,当有两个实体时,第二
17、个实体前要另加库和包的说明。,程序包,常数说明,VHDL数据类型说明,元件定义,子程序,定义程序包的一般语句结构如下:PACKAGE 程序包名 IS - 程序包首程序包首说明部分; END 程序包名;PACKAGE BODY 程序包名 IS - 程序包体程序包体说明部分以及包体内顺序语句; END 程序包名;,3 VHDL程序包,例: 程序包首,PACKAGE logic ISTYPE three_level_logic IS (0,1,z); -数据类型项目CONSTANT unknown_value : three_level_logic :=0; - 常数项目 FUNCTION inve
18、rt (input: three_level_logic) RETURN three_level_logic; -函数项目 END logic;,PACKAGE BODY logic ISFUNCTION invert (input: three_level_logic);-函数项目描述BEGINCASE input IS WHEN 0 = RETURN 1;WHEN 1 = RETURN 0; WHEN Z = RETURN Z;END CASE;END invert; END logic;,程序包体,USE logic.three_level_logic, logic.invert; -使
19、用数据类型和 函数两个项目 ENTITY inverter ISPORT(x: IN three_level_logic ;y: OUT three_level_logic); END inverter; ARCHITECTURE inverter_body OF inverter IS BEGINkk: PROCESSBEGINY=invert(x) AFTER 10ns;WAIT ON x;END PROCESS;END inverter_body;,该包使用例:,PACKAGE seven ISSUBTYPE segments is BIT_VECTOR(0 TO 6) ;TYPE bc
20、d IS RANGE 0 TO 9 ;END seven ;USE WORK.seven.ALL ; - WORK库默认是打开的,ENTITY decoder ISPORT (input: bcd; drive : out segments) ;END decoder ;ARCHITECTURE simple OF decoder ISBEGINWITH input SELECTdrive = B“1111110“ WHEN 0 ,B“0110000“ WHEN 1 ,B“1101101“ WHEN 2 ,B“1111001“ WHEN 3 ,B“0110011“ WHEN 4 ,B“1011
21、011“ WHEN 5 ,B“1011111“ WHEN 6 ,B“1110000“ WHEN 7 ,B“1111111“ WHEN 8 ,B“1111011“ WHEN 9 ,B“0000000“ WHEN OTHERS ;END simple ;,例:,常用的预定义的程序包,STD_LOGIC_1164程序包,STD_LOGIC_ARITH程序包,STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED程序包,STANDARD和TEXTIO程序包,std_logic_1164.all;定义标准逻辑类型数据 std_logic_signed.all;有符号的算术运算 std_logic_unsigned.all;无符号的算术运算 std_logic_arith.all;定义了有符号与无符号类型,及基于这些类型上的算术运算,