290 likes | 446 Views
5.3 VHDL 程åºçš„并行è¯å¥. 并行è¯å¥æ˜¯æŒ‡èƒ½ä½œä¸ºå•ç‹¬è¯å¥ç›´æŽ¥å‡ºçŽ°åœ¨ç»“构体ä¸çš„æè¿°è¯å¥ï¼Œæ‰€æœ‰çš„并行è¯å¥éƒ½æ˜¯å¹¶å‘执行的, VHDL 结构体ä¸çš„并行è¯å¥ä¸»è¦æœ‰å…«ç§ï¼š. 1 ã€è¿›ç¨‹è¯å¥ 2 ã€å—è¯å¥ 3 ã€å¹¶è¡Œä¿¡å·èµ‹å€¼è¯å¥ 4 ã€å¹¶è¡Œè¿‡ç¨‹è°ƒç”¨è¯å¥ 5 ã€å¹¶è¡Œæ–言è¯å¥ 6 ã€ç±»å±žè¯å¥ 7 ã€å…ƒä»¶ä¾‹åŒ–è¯å¥ 8 ã€ç”Ÿæˆè¯å¥. 并行è¯å¥åœ¨ç»“构体ä¸çš„ä½¿ç”¨æ ¼å¼å¦‚下: ARCHITECTURE 结构体å OF 实体å IS 说明è¯å¥ BEGIN 并行è¯å¥ END ARCHITECTURE 结构体åï¼›. c<= a and b; d<=a or b;.
E N D
5.3 VHDL程序的并行语句 并行语句是指能作为单独语句直接出现在结构体中的描述语句,所有的并行语句都是并发执行的,VHDL结构体中的并行语句主要有八种: 1、进程语句 2、块语句 3、并行信号赋值语句 4、并行过程调用语句 5、并行断言语句 6、类属语句 7、元件例化语句 8、生成语句 并行语句在结构体中的使用格式如下: ARCHITECTURE结构体名 OF实体名 IS 说明语句 BEGIN 并行语句 END ARCHITECTURE结构体名; c<= a and b; d<=a or b;
5.3.1 进程语句 1. 进程语句格式 PROCESS语句结构的一般表达格式如下: [进程标号: ] PROCESS [ ( 敏感信号参数表) ] [IS] [进程说明部分] BEGIN 顺序描述语句 END PROCESS [进程标号]; 一个结构体中可以有多个进程语句,同时并行执行。进程之间的信息传递是通过信号来完成的。
例: ENTITY mul IS PORT (a, b, c, x, y : IN BIT; data_out : OUT BIT); END mul; ARCHITECTURE ex OF mul IS SIGNAL temp : BIT; BEGIN p_a: PROCESS (a, b, x) BEGIN IF (x = '0') THEN temp <= a; ELSE temp <= b; END IF; END PROCESS p_a; p_b: PROCESS(temp, c, y) BEGIN IF(y = '0') THEN data_out <= temp; ELSE data_out <= c; END IF; END PROCESS p_b; END ex;
2.进程语句要点 进程的设计需要注意的问题: (1)进程语句本身是并行语句,它为一无限循环语句,只有两种状态:执行和等待。 (2)同一进程中的所有语句都是按照顺序来执行的。 (3)进程必须由敏感信号的变化来启动或具有一个显式的wait语句来激励 使用了敏感表的进程不必再含有等待语句 (4)信号是多个进程间的通信线,是进程间进行联系的重要途径 在任一进程的说明部分不能定义信号和共享变量 (5)进程的敏感信号列表应保持完整,否则可能导致综合前后的仿真结果不一致。 (6)一个进程中只允许描述对应于一个时钟信号的同步时序逻辑 一个进程中可以放置多个条件语句,但只允许一个含有时钟边 沿检测语句的条件语句
5.3.2 块语句结构(BLOCK) 块的应用就是将一个结构体分成若干个小的功能块,这种方式的划分只是形式上进行了改变,并不改变功能,主要目的是改善程序的可读性。 块的格式如下: 块标号 : BLOCK 接口说明 类属说明 BEGIN 并行语句 END BLOCK块标号 ; 1.块标号是必须的。 2.接口说明和类属说明部分是对BLOCK的接口设置及外界信号的连接状况加以说明。 3.块中定义的所有数据类型、数据对象及子程序等都是局部的,在多层嵌套中内层块的所有定义对外层块都是不可见的。
a c & & y z b d ... b1 : BLOCK SIGNAL s1: BIT ; BEGIN S1 <= a AND b ; b2 : BLOCK SIGNAL s2: BIT ; BEGIN s2 <= c AND d ; b3 : BLOCK BEGIN Z <= s2; --s2只在b3中可见,在b1中不可见 END BLOCK b3 ; END BLOCK b2 ; y <= s1 ; END BLOCK b1 ; ... 例:
5.3.3并行信号赋值语句 1.常用的赋值语句格式 并发信号赋值语句的格式:赋值目标 = 表达式,结构体中的多条并发赋值语句是并行执行的。 例如: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY and_gate IS PORT ( a,b : IN STD_LOGIC ; c,d : OUT STD_LOGIC); END and_gate; ARCHITECTURE behave OF and_gate IS BEGIN c <= a AND b ; d<= a OR b; END ARCHITECTURE behave;
2.条件信号赋值语句 条件信号赋值语句的表达方式如下: 赋值目标 <= 表达式1 WHEN 赋值条件1 ELSE 表达式2 WHEN 赋值条件2 ELSE ... 表达式n ; 例如: ENTITY mux IS PORT ( a ,b,c : IN BIT ; p1,p2 : IN BIT ; z : OUT BIT ); END mux; ARCHITECTURE behv OF mux IS BEGIN z <= a WHEN p1 = '1' ELSE--注意,第一句具有最高优先级 b WHEN p2 = '1' ELSE c ; END;
3. 选择信号赋值语句 选择信号赋值语句的格式如下: WITH 选择表达式 SELECT 赋值目标信号 <= 表达式1 WHEN 选择值1, 表达式2 WHEN 选择值2, ... 表达式n WHEN 选择值n; 选择信号赋值语句中也有敏感量,即关键字WITH旁边的选择信号表达式,每当选择表达式的值发生变化时,就启动此语句对各子句的选择值同时进行测试对比,没有优先级之分,若有满足条件的子句时,就将此子句表达式中的值赋给赋值目标信号。若选择条件不覆盖全部可能,编译会出错,因此,最后加”when others”。
例1: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY decoder IS PORT ( a, b, c : IN STD_LOGIC; data1,data2 : IN STD_LOGIC; dataout : OUT STD_LOGIC); END decoder; ARCHITECTURE cont OF decoder IS SIGNAL instruction : STD_LOGIC_VECTOR(2 DOWNTO 0) ; BEGIN instruction <= c & b & a ; WITH instruction SELECT dataout <= data1 AND data2 WHEN"000", --注意,每句最后使用逗号 data1 OR data2 WHEN"001", data1 NAND data2 WHEN"010", data1 NOR data2 WHEN"011", data1 XOR data2 WHEN"100", data1 XNOR data2 WHEN"101", ‘Z’ WHEN OTHERS ; --最后一句是分号 END cont ;
例2是一个列出选择条件为不同取值范围的4选1多路选择器,当不满足条件时,输出呈高阻态。例2是一个列出选择条件为不同取值范围的4选1多路选择器,当不满足条件时,输出呈高阻态。 ... WITH selt SELECT muxout <= a WHEN 0|1 , -- 0或1 b WHEN 2 TO 5 , -- 2、3、4、5 c WHEN 6 , d WHEN 7 , 'Z' WHEN OTHERS ; ...
5.3.4并行过程调用语句 并行过程调用语句常用于获得被调用过程的多个并行工作的复制电路,主要用于结构体的并行处理语句或块语句中。 并行过程调用语句书写格式非常简单: 过程名 (参数表); 例:architecture behave of alu is begin procedure adder( signal a,b : in std_logic; signal sum: out std_logic); begin sum<= a+b; end procedure adder; ………… adder(a1,b1,sum1); ………… end behave;
注 意: 例:architecture behave of alu is begin procedure adder( signal a,b : in std_logic; signal sum: out std_logic); begin sum<= a+b; end procedure adder; ………… adder(a1,b1,sum1); ………… end behave; • 并行调用语句是一个完整的语句,后面要加分号; • 并行过程调用的过程的参数必须是常量或者信号,而不能是变量; • 并行过程调用语句应在过程名后的括号里带有in、out或者inout参数类型,反之相当于没有wait语句; • 返回值必须通过过程中所定义的输出参数带回。
5.3.5并行断言语句 Assert语句主要用于程序仿真、测试中的人机对话,给出一系列的警告或者错误信息。 书写格式为: assert 条件[report 输出信息][severity 级别]; • 如果条件为真,则继续执行另一个语句;反之,则给出错误信息和错误严重程度的级别。 • VHDL语言的错误严重级别分为4个级别,failure、error、warning、note。 例:Assert(sendB=“1”) report “sendB time out at ‘1’” severity error;
5.3.6类属(Generic)语句 Generic 语句常用于不同层次之间的信息传递,例如在数据类型说明上用于位矢量长度、数组的位长以及器件的延时时间等参数的传递。 该语句主要用于行为描述方式,所涉及的数据除整数类型以外的数据类型不能进行逻辑综合。 使用generic语句易于使器件模块化和通用化。例如,在描述二输入与门的时候,输入与的上升沿和下降沿等参数不一致,为了简化设计,通常设计一个通用的二输入与门的模块化程序。该模块中的某些参数是待定的,在仿真或者逻辑综合的时候的,只要用generic语句将待定参数初始化后,就可以实现各种二输入与门的仿真或者逻辑综合。
【程序5.3.5】 entity and2 is generic (rise,fall: time ); port (a,b: in bit; c: out bit); end and2; architecture behave of and2 is signal inernal: bit; begin internal<=a and b; c<=internal after (rise) when internal= '1' else internal after (fall); end behave;
【程序】 entity adder is generic (width: integer); port (a,b: in bit_vector(width-1 downto 0); c: out bit_vector(width-1 downto 0)); end and2; architecture behave of and2 is begin c<= a + b; end behave;
5.3.7元件例化语句 元件例化语句用来指明结构体需要调用的元件、单元和模块等,并把调用来的元件、单元和模块正确的嵌入到高一层的结构体描述中。 其基本语法格式为: COMPONENT元件名 GENERIC(类属表); PORT(端口名表); END COMPONENT文件名; -- 元件定义语句 例化名 :元件名 [generic map (参数名 => 参数值,..] port map([ 端口名 => ] 连接端口名,... ); -- 元件例化语句
I0 I1 I2 按下图电路,使用元件例化语句设计一个全加器 u1 u3 a =1 =1 b SUM cin u2 u5 & ≥1 COUT u4 &
u1 u3 a =1 I0 =1 b SUM cin u2 u5 I1 ≥1 COUT u4 I2 ARCHITECTURE fadd_struc OF fulladder IS COMPONENT and2 - - 元件说明 PORT (x,y: in bit; z: out bit); END COMPONENT; COMPONENT or2 PORT (x,y: in bit; z: out bit); END COMPONENT; COMPONENT xor2 PORT (x,y: in bit; z: out bit); END COMPONENT; SIGNAL I0, I1, I2: BIT; BEGIN u1: xor2 PORT MAP (x => a, y => b, z => I0); - - 元件例化语句 u2: and2 PORT MAP (x => a, y => b, z => I1); - - 名称映射 u3: xor2 PORT MAP (x => I0, y => cin, z => sum); u4: and2 PORT MAP (x => I0, y => cin, z => I2); u5: or2 PORT MAP (x => I1, y => I2, z => cout); END fadd_struc; & &
5.3.8生成(Generate)语句 生成语句的主要功能是能够进行复制,简化有规则设计结构的逻辑描述。 生成语句的语句格式有如下两种形式:for 和 IF [标号:] For循环变量 IN取值范围 Generate 并行语句 End Generate [标号] ; 对于for语句的结构,主要用来描述设计中的一些有规律的单元结构。 生成参数(循环变量)是自动产生的,它是一个局部变量,根据取值范围自动递增或递减。取值范围的语句格式,有两种形式: 表达式 TO 表达式 ; -- 递增方式,如 1 TO 5 表达式 DOWNTO 表达式 ; -- 递减方式,如 5 DOWNTO 1 其中的表达式必须是整数。
[标号:] IF条件Generate 并行语句 End Generate[标号]; 对于if 语句的结构,主要用来描述设计中不规则的单元结构,如某些边界条件的特殊性。该语句中,若条件为真,则执行生成语句中的并行语句,若为假则不执行该语句。
两种格式都由四部分组成: (1)生成方式:有for和if语句结构,规定并行语句的复制方式 (2)说明部分:对数据类型和数据对象等进行一些说明 (3)并行语句:是复制的基本单元 (4)标号:标号并不是必须的,但在嵌套式生成语句中是非常重要的 下面是使用生成语句产生的8个相同的电路模块的示例
【 程序】 ... COMPONENT comp PORT ( INPUT : IN STD_LOGIC ; OUTPUT : OUT STD_LOGIC ); END COMPONENT ; SIGNAL a : STD_LOGIC_VECTOR(0 TO 7); SIGNAL b : STD_LOGIC_VECTOR(0 TO 7); ... gen : FOR i IN 0 TO 7 GENERATE u1: comp PORT MAP (INPUT=>a(i),OUTPUT=>b(i)); --名称映射 END GENERATE gen; ...
D Q LATCH ENA 下面为使用元件例化语句和FOR_GENERATE语句完成一个8位三态锁存器的设计的例子 1. 设计底层的1位锁存器: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Latch IS PORT( D : IN STD_LOGIC; ENA : IN STD_LOGIC; Q : OUT STD_LOGIC ); END ENTITY Latch ; ARCHITECTURE one OF Latch IS BEGIN PROCESS (D, ENA) BEGIN IF ENA = '1' THEN Q<= D ; END IF ; END PROCESS ; END ARCHITECTURE one;
2. 设计顶层的8位锁存器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY SN74373 IS PORT ( D : IN STD_LOGIC_VECTOR( 8 DOWNTO 1 ); OEN ,G : IN STD_LOGIC; Q : OUT STD_LOGIC_VECTOR(8 DOWNTO 1)); END ENTITY SN74373; ARCHITECTURE one OF SN74373 IS COMPONENT Latch PORT ( D, ENA : IN STD_LOGIC; Q : OUT STD_LOGIC ); END COMPONENT; SIGNAL sig_mid : STD_LOGIC_VECTOR( 8 DOWNTO 1 ); BEGIN GeLatch : FOR i IN 1 TO 8 GENERATE Latchx : Latch PORT MAP (D(i),G,sig_mid(i)); --位置映射 END GENERATE; Q <= sig_mid WHEN OEN = '0' ELSE "ZZZZZZZZ"; --当OEN=1时,Q(8)-Q(1)输出状态呈高阻态 END ARCHITECTURE one;
q0 q1 qn-1 FD FD FD q q q d d d ... clk nq clk nq clk nq CP s(n) s(2) s(1) 下图所示为n位二进制计数器原理图,中间部分的结构是规则的,但第一级是不规则的,对此,使用if_generate实现比较方便。 n 位二进制计数器原理图
dff1 q d clk nq --底层D触发器的描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY dff1 IS PORT ( d, clk : IN STD_LOGIC ; q : OUT STD_LOGIC ; nq : OUT STD_LOGIC ); END ENTITY dff1; ARCHITECTURE a_ff OF dff1 IS BEGIN PROCESS(clk) BEGIN IF clk'EVENT AND clk= '1' THEN q <= d ; nq <= NOT d; END IF; END PROCESS; END ARCHITECTURE a_ff;接下页
FD FD FD FD FD FD q q q q q q d d d d d d clk clk nq nq clk clk nq nq clk clk nq nq q0 q0 q1 q1 qn-1 qn-1 ...... ...... CP CP s(n) s(n) s(2) s(2) s(1) s(1) LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; --顶层计数器的描述 ENTITY cnt_n is GENERIC (n : INTEGER); PORT ( q : OUT STD_LOGIC_VECTOR (n-1 DOWNTO 0); cp : IN STD_LOGIC ); END ENTITY cnt_n; ARCHITECTURE behv OF cnt_n IS COMPONENT dff1 PORT( d, clk : IN STD_LOGIC; q, nq : OUT STD_LOGIC); END COMPONENT dff1; SIGNAL s : STD_LOGIC_VECTOR(n DOWNTO 1); BEGIN q_1 : FOR i IN 0 TO n-1 GENERATE IF(i=0) GENERATE U1: dff1 PORT MAP (s(i+1), CP, q(i), s(i+1)); END GENERATE; IF (i/=0) GENERATE U2: dff1 PORT MAP (s(i+1), s(i), q(i), s(i+1)); END GENERATE; END GENERATE q_1; END ARCHITECTURE behv;