在系统可编程技术
第 11讲
VHDL语言结构体的描述
方法
结构体的一般语言格式
ARCHITECTURE 结构体名 OF 实体名 IS
[说明语句 ]
BEGIN
[功能描述语句 ]
END 结构体名 ;
结构体三种描述方法
行为描述
(behavioral)
数据流描述
(dataflow)
结构化描述
(structural)
功能描述语句
进程语句
信号赋值语句
子程序调用语句
元件例化语句
结构体 --行为描述
行为描述是高层次描述方式,它只描述输入
与输出之间的逻辑转换关系,而不涉及具体逻辑
电路结构等信息。
主要用于系统数学模型的仿真或系统工作原
理的仿真。故其大量采用的算术运算、关系运算、
惯性延时、传输延时等描述方式是难于或不能进
行逻辑综合的。
行为描述:一般采用进程语句( PROCESS)
描述
高层次的功能
描述,不必考
虑在具体电路
是怎样实现的。
Architecture behavioral of
eqcomp4 is
begin
comp,process (a,b)
begin
if a=b then
equal <= ‘1’;
else
equal <=‘0’;
end if;
end process comp;
end behavioral ;
结构体--数据流描述
数据流描述:也称寄存器( RTL)描述方式,
明确描述了数据信号的流动路径、流动方向和流
动结果。
它采用类似于布尔方程的并行信号赋值语句
进行描述。可以描述时序电路,也可描述组合电
路。是完全能够进行逻辑综合的描述方式。
当 a和 b的
宽度发生
变化时,
需要修改
设计,当
宽度过大
时,设计
非常繁琐
布尔方程描述
Architecture dataflow2 of eqcomp4 is
begin
equal <= not(a(0) xor b(0))and
not(a(1) xor b(1))and
not(a(2) xor b(2))and
not(a(3) xor b(3));
end dataflow2;
Architecture dataflow1 of eqcomp4 is
begin
equal <= ‘1’ when a=b else ‘0’;
end dataflow1;
结构体--结构化描述
结构化描述:复杂数字逻辑系统的层次化设
计法。设计中,高层次的设计模块调用低层次的
设计模块,或直接用门电设计单元来设计一复杂
的逻辑电路。
它采用元件例化语句或生成语句进行设计。
使用格式,
先声明元件,
Component 元件名 [ IS ]
[ Port (端口说明) ]
End Component ;
后元件例化,
例化名, 元件名 Port Map(端口映射)
元件例化语句
元件例化时端口映射方式 1,位置对应方式
元件标号:元件名 Port Map( 信号 1,信号 2,… ) ;
architecture struct of eqcomp4 is
COMPONENT XNOR2
PORT(A,B:IN STD_LOGIC;
C:OUT STD_LOGIC);
END COMPONENT;
COMPONENT and4
PORT(a,b,c,d:IN STD_LOGIC;
q:OUT STD_LOGIC);
END COMPONENT;
SIGNAL X:STD_LOGIC_VECTOR(0 TO 3);
begin
U0:xnor2 port map(a(0),b(0),x(0));
U1:xnor2 port map(a(1),b(1),x(1));
U2:xnor2 port map(a(2),b(2),x(2));
U3:xnor2 port map(a(3),b(3),x(3));
U4:and4 port map(x(0),x(1),x(2),x(3),equal);
end struct;
元件例化时端口映射方式 1,名字直接对应
元件标号:元件名 Port Map(信号 A=>信号 A1,信号 B=>信号 B1,… ) ;
architecture struct of eqcomp4 is
COMPONENT XNOR2
PORT(A,B:IN STD_LOGIC;
C:OUT STD_LOGIC);
END COMPONENT;
COMPONENT and4
PORT(a,b,c,d:IN STD_LOGIC;
q:OUT STD_LOGIC);
END COMPONENT;
SIGNAL X:STD_LOGIC_VECTOR(0 TO 3);
begin
U0:xnor2 port map(A=>a(0),B=>b(0),C=>x(0));
U1:xnor2 port map(B=>b(1),A=>a(1),C=>x(1));
U2:xnor2 port map(A=>a(2),B=>b(2),C=>x(2));
U3:xnor2 port map(A=>a(3),B=>b(3),C=>x(3));
U4:and4 port ap(a=>x(0),b=>x(1),c=>x(2),d=>x(3),q=>equal);
end struct;
三种描述方式的比较
描述方式 优点 缺点 适用场合
结构化描

连接关系清
晰,电路模
块化清晰
繁琐、复杂 层次化设计
数据流描

布尔函数定
义明白
逻辑方程
难以获得 小门数设计
行为描述 逻辑关系描述清晰 不一定能综合 系统建模、复杂的电路
进程语句( process)
Process 语句的格式为,
[进程标号,] Process [(敏感信号列表 )]
[变量声明 ]
Begin
顺序语句;
End Process [进程标号 ];
敏感表 (Sensitivity list)包括进程的一些信号,当敏感表中的
某个信号变化时进程才被激活,进程内的顺序语句被执行。当进
程结束时,进程内的输出信号值被更新,进程进入等待(睡眠)
状态,直到敏感表中的某一信号再次发生变化,进程被再次激活
执行。
请用进程语句描述下面电路,
≥ 1

A
B
C
D
方案一
Library ieee;
Use ieee.std_logic_1164.all;
Entity example is
port( a,b:in std_logic
c,d:out std_logic);
End example;
architecture m2 of examle is
begin
Process( a,b)
begin
c<=a and b;
d<= a or b;
end process;
end m2;
方案二
architecture m2 of examle is
begin
A:Process( a,b)
begin
c<=a and b;
end process A;
B:Process( a,b)
begin
d<= a or b;
end process B;
end m2;
方案三
Library ieee;
Use ieee.std_logic_1164.all;
Entity example is
port( a,b:in std_logic
c,d:out std_logic);
End example;
architecture m2 of examle is
begin
Process( a,b)
variable tmp1,tmp2:std_logic;
begin
tmp1:=a and b;
tmp2:=a or b;
c<=tmp1;
d<=tmp2;
end process;
end m2;
变量的
结果必
须由信
号带出
进程
Process(sel,a,b)
Begin
f<=a;
If sel=‘1’ then f<=b;
end if;
End process;
Process(sel,a,b)
Begin
If sel=‘1’ then f<=b;
end if;
f<=a;
End process;
注意进程内的语句是顺序执行
结果
f总是
等于
a
变量和信号的区别
例,8未奇偶校验电路
Library ieee;
Use ieee.std_logic_1164.all;
Entity jojy is
port(a:in std_logic_vector(0 to 7);
q:out std_logic);
End jojy;
Architecture behave of jojy is
Begin
process(a)
variable tmp:std_logic;
begin
tmp:=‘0’;
for i in 0 to 7 loop
tmp:= tmp xor a(i);
end loop;
q<=tmp;
End behave;
tmp能定
义成信号
吗?
子程序
子程序是在主程序调用它以后能将结果返回主程序的程序模
块,它可以反复调用,方便程序设计。 VHDL子程序模块,由顺
序语句构成。每调用一次子程序都意味着增加了一个硬件电路模
块,因此,在实际使用时,要密切关注和严格控制子程序的调用
次数。
子程序通常放在程序包中。
子程序有两种类型:过程( Procedure)
和函数( Function)。
程序包
程序包的格式,
PACKAGE 包集合名 IS
[说明语句 ]
END 包集合名 ;
PACKAGE BODY 包集合名 IS
[说明语句 ]
END 包集合名;
定义子程序
实现子程序
包集合标题
包集合体
函数 (Function)
Function 函数名 (参数表) Return 数据类型
Function 函数名 (参数表) Return 数据类型 IS
说明部分
Begin
顺序语句
END Function 函数名;
函数首
在程序包标题
中定义
函数体
在程序包体中
定义
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
PACKAGE hanshu IS --定义程序包
FUNCTION max( a,b, IN STD_LOGIC_VECTOR) --定义函数首
RETURN STD_LOGIC_VECTOR ;
FUNCTION func1 ( a,b,c, REAL ) --定义函数首
RETURN REAL ;
FUNCTION "*" ( a,b, INTEGER ) --定义函数首
RETURN INTEGER ;
END ;
PACKAGE BODY hanshu IS
FUNCTION max( a,b, IN STD_LOGIC_VECTOR) --定义函数体
RETURN STD_LOGIC_VECTOR IS
BEGIN
IF a > b THEN RETURN a;
ELSE RETURN b;
END IF;
END FUNCTION max; --结束 FUNCTION语句
END; --结束 PACKAGE BODY语句
函数定义实例
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE WORK.hanshu.ALL ;
ENTITY axamp IS
PORT(dat1,dat2, IN STD_LOGIC_VECTOR(3 DOWNTO 0);
dat3,dat4, IN STD_LOGIC_VECTOR(3 DOWNTO 0);
out1,out2, OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );
END;
ARCHITECTURE bhv OF axamp IS
BEGIN
out1 <= max(dat1,dat2); --用在赋值语句中的并行函数调用语句
PROCESS(dat3,dat4)
BEGIN
out2 <= max(dat3,dat4); --顺序函数调用语句
END PROCESS;
END;
函数应用实例
过程( Procedure)
Procedure 过程名 (参数表)
Procedure 过程名 (参数表) IS
说明部分
Begin
顺序语句
END Procedure 过程名;
过程首
在程序包标题
中定义
过程体
在程序包体中
定义
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
PACKAGE hanshu IS --定义程序包
procedure max( signal a,b,IN STD_LOGIC_VECTOR;
signal c,out std_logic_vector); --定义过程首
END ;
PACKAGE BODY hanshu IS
procedure max( signal a,b,IN STD_LOGIC_VECTOR)--定义过程体
signal c,out std_logic_vector) is
BEGIN
c<=a;
if(a<=b) then
c<=b;
end if;
END max;
END; --结束 PACKAGE BODY语句
过程定义实例
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE WORK.hanshu.ALL ;
ENTITY axamp IS
PORT(dat1,dat2, IN STD_LOGIC_VECTOR(3 DOWNTO 0);
dat3,dat4, IN STD_LOGIC_VECTOR(3 DOWNTO 0);
out1,out2, OUT STD_LOGIC_VECTOR(3 DOWNTO 0) );
END;
ARCHITECTURE bhv OF axamp IS
BEGIN
max(dat1,dat2,out1);
max(dat3,dat4,out2);
END;
过程应用实例
函数与过程对比
? 过程可以返回多值,函数只能返回一个值。
? 过程的参数为 IN,OUT,INOUT
? 函数的参数为 IN(默认 )。
? 函数和过程均能产生新的电路模块。