Upload
hasad
View
250
Download
0
Embed Size (px)
DESCRIPTION
5.3 VHDL 程序的并行语句. 并行语句是指能作为单独语句直接出现在结构体中的描述语句,所有的并行语句都是并发执行的, VHDL 结构体中的并行语句主要有八种:. 1 、进程语句 2 、块语句 3 、并行信号赋值语句 4 、并行过程调用语句 5 、并行断言语句 6 、类属语句 7 、元件例化语句 8 、生成语句. 并行语句在结构体中的使用格式如下: ARCHITECTURE 结构体名 OF 实体名 IS 说明语句 BEGIN 并行语句 END ARCHITECTURE 结构体名;. c
Citation preview
1
5.3 VHDL程序的并行语句
并行语句是指能作为单独语句直接出现在结构体中的描述语句,所有的并行语句都是并发执行的, VHDL结构体中的并行语句主要有八种:
并行语句在结构体中的使用格式如下: ARCHITECTURE 结构体名 OF 实体名 IS 说明语句 BEGIN 并行语句 END ARCHITECTURE 结构体名;
1 、进程语句
2 、块语句
3 、并行信号赋值语句
4 、并行过程调用语句
5 、并行断言语句
6 、类属语句
7 、元件例化语句
8 、生成语句 c<= a and b;d<=a or b;
2
5.3.1 进程语句
1. 进程语句格式 PROCESS语句结构的一般表达格式如下:
一个结构体中可以有多个进程语句,同时并行执行。进程之间的信息传递是通过信号来完成的。
[ 进程标号 : ] PROCESS [ ( 敏感信号参数表 ) ] [IS]
[ 进程说明部分 ]
BEGIN
顺序描述语句
END PROCESS [进程标号 ];
3
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;
例:
4
2. 进程语句要点进程的设计需要注意的问题:( 1 )进程语句本身是并行语句,它为一无限循环语句,只有两种状态:执
行和等待。
( 2 )同一进程中的所有语句都是按照顺序来执行的。
( 3 )进程必须由敏感信号的变化来启动或具有一个显式的 wait语句来激励
使用了敏感表的进程不必再含有等待语句
( 4 )信号是多个进程间的通信线,是进程间进行联系的重要途径
在任一进程的说明部分不能定义信号和共享变量
( 5 )进程的敏感信号列表应保持完整,否则可能导致综合前后的仿真结果不一致。
( 6 )一个进程中只允许描述对应于一个时钟信号的同步时序逻辑
一个进程中可以放置多个条件语句,但只允许一个含有时钟边
沿检测语句的条件语句
5
5.3.2 块语句结构( BLOCK)
块的应用就是将一个结构体分成若干个小的功能块,这种方式的划分只是形式上进行了改变,并不改变功能,主要目的是改善程序的可读性。
块的格式如下: 块标号 : BLOCK 接口说明 类属说明 BEGIN 并行语句 END BLOCK 块标号 ;1.块标号是必须的。2.接口说明和类属说明部分是对 BLOCK的接口设置及外界信号的连接状况加以说明。3.块中定义的所有数据类型、数据对象及子程序等都是局部的,在多层嵌套中内层块的所有定义对外层块都是不可见的。
6
...
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 ;
...
...
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 ;
...
&a
by
&c
dz
例:
7
5.3.3并行信号赋值语句 1. 常用的赋值语句格式
例如:例如: LIBRARYLIBRARY IEEE; IEEE;
USEUSE IEEE.STD_LOGIC_1164. IEEE.STD_LOGIC_1164.ALLALL; ;
ENTITYENTITY and_gate and_gate ISIS
PORTPORT ( a,b : ( a,b : ININ STD_LOGIC ; STD_LOGIC ;
c,d : c,d : OUTOUT STD_LOGIC); STD_LOGIC);
END END and_gate;and_gate;
ARCHITECTUREARCHITECTURE behave behave OFOF and_gate and_gate ISIS
BEGINBEGIN
c <= a c <= a ANDAND b ; b ;
d<= a d<= a OROR b; b;
END ARCHITECTUREEND ARCHITECTURE behave behave ;;
并发信号赋值语句的格式:赋值目标 = 表达式,结构体中的多条并发赋值语句是并行执行的。
8
2. 条件信号赋值语句条件信号赋值语句的表达方式如下:赋值目标 <= 表达式 1 WHEN 赋值条件 1 ELSE 表达式 2 WHEN 赋值条件 2 ELSE ... 表达式 n ;
条件信号赋值语句的表达方式如下:赋值目标 <= 表达式 1 WHEN 赋值条件 1 ELSE 表达式 2 WHEN 赋值条件 2 ELSE ... 表达式 n ;
例如:例如:ENTITYENTITY mux mux ISIS PORTPORT ( a ,b,c : ( a ,b,c : ININ BIT ; BIT ; p1,p2 : p1,p2 : ININ BIT ; BIT ; z : z : OUTOUT BIT ); BIT ); END END mux;mux;
ARCHITECTUREARCHITECTURE behv behv OFOF mux mux ISIS BEGINBEGIN z <= a z <= a WHENWHEN p1 = '1' p1 = '1' ELSEELSE ---- 注意,第一句具有最高优先级注意,第一句具有最高优先级 b b WHENWHEN p2 = '1' p2 = '1' ELSEELSE c ;c ; ENDEND;;
9
3. 选择信号赋值语句
选择信号赋值语句的格式如下: WITH 选择表达式 SELECT 赋值目标信号 <= 表达式 1 WHEN 选择值 1 , 表达式 2 WHEN 选择值 2 , ... 表达式 n WHEN 选择值 n ;
选择信号赋值语句的格式如下: WITH 选择表达式 SELECT 赋值目标信号 <= 表达式 1 WHEN 选择值 1 , 表达式 2 WHEN 选择值 2 , ... 表达式 n WHEN 选择值 n ;
选择信号赋值语句中也有敏感量,即关键字 WITH 旁边的选择信号表达式,每当选择表达式的值发生变化时,就启动此语句对各子句的选择值同时进行测试对比,没有优先级之分,若有满足条件的子句时,就将此子句表达式中的值赋给赋值目标信号。若选择条件不覆盖全部可能,编译会出错,因此,最后加” when others” 。
10
例 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 ;
11
...
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 ;
...
...
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 ;
...
例 2 是一个列出选择条件为不同取值范围的 4选 1 多路选择器,当不满足条件时,输出呈高阻态。
12
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;
13
并行调用语句是一个完整的语句,后面要加分号; 并行过程调用的过程的参数必须是常量或者信号,而不能是变量; 并行过程调用语句应在过程名后的括号里带有 in、 out或者 inout参数类型,反之相当于没有 wait语句; 返回值必须通过过程中所定义的输出参数带回。
注 意:例: 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;
14
5.3.5并行断言语句
例: Assert ( sendB=“ 1” ) report “sendB time out at ‘1’ ” severity error;
Assert语句主要用于程序仿真、测试中的人机对话,给出一系列的警告或者错误信息。
书写格式为: assert 条件 [report 输出信息 ][severity 级别 ] ;o 如果条件为真,则继续执行另一个语句;反之,则给出错误信息和错误严重程度的级别。o VHDL语言的错误严重级别分为 4 个级别, failure、 error、 warning、 note。
15
5.3.6类属( Generic)语句
Generic 语句常用于不同层次之间的信息传递,例如在数据类型说明上用于位矢量长度、数组的位长以及器件的延时时间等参数的传递。
该语句主要用于行为描述方式,所涉及的数据除整数类型以外的数据类型不能进行逻辑综合。
使用 generic语句易于使器件模块化和通用化。例如,在描述二输入与门的时候,输入与的上升沿和下降沿等参数不一致,为了简化设计,通常设计一个通用的二输入与门的模块化程序。该模块中的某些参数是待定的,在仿真或者逻辑综合的时候的,只要用 generic语句将待定参数初始化后,就可以实现各种二输入与门的仿真或者逻辑综合。
16
【程序 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;
17
【程序】
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;
18
5.3.7元件例化语句
元件例化语句用来指明结构体需要调用的元件、单元和模块等,并把调用来的元件、单元和模块正确的嵌入到高一层的结构体描述中。
其基本语法格式为:
COMPONENT 元件名
GENERIC (类属表);
PORT (端口名表);
END COMPONENT 文件名; - - 元件定义语句
例化名 :元件名 [generic map ( 参数名 => 参数值, ..]
port map ( [ 端口名 => ] 连接端口名, ... );
-- 元件例化语句
19
按下图电路,使用元件例化语句设计一个全加器
=1=1
≥1COUT
u5
cin
b
a
u4
u3
u2
u1
SUM
&
&I2
I1
I0
20
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;
=1 =
1
≥1
COUT
u5
cin
b
a
u4
u3
u2
u1
I2
I1
SUM
I0
&
&
21
5.3.8生成( Generate)语句
生成语句的主要功能是能够进行复制,简化有规则设计结构的逻辑描述。生成语句的语句格式有如下两种形式: for 和 IF
[ 标号: ] For 循环变量 IN 取值范围 Generate
并行语句 End Generate [标号 ] ; 对于 for语句的结构,主要用来描述设计中的一些有规律的单元结构
。
生成参数(循环变量)是自动产生的,它是一个局部变量,根据取值范围自动递增或递减。取值范围的语句格式,有两种形式:
表达式 TO 表达式 ; -- 递增方式,如 1 TO 5
表达式 DOWNTO 表达式 ; -- 递减方式,如 5
DOWNTO 1
其中的表达式必须是整数。
22
对于 if 语句的结构,主要用来描述设计中不规则的单元结构,如某些边界条件的特殊性。该语句中,若条件为真,则执行生成语句中的并行语句,若为假则不执行该语句。
对于 if 语句的结构,主要用来描述设计中不规则的单元结构,如某些边界条件的特殊性。该语句中,若条件为真,则执行生成语句中的并行语句,若为假则不执行该语句。
[ 标号: ] IF 条件 Generate
并行语句 End Generate [ 标号 ] ;
23
两种格式都由四部分组成:
( 1 )生成方式:有 for和 if语句结构,规定并行语句的复制方式
( 2 )说明部分:对数据类型和数据对象等进行一些说明
( 3 )并行语句:是复制的基本单元
( 4 )标号:标号并不是必须的,但在嵌套式生成语句中是非常重要的
下面是使用生成语句产生的 8 个相同的电路模块的示例下面是使用生成语句产生的 8 个相同的电路模块的示例
24
【 程序】 ... 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 ; ...
【 程序】 ... 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 ; ...
COMPINPUT OUTPUT
COMPINPUT OUTPUT
COMPINPUT OUTPUTa[0] b[0]
a[1] b[1]
a[7] b[7]
. . .
25
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 ;
下面为使用元件例化语句和 FOR_GENERATE语句完成一个 8位三态锁存器的设计的例子1. 设计底层的 1 位锁存器:
LATCH
D
ENAQ
ARCHITECTURE one OF Latch IS
BEGIN
PROCESS (D, ENA)
BEGIN
IF ENA = '1' THEN Q<= D ;
END IF ;
END PROCESS ;
END ARCHITECTURE one;
26
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;
27
n 位二进制计数器原理图
下图所示为 n 位二进制计数器原理图,中间部分的结构是规则的,但第一级是不规则的,对此,使用 if_generate实现比较方便。
s(n) s(2)s(1)
CP
qn-1q1q0
...clk
FD d q
nq clk
FDd q
nq clk
FDd q
nq
28
--底层 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; 接下页
dff1
clk
d q
nq
29
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;
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;
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; s(n)s(2)
CP
s(1)
qn-1q1 q0
......clk
FD d q
nq clk
FD d q
nq clk
FD d q
nq
s(n)s(2)
CP
s(1)
qn-1q1 q0
......clk
FD d q
nq clk
FD d q
nq clk
FD d q
nq