第 4章
VHDL语言程序基本结构
EDA技术讲义
什么是 VHDL?
Very high speed integrated Hardware
Description Language (VHDL)
?是 IEEE,工业标准硬件描述语言
?用语言的方式而非图形等方式描述硬件电路
?容易修改
?容易保存
?特别适合于设计的电路有:
?复杂组合逻辑电路,如:
? 译码器、编码器、加减法器、多路选择器、地址译码器 …...
?状态机
?等等 ……..
EDA技术讲义
VHDL的功能和标准
VHDL 描述
?输入端口
?输出端口
?电路的行为和功能
VHDL有过两个标准:
?IEEE Std 1076-1987 (called VHDL 1987)
?IEEE Std 1076-1993 (called VHDL 1993)
EDA技术讲义
一般来说,一个完整的 VHDL程序通常包括 5个部分,
实体说明( Entity Declaration); (基本组成部分 )
结构体( Architecture Body); (基本组成部分 )
库( Library);
程序包 ( Package);
配置( Congiguration)。
VHDL程序组成
EDA技术讲义
1,对于 VHDL的编译器和综合器来说,程序文字的大小
写不加区分。
2,为了使程序结构清晰,易于阅读和调试,书写和输入
程序时,使用层次缩进格式,同一层次的语句对齐,
底层次的语句较高层次的语句缩进两个字符。
3,程序中的注释使用双横线,--”。在 VHDL程序的任
何一行中,双横线,--”后的文字都不参加编译和综
合。
相关约定
EDA技术讲义
【例 4-1】
ENTITY mux21a IS
PORT( a,b, IN BIT ;
s, IN BIT;
y, OUT BIT ) ;
END ENTITY mux21a ;
ARCHITECTURE one OF mux21a IS
BEGIN
y <= a WHEN s = '0' ELSE
b ;
END ARCHITECTURE one ;
实体说明
结构体
4.1 设计实体
图 4-1 mux21a实体
图 4-2 mux21a结构体
设计实体总由 实体说明 和 结构体 两部分构成
2选 1多路选择器的 VHDL描述
EDA技术讲义
【例 4-1】
ENTITY mux21a IS
PORT( a,b, IN BIT;
s, IN BIT;
y, OUT BIT ) ;
END ENTITY mux21a ;
实体说明
4.1 设计实体
图 4-1 mux21a实体
4.1.1 实体说明
任何一个基本设计单元的实体说明都具有如下结构:
ENTITY 实体名 IS
[类属参数说明 ] ;
[端口说明 ] ;
END [ENTITY] 实体名 ;
实体说明主要描述的是一个设计的外貌,即对外
的输入输出接口以及一些用于结构体的参数的定义。
EDA技术讲义
4.1 设计实体
4.1.1 实体说明
ENTITY 实体名 IS
[类属参数说明 ] ;
[端口说明 ] ;
END [ENTITY] 实体名 ;
类属参数说明:
类属参数说明主要用来为设计实体指定参数。
如用来定义端口的宽度、器件的延迟时间等。
必须放在端口说明之前。
例如:
GENERIC( m,time,=1 ns)
该语句指定了结构体内的 m值为 1 ns。
EDA技术讲义
4.1 设计实体
4.1.1 实体说明
ENTITY 实体名 IS
[类属参数说明 ] ;
[端口说明 ] ;
END [ENTITY] 实体名 ;
端口说明:
端口说明是对基本设计实体(单元)与外部
接口的描述,也可以说是 对外部引脚信号的
名称、数据类型和输入、输出方向的描述。
一般书写格式如下:
PORT( 端口名 {,端口名 }:方向 数据类型名;
……
端口名 {,端口名 }:方向 数据类型名);
例如,PORT( a,b, IN BIT;
s, IN BIT;
y, OUT BIT ) ;
EDA技术讲义
4.1 设计实体
4.1.1 实体说明
端口名:
PORT( 端口名 {,端口名 }:方向 数据类型名;
……
端口名 {,端口名 }:方向 数据类型名);
端口说明:
端口名是赋予每个外部引脚的名称,可以自由定义,但 不
能和 VHDL语言中的关键字重名。 一行里可以定义多个相
同数据类型的不同端口,它们之间用逗号隔开。通常用一
个或几个英文字母,或者用英文字母加数字命名。
EDA技术讲义
4.1 设计实体
4.1.1 实体说明
端口方向:
PORT( 端口名 {,端口名 }:方向 数据类型名;
……
端口名 {,端口名 }:方向 数据类型名);
端口说明:
端口方向用来定义外部引脚的信号方向是输入还是输出。
表示端口方向的说明符及含义:
IN —— 输入
OUT—— 输出(结构体内部不能再使用)
INOUT—— 双向,既可输入也可输出
BUFFER—— 输出(结构体内可再使用)
LINKAGE —— 不指定方向,无论哪个方向都可连接
EDA技术讲义
INOUT INOUT BUFFER
4.1 设计实体
4.1.1 实体说明
端口方向
EDA技术讲义
4.1 设计实体
4.1.1 实体说明
数据类型:
PORT( 端口名 {,端口名 }:方向 数据类型名;
……
端口名 {,端口名 }:方向 数据类型名);
端口说明:
在 VHDL语言中有十种数据类型:
BIT—— 位逻辑型(该端口信号值只能取,0”或,1”)
BIT_VECTOR—— 位矢量型(该端口可能是一组二进制位的值)
BOOLEAN —— 布尔代数型(取值有, false”和,true”两种)
STD _LOGIC—— 标准逻辑型
INTEGER —— 整型
UN _SIGNED —— 无符号型
EDA技术讲义
4.1 设计实体
4.1.1 实体说明
数据类型:
例:
PORT( a,IN BIT;
b,IN BIT;
bus, OUT BIT _VECTOR( 3 DOWNTO 0) ) ;
解释说明:
a,b为 BIT数据型;
bus为 BIT _VECTOR类型,该端口为一个四位宽端口。
( 3 DOWNTO 0) 最高位 bus[3],最低位 bus[0] 。
EDA技术讲义
4.1 设计实体
4.1.1 实体说明
数据类型:
在 VHDL 语言中,利用标准逻辑型( STD_LOGIC) 和
STD_LOGIC _VECTOR对端口或信号进行说明时。需在程
序的最开始部分加上如下语句:
LIBRARY IEEE;
USE IEEE,STD_LOGIC _1164.ALL;
这是用取自 IEEE库中 STD_LOGIC _1164程序包的
STD_LOGIC数据类型取代 BIT数据类型,
用 STD_LOGIC _VECTOR取代 BIT _VECTOR数据类型。
EDA技术讲义
1,标准逻辑位数据类型 STD_LOGIC
BIT数据类型定义,TYPE BIT IS('0','1');
STD_LOGIC数据类型定义:
TYPE STD_LOGIC IS ('U','X','0','1','Z','W','L','H','-');
STD_LOGIC所定义的 9种数据的含义是,
‘ U’表示未初始化的; ‘ X’表示强未知的; ‘ 0’ 表示强逻辑
0; ‘ 1’ 表示强逻辑 1; ‘ Z’表示高阻态; ‘ W’ 表
示弱未知的; ‘ L’表示弱逻辑 0; ‘ H’表示弱逻辑 1;
‘ -’ 表示忽略。
4.2 结构体的子结构描述 4.1 设计实体
EDA技术讲义
【例 4-1】
ARCHITECTURE one OF mux21a IS
BEGIN
y <= a WHEN s = '0' ELSE
b ;
END ARCHITECTURE one ;
结构体
4.1 设计实体
图 4-2 mux21a结构体
4.1.2 结构体
结构体 是一个基本设计单元实体,它具体地指明了该基本
设计单元的行为、元件及内部的连接关系,也就是说它 定义了
设计单元具体的功能。
结构体对其基本设计单元的输入输出关系可用三种方式进行描述
1、行为描述(基本设计单元的数学模型描述); (behavioral)
2、寄存器传输描述(数据流描述); (dataflow)
3、结构描述(逻辑元件单元连接描述)。 (structural)
不同的描述方式只是在描述语句上不同,而结构体的结构是完全一样的。
EDA技术讲义
ARCHITECTURE 结构体名 OF 实体名 IS
[结构体说明语句 ] ;内部信号、常数、数据类型、函数等的定义
BEGIN
[功能描述语句 ];
END [ARCHITECTURE] 结构体名 ;
4.1 设计实体
4.1.2 结构体
结构体的语言格式:
结构体名,
结构体名是对本结构体的命名,它是该结构体的唯一标识
符,OF后紧跟的实体名表明了该结构体所对应的是哪一个实体
说明,通过这个实体名将结构体和实体说明联系起来。
一般建议用 behave,dataflow,structure来为结构体命名。
EDA技术讲义
ARCHITECTURE 结构体名 OF 实体名 IS
[结构体说明语句 ] ;内部信号、常数、数据类型、函数等的定义
BEGIN
[功能描述语句 ];
END [ARCHITECTURE] 结构体名 ;
4.1 设计实体
4.1.2 结构体
结构体的语言格式:
结构体说明语句,
结构体说明语句定义的信号、常数等只能在该结构体内部
使用。
信号的定义和实体说明中的端口说明一样,应该有信号名和
数据类型说明。 不需要方向说明。
EDA技术讲义
ARCHITECTURE 结构体名 OF 实体名 IS
[结构体说明语句 ]; 内部信号、常数、数据类型、函数等的定义
BEGIN
[功能描述语句 ];
END [ARCHITECTURE] 结构体名 ;
4.1 设计实体
4.1.2 结构体
结构体的语言格式:
功能描述语句,
具体描述了结构体的行为和结构。这些功能描述语句是并行
描述语句。主要包括 5种不同类型的并行语句。
块语句、进程语句、信号赋值语句、子程序调用语句、元件
例化语句。
EDA技术讲义
4.2 结构体的子结构描述
三种子结构描述语句:
块( BLOCK) 描述语句结构;
进程( PROCESS) 语句结构;
子程序( SUBPROGRAMS) 结构。
EDA技术讲义
4.2 结构体的子结构描述
4.2.1 块语句书写结构
[块标号,] BLOCK [保护表达式 ]
[类属子句 [类属接口表; ]; ]
[端口子句 [端口接口表; ]; ]
[块说明部分; ]
BEGIN
<块语句部分; >
END BLOCK [块标号 ] ;
EDA技术讲义
4.2.2 进程语句格式
PROCESS语句结构的一般表达格式如下:
[进程标号, ] PROCESS [ ( 敏感信号参数表 ) ] [IS]
[进程说明部分 ]
BEGIN
顺序描述语句
END PROCESS [进程标号 ];
4.2 结构体的子结构描述
EDA技术讲义
D触发器的 VHDL描述
【 例 】
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
ENTITY DFF1 IS
PORT (CLK, IN STD_LOGIC ;
D, IN STD_LOGIC ;
Q, OUT STD_LOGIC );
END DFF1;
ARCHITECTURE bhv OF DFF1 IS
SIGNAL Q1, STD_LOGIC ; --类似于在芯片内部定义一个数据的暂存节点
BEGIN
PROCESS (CLK)
BEGIN
IF CLK'EVENT AND CLK = '1'
THEN Q1 <= D ;
END IF;
Q <= Q1 ; --将内部的暂存数据向端口输出
END PROCESS ;
END bhv;
D触发器
4.2 结构体的子结构描述
EDA技术讲义
VHDL描述的语言现象说明
1,标准逻辑位数据类型 STD_LOGIC
BIT数据类型定义,TYPE BIT IS('0','1');
STD_LOGIC数据类型定义:
TYPE STD_LOGIC IS ('U','X','0','1','Z','W','L','H','-');
STD_LOGIC所定义的 9种数据的含义是,
‘ U’表示未初始化的; ‘ X’表示强未知的; ‘ 0’ 表示强逻辑
0; ‘ 1’ 表示强逻辑 1; ‘ Z’表示高阻态; ‘ W’ 表
示弱未知的; ‘ L’表示弱逻辑 0; ‘ H’表示弱逻辑 1;
‘ -’ 表示忽略。
4.2 结构体的子结构描述
EDA技术讲义
VHDL描述的语言现象说明
2,设计库和标准程序包
3,SIGNAL信号定义和数据对象
【 例 】
ARCHITECTURE bhv OF DFF1 IS
SIGNAL Q1, STD_LOGIC ;
BEGIN
PROCESS (CLK)
BEGIN
IF CLK'EVENT AND CLK = '1'
THEN Q1 <= D ;
END IF;
Q <= Q1 ;
END PROCESS ;
END bhv;
使用库和程序包的一般定义表式是:
LIBRARY <设计库名 >;
USE < 设计库名 >.<程序包名 >.ALL ;
4.2 结构体的子结构描述
三种类型数据对象:
信号 signal
变量 variable
常数 constant
EDA技术讲义
VHDL数据对象( Data Objects)
常量( Constant)
固定值,不能在程序中被改变
增强程序的可读性,便于修改程序
可在 Package,Entity,Architecture,Process、
Function,Procedure中进行定义,其有效范围也相应
限定
书写格式:
Constant 常量名 [,常量名 …],数据类型 [,=表达式 ];
例,Constant data_bus_width,integer,= 8;
EDA技术讲义
VHDL数据对象( Data Objects)
信号( Signals)
代表连线,Port也是一种信号
没有方向性,可给它赋值,也可当作输入
在 Package,Entity,Architecture中定义
设定的初始值在综合时没有用,只是在仿真时在开
始设定一个起始值。
用 <= 进行赋值
用, = 进行初始化
signal count,bit_vector(3 downto 0):=“0011”;
EDA技术讲义
VHDL数据对象( Data Objects)
变量( Variable)
临时数据,没有物理意义
只能在 Process,Function,Procedure中定义,并只
在其内部有效,
要使其全局有效,先转换为 Signal。
用,= 进行赋值
用,= 进行初始化
variable result, std_logic,= ?0?;
EDA技术讲义
信号与变量的区别
architecture rtl of start is
signal count, integer range 0 to 7;
begin
process(clk)
begin
if (clk'event and clk='1') then
count <= count + 1;
if(count=0) then
carryout <= '1';
else
carryout <= '0';
end if;
end if;
end process;
end rtl;
architecture rtl of start is
begin
process(clk)
variable count, integer range 0 to 7;
begin
if (clk'event and clk='1') then
count,= count + 1;
if(count=0) then
carryout <= '1';
else
carryout <= '0';
end if;
end if;
end process;
end rtl;
EDA技术讲义
信号与变量的区别
architecture a of start is
signal tmp, std_logic;
begin
process(a_bus)
begin
tmp <= '1';
for i in 3 downto 0 loop
tmp <= a_bus(i) and tmp;
end loop;
carryout <= tmp;
end process;
end a;
architecture a of start is
begin
process(a_bus)
variable tmp:std_logic;
begin
tmp,= '1';
for i in 3 downto 0 loop
tmp,= a_bus(i) and tmp;
end loop;
carryout <= tmp;
end process;
end a;
EDA技术讲义
VHDL描述的语言现象说明
4,上升沿检测表达式
关键词 EVENT是信号属性, VHDL通过以下表式来测定某
信号的 跳变边沿,
4.2 结构体的子结构描述
信号名 'EVENT AND (信号名 ='1') AND (信号名 'LAST_VALUE='0')
信号名 =‘1’ AND 信号名 ’LAST_VALUE=’0’
rising_edge(信号名 ) -- 信号 的数据类型必须是 STD_LOGIC
信号名 ’EVENT -- 如 CLK’EVENT
wait until 信号名 = '1’; --利用 wait语句
EDA技术讲义
实现时序电路的 VHDL不同表达方式
【 例 】
...
PROCESS (CLK)
BEGIN
IF CLK'EVENT AND (CLK='1') AND (CLK'LAST_VALUE='0')
THEN Q <= D ; --确保 CLK的变化是一次上升沿的跳变
END IF;
END PROCESS ;
【 例 】
...
PROCESS (CLK)
BEGIN
IF CLK=‘1’ AND CLK’LAST_VALUE=‘0’ --同上例
THEN Q <= D ;
END IF;
END PROCESS ;
4.2 结构体的子结构描述
EDA技术讲义
实现时序电路的 VHDL不同表达方式
【 例 】
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
ENTITY DFF3 IS
PORT (CLK, IN STD_LOGIC ;
D, IN STD_LOGIC ;
Q, OUT STD_LOGIC );
END ENTITY DFF3 ;
ARCHITECTURE bhv OF DFF3 IS
SIGNAL Q1, STD_LOGIC;
BEGIN
PROCESS (CLK)
BEGIN
IF rising_edge(CLK) -- CLK的数据类型必须是 STD_LOGIC
THEN Q1 <= D ;
END IF;
Q <= Q1 ;
END PROCESS ;
END ARCHITECTURE bhv ;
4.2 结构体的子结构描述
EDA技术讲义
4.2 结构体的子结构描述
4.2.3 子程序结构
子程序 是在主程序调用它以后能够将处理结果返回主程序的模块

有两种类型子程序:过程( procedure),函数( function)。
子程序可以在程序包、结构体、实体说明和进程中定义。
过程( procedure),用来定义一个算法,可以具有多个返回值或
不产生返回值。形式参数可以有三种方式( 模式 ),in, out、
inout。 数据对象有三种类型。
函数( function),用来产生一个值,只能具有一个返回值。形式
参数只有 in方式( 模式 ) 。数据对象只有常量和信号两类。
EDA技术讲义
4.2 结构体的子结构描述
1,过程 书写结构
procedure <过程名 > (参数表) is
[过程说明 ; ]
begin
<过程语句部分; >
end procedure <过程名 > ;
参数表:
( [数据对象 ]参数名 [,参数名 ……], [模式 ]数据类型;
[数据对象 ]参数名 [,参数名 ……], [模式 ]数据类型;
…… )
EDA技术讲义
4.2 结构体的子结构描述
1,过程 书写结构
过程说明:
主要包括变量说明、常量说明和类型说明,用来对过
程中要用到的变量、常数和类型进行说明,并且这些
说明只在该过程内有效。
过程语句:
是由顺序语句组成的,过程的调用实际上就是启动了对
过程中的顺序语句的执行。
EDA技术讲义
4.2 结构体的子结构描述
2,过程 设计实例
Procedure example
( signal d, in std_logic;
signal clk, in std_logic;
signal reset, in std_logic;
signal q,qb, out std_logic ) is
Begin
if (reset=‘0’) then
q<=‘0’;
qb<=‘1’;
elsif (clk’event and clk=‘1’) then
q<= d;
qb<= not d;
end if;
End example;
EDA技术讲义
4.2 结构体的子结构描述
3,函数 书写结构
Function <函数名 >(参数表) return <数据类型 > is
[函数说明; ]
Begin
<函数语句部分; >
Return ( 表达式);
End [function] <函数名 >;
EDA技术讲义
4.2 结构体的子结构描述
4,函数 设计实例
Function max
(constant a,std_logic_vector;
b,std_logic_vector) return std_logic_vector is
variable tmp, std_logic_vector (a’range);
Begin
if (a>b) then
tmp:=a;
else
tmp:=b;
end if;
return (tmp);
End max;
EDA技术讲义
library ieee;
use ieee.std_logic_1164.all;
entity example is
port ( inp,in std_logic_vector(0 to 2);
oup,out std_logic_vector(0 to 2));
end entity example;
architecture ex of example is
function sam (x,y,z,in std_logic)
return std_logic is
begin
return (x and y)or z;
end function sam;
begin
process(inp)
begin
oup(0)<=sam(inp(0),inp(1),inp(2));
oup(1)<=sam(inp(1),inp(2),inp(0));
oup(2)<=sam(inp(2),inp(0),inp(1));
end process ;
end architecture ex;
4.2 结构体的子结构描述
4,函数 设计实例
EDA技术讲义
VHDL语言在进行任何操作的过程中,对数据的类型都有严格的要求,但
是,对名称的要求并不严格,同一名称可以定义成使用不同类型数据参数的
子程序或类型。这样就可以对 VHDL的子程序进行重载。
4.3 子程序的重载
所谓重载 就是允许设计人员编写更加可读的 VHDL源代码,在多个子程序
或类型有同一名称时,该名称被重载。
这样在应用到具体设计中时,VHDL编译器就将会选择相适应的一个目标
。重载可以使设计人员避免为了重复操作而书写多个不同名字的子程序,使
VHDL源代码易于维护,易于使用。
子程序重载就是允许设计人员编写相同名字的两个或两个以上的子程序,
并且允许这些子程序的参数使用不同的数据类型。
子程序重载分为函数的重载和过程的重载。
EDA技术讲义
4.3 子程序的重载
4.3.1 过程的重载
子程序重载的过程重载类似于函数的重载。在调用过程中使用哪
一个子程序由下列条件决定的:
1、子程序调用过程中的参数的数目;
2、子程序调用过程中参数的数据类型;
3、子程序调用过程中使用的带名字的参数关联时参数的名字;
4、子程序为函数时返回值的类型。
EDA技术讲义
4.3 子程序的重载
4.3.2 函数的重载
设计人员在定义函数时,可以使用相同的函数名定义多个函
数,但是在调用时具体使用哪一个函数是由以下条件决定的:
1、子程序调用函数时参数的数目;
2、子程序调用函数时参数的数据类型;
3、子程序调用函数时使用的带名字的参数关联时参数的名字;
4、子程序调用函数时返回值的类型。
例子,(求最大值

EDA技术讲义
4.4 结构体的三种描述方式
1、行为描述 (behavioral)
2、数据流描述 (dataflow)
3、结构化描述 (structural)
EDA技术讲义
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 ;
高层次的功能描述,不必考虑
在电路中到底是怎样实现的。
4.4.1 结构体行为描述方式
4.4 结构体的三种描述方式
EDA技术讲义
Architecture dataflow1 of eqcomp4 is
begin
equal <= ?1? when a=b else ?0?;
end dataflow1;
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;
当 a和 b的宽度发生变化时,
需要修改设计,当宽度过
大时,设计非常繁琐
4.4.2 结构体数据流描述方式
描述输入信号经过怎样的变换得到输出信号
4.4 结构体的三种描述方式
EDA技术讲义
architecture struct of eqcomp4 is
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;
类似于电路的网络表,将各个
器件通过语言的形式进行连接,
与电路有一一对应的关系。
一般用于大规模电路的层次化
设计时。
4.4.3 结构体结构描述方式
4.4 结构体的三种描述方式
EDA技术讲义
描述方式 优 点 缺 点 适用场合
结构化描述 连接关系清晰电路模块化清晰 电路不易理解 繁琐、复杂 电路层次化设计
数据流描述 布尔函数定义明白 不易描述复杂电路 修改不易 小门数设计
行为描述 电路特性清楚明了 进行综合效率相对较低 大型复杂的电路 模块设计
三种描述方式比较
4.4 结构体的三种描述方式