Upload
others
View
7
Download
0
Embed Size (px)
Citation preview
1
5.1 VHDL程序的基本结构
设计外部(称为实体,可视部分) --端口描述
内部(称为结构体,不可视部分)--设计的功能和算法描述{
基本结构:
实体说明描述所设计的系统的外部接口信号
结构体描述系统内部的结构和行为
程序包存放各设计模块都能共享的数据类型、常数和子程序等
库存放已经编译的实体、构造体、包集合和配置
配置从库中选取所需要的单元组成系统设计的不同版本
2
5.1.1 实体说明
实体说明描述的是一个设计的外貌,即描述实体的外部接口情况以及实体内的类属参数等。
实体(ENTITY)是任意系统的抽象,实体的电路意义相当于器件。
一块电路板、一个芯片、一个电路单元甚至一个门电路等都可看
作一个实体。
对系统进行分层设计时,各层的设计模块都可作为实体。
顶层的系统模块是顶级实体,低层次的设计摸块是低级实体。
描述时,高级实体可将低一级实体当作元件来调用。
3
【程序5.1.1】ENTITY mux21a ISPORT( a, b : IN BIT ;
s : IN BIT; y : OUT BIT) ;
END ENTITY mux21a ;
ab
sy
mux21a
图5.1.1 2选1数据选择器
例:2选1数据选择器的实体描述
ENTITY <实体名> IS
[端口说明部分];
END [ENTITY] <实体名> ;
实体说明的格式:
[参数说明部分];
实体说明以“ENTITY <实体名> IS” 开始,至 END [ENTITY] <实体名>” 结束。
4
其中:
ENTITY mux21a IS
PORT( a, b : IN BIT;
s : IN BIT;
y : OUT BIT);
END ENTITY mux21a ;
(2)端口模式:说明信号的方向,有以下几种模式:
IN 输入信号;
OUT 输出信号;
INOUT 双向信号;
BUFFER 输出信号,但可在内部反馈使用(缓冲);
BUFFER是INOUT的子集,但作输入用时,信号不是由外部驱动,而是
从输出反馈得到。
参数说明主要为设计实体指定参数,如端口宽度、器件延迟时间等;
端口说明描述的是设计实体和外部的接口,具体说就是对端口
名称、端口模式和端口数据类型进行说明。
(1)端口名称:输入输出信号的名称,在实体中必须是唯一的。
5
(3)端口数据类型:端口信号的取值类型
明确地指定和严格地定义端口信号的取值类型是VHDL的重要特点
即所谓的强数据类型,这是学习VHDL应特别注意之处
ENTITY mux21a IS
PORT( a, b : IN BIT ;
s : IN BIT;
y : OUT BIT ) ;
END ENTITY mux21a ;
VHDL中常见的数据类型有以下几种:
BIT 位类型,取值0、l
BIT_VECTOR 位向量类型,是BIT的组合
INTEGER 整数类型,可用作循环的指针或常数
BOOLEAN 布尔类型,取值FALSE、TRUE
STD_LOGIC 工业标准的逻辑类型,取值0、1、X、Z等
STD_LOGIC_VECTOR 工业标准的逻辑向量类型,是STD_ LOGIC的组合
6
例:用VHDL描述图5.1.2所示实体说明
d[15:0] q1[15:0]
clk q2[15:0]
reset int
oe opt
图5.1.2 example2 实体端口
d[15:0]是16位输人总线; clk、reset、oe是输入信号;
q1[15:O]是16位三态输出总线;q2[15:0]是16位双向总线;
int是输出信号,也反馈到内部使用; opt是三态输出信号。
7
Example 的实体说明如下:
【程序5.1.2】
ENTITY example2 IS
END example2;
d[15:0] q1[15:0]clk q2[15:0]
reset intoe opt
PORT ( d: IN STD_ LOGIC_VECTOR (15 DOWNTO 0);
clk, reset, oe: IN STD_LOGIC;
q1: OUT STD_LOGIC_VECTOR (15 DOWNTO 0);
q2: INOUT STD_LOGIC_VECTOR(15 DOWNTO 0);
int: BUFFER STD_LOGIC;
opt: OUT STD_LOGIC );
8
5.1.2 结构体
1.结构体的概念
结构体(Architecture )描述的是实体内部的逻辑功能。
在电路上相当于器件的内部电路结构.
a
bs
ymux21a
例:数据选择器的结构体描述
【程序5.1.3】ARCHITECTURE one OF mux21a IS
BEGIN
y <= a WHEN s = ' 0 ' ELSE
b;
END ARCHITECTURE one;
9
[结构体说明部分]
(1)OF后的实体名应与实体说明中的实体名一致
结构体的基本格式:
(2)功能描述语句是结构体中的主要部分,用于描述所实现实体的
功能四种不同类型的并行语句:
(3)说明语句是对结构体的功能描述语句中将要用到的信号、数据类型、常数、元件、函数和过程等加以说明
进程语句 信号赋值语句
子程序调用语句 元件例化语句
ARCHITECTURE <结构体名> OF <实体名> IS
<功能描述语句>
END [ARCHITECTURE] <结构体名> ;
BEGIN
【程序4.1.3】
ARCHITECTURE one OF mux21a IS
BEGIN
y <= a WHEN s = ' 0 ' ELSE
b;
END ARCHITECTURE one;
10
2.结构体的描述方式
(1)行为描述方式:
对设计实体的数学模型的描述,其抽象程度最高。
类似于高级编程语言,无需知道电路的具体结构。
优点是只需描述输入与输出的行为,不关注具体的电路实现。
(2)数据流描述方式:
从信号到信号的数据流动的路径形式进行描述。
设计人员对设计实体的功能实现要有一定的了解,有时还需对电路
的具体结构有清楚的认识。
优点是易于进行逻辑综合,综合效率较高。
在VHDL中,允许设计人员采用不同的描述风格来进行设计实体中结构体的书写,结构体的描述方式通常有三种:行为描述方式、数据流描述方式和结构描述方式。
11
(3)结构描述方式:
指在多层次的设计中,通过调用库中的元件或是已设计好的模块来完
成实体功能的描述。
结构描述方式只表示元件(或模块)和元件(或模块)之间的互连,
就像网表一样。
优点是可以将已有的设计成果用到当前的设计中去,因而大大提高设
计效率,对于可分解的大型设计,结构描述方式是首选方案。
另外也可以使用上述三种描述方式的组合来进行结构
体的描述,即混合描述方式。
12
【程序5.1.4】
ENTITY rsf IS
PORT (set, reset: IN BIT;
q,qb : BUFFER BIT);
END rsf;
下面以 RS 触发器为例说明三种描述方式的使用方法
R-S触发器的实体描述:
& &
q qb
set reset
RS触发器set
reset
q
qb
13
【程序5.1.5】ARCHITECTURE rs_alg OF rsf IS
BEGIN
PROCESS(set, reset) - - 进程
VARIABLE last_state: BIT; - - 给输出q一个状态变量定义
BEGIN
IF set = '1' AND reset = '1' THEN
last_state : = last_state;
ELSIF set = '0' AND reset = '1' THEN
last_state : = '1';
ELSIF set = '1' AND reset = '0' THEN
last_state : = '0';
END IF;
q <= last_state; - - 给输出信号赋值
qb <= NOT (last_state);
END PROCESS;
END rs_alg;
行为描述方式:
进程
敏感信号表
14
进程语句PROCESS: PROCESS(set, reset)
括号中的set, reset信号称为敏感信号,是该进程的
激活条件.
注意:
进程中的语句是顺序语句,它们之间不是并行关系,执
行时是按书写的先后次序顺序执行的。
行为描述方式描述的是与硬件电路结构无关的算法关系,
所以应该按算法的流程顺序执行。
只要set和reset信号有一个发生变化,该进程中的语句就
会被顺序地执行一遍
15
数据流描述方式:
【程序5.1.6】ARCHITECTURE rs_behav OF rsf IS
BEGIN
q <= NOT( qb AND set );
qb <= NOT( q AND reset);
END rs_behav;
q和qb两句信号赋值语句之间是并行的关系,即只要
输人set和reset发生了变化,这两个语句就会同时被执行,
产生相应的输出。
和一般程序设计语言的顺序执行的情况不同,这里是和
硬件电路的工作情况是一致的。
& &
q qb
set reset
16
【程序5.1.7】
ARCHITECTURE rs_struc OF rsf IS
COMPONENT nand2 - - 元件说明
PORT (a,b: IN BIT ;
c: OUT BIT );
END COMPONENT;
BEGIN
u1:nand2 port map(a=>set,b=>qb,c=>q); - - 元件例化语句
u2:nand2 port map(a => reset, b => q, c => qb);
END rs_struc;
结构描述方式:
& &
q qb
set reset
17
5.1.3 库、程序包
VHDL的基本结构由前述的实体和结构体组成,但实际中
的VHDL程序除上述两个基本部分以外通常还包括另外三个部
分:库、程序包和配置。
程序包:主要用来存放各个设计都能共享的数据类型、
子程序、常数和元件等;
库:主要用来存放已经编译的实体、结构体、程序包等;
18
VHDL库中的各个设计单元(实体、结构体、程序包和配置)
都可以用作其他设计的资源,一个设计可以使用多个库中的设
计单元。
当一个设计要使用库中的已编译单元时,必须要在每个设
计的VHDL源代码的开头说明要引用的库,然后使用USE子句指明
要使用库中的哪一个设计单元。
(1)库说明语句格式: library <库名>;
以library 开头,后面紧跟着设计中要使用的库的名字。
库说明语句使该库对于设计可见。
(2)USE子句格式: use <库名>.<程序包名>.all;
库名是前面库说明语句中说明的库。
程序包名是设计中要使用的库中的设计单元。
all表示使用程序包中的所有项目。
1. 库
19
ENTITY example2 IS
PORT (d: IN STD_ LOGIC_VECTER (15 DOWNTO 0);
clk, reset, oe: IN STD_LOGIC;
q1: OUT STD_LOGIC_VECTER (15 DOWNTO 0);
q2: INOUT STD_LOGIC_VECTER (15 DOWNTO 0);
int: BUFFER STD_LOGIC;
opt: OUT STD_LOGIC );
END example2;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
20
(3)库的种类
VHDL提供的库可以分为两大类:设计库和资源库。
设计库对当前设计是可见的,使用时一般无需进行说明。
资源库是用来存放常规元件和常用模块的库,使用时首先要进行说明。
STD库是VHDL的标准库,该库定义了两个标准程序包:
standard中定义了bit、bit_vector、character和time等数据类型。textio中主要包括了对文本文件进行读写操作的过程和函数
①设计库:包括STD库和WORK库。
WORK库是VHDL的标准工作库,主要用于存放用户设计和定义的一些设计单元和程序包。该库是用户的临时仓库,用户设计项目的半成品、成品以及先期设计的元件都放在该库中。
(该包在使用时应先说明库和包集合名) 。
(无需用LIBRARY声明库,但必须用USE声明程序包)
21
③ALTERA库:ALTERA公司自己提供的VHDL库
该库主要包括:MEGACORE程序包。
使用时需声明:LIBRARY ALTERA;
USE ALTERA.MEGACORE.ALL;
②资源库:
除STD库和WORK库以外,常见资源库如下:
IEEE库是最常用的资源库,其中含有 std_logic_1164、numeric_bit、 numeric_std等程序包,
还包括std_logic_signed、std_logic_unsigned和std_logic_arith等非IEEE标准的程序包。
④ LPM库: ALTERA公司自己提供的参数化宏单元的VHDL库
该库包括:LPM_COMPONENTS程序包。使用元件例化语句调
用时需声明:LIBRARY LPM;
USE LPM.LPM_COMPONENTS.ALL;
22
(4)库说明的作用范围:
从一个实体开始,到它所属的结构体和配置为止,或
者从一个程序包的说明开始,到该程序包定义结束为止。
当一个源程序中出现两个以上的实体时,库说明语句
应在每个实体说明语句前重复书写。
23
在VHDL中,设计的实体说明和结构体中定义的数据类型、子程序说明、属性说明和元件说明等部分只能在该设计实体中使用,而对于其他设计实体是不可见的。为减少重复定义工作,VHDL提出了程序包的概念,用来存放能够共享的数据类型、子程序说明、属性说明和元件说明等。
程序包说明部分:主要对数据类型、子程序、常量和元件等进行说明。PACKAGE 程序包名 IS -- 程序包首
程序包说明语句
END 程序包名;
程序包体部分:用来规定程序包的实际功能。
(1)一个程序包通常由以下两个部分组成:
PACKAGE BODY 程序包名 IS -- 程序包体
程序包体说明语句以及包体内容
END 程序包名;
2.程序包
24
【程序5.1.9】
- - 程序包说明
PACKAGE example IS
TYPE alu_op IS (add, sub, mul, div, eq, gt, lt); - - 枚举类型
CONSTANT pi: REAL := 3.14159265; - - 常量
delay1: TIME; - - 延时常量
COMPONENT nand2 - - 元件
PORT (a,b:in bit; c: out bit);
END COMPONENT;
FUNCTION mean (a,b,c: real) RETURN REAL; - - 函数
END example;
25
- - 程序包体
PACKAGE BODY example IS
CONSTANT delay1: TIME:= 15ns; - - 定义延时常量的值
FUNCTION mean (a,b,c: real) RETURN real IS - - 具体的函数
BEGIN
RETURN (a + b +c )/3.0; - - 求平均值
END mean;
END example;
26
(2)常用的预定义程序包:
库名 程序包名 包中预定义内容
std standard VHDL类型,如bit,bit_vector
ieee Std_logic_1164 定义std_logic,std_logic_vector等
ieee Std_logic_arith 定义有符号(unsigned)与无符号(signed)类型,及该类型的运算
ieee Std_logic_signed 定义基于std_logic与std_logic_vector类型上的有符号的算数运算
ieee Std_logic_unsigned 定义基于std_logic与std_logic_vector类型上的无符号的算数运算
27
5.1.4 配置
配置可以把特定的
结构体指定给一个确定的实体。
当对实体进行仿真时可为同一实体配置不同的结构体以
比较其差别;为例化的各元件实体配置指定的结构体,从而
形成一个所希望的例化元件层次构成的设计实体。
配置语句的一般格式如下:
CONFIGURATION <配置名> OF <实体名> IS
FOR <选配结构体名>
END FOR;
END [<配置名>];
28
例 :
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY nand2 IS
PORT (a,b:IN STD_LOGIC;
c:OUT STD_LOGIC);
END ENTITY nand2;
ARCHITECTURE two OF nand2 IS
BEGIN
c<=‘1’WHEN (a=‘0’)AND(b=‘0’)ELSE
‘1’WHEN (a=‘0’)AND(b=‘1’)ELSE
‘1’WHEN (a=‘1’)AND(b=‘0’)ELSE
‘0’WHEN(a =‘1’)AND(b=‘1’)ELSE
‘0’;
END ARCHITECTURE two;
ARCHITECTURE one OF nand2 ISBEGINc <= NOT(a AND b);
END ARCHITECTURE one;
CONFIGRATION second OF nand2 IS
FOR two
END FOR;
END second;
CONFIGRATION first OF nand2 IS
FOR one
END FOR;
END first;
------------------------------------------
-----------------------------------------------------------------------------------
29
VHDL程序结构
配 置
结 构 体
库、程序包
实 体
30
VHDL语法小结VHDL 库: 使用LIBRARY语句打开
常用的有:STD、WORK 、IEEE等
程 序 包:需要时可使用USE语句打开,常用的包括:
STANDARD、TEXTIO、STD_LOGIC_1164、
STD_LOGIC_ARITH、STD_LOGIC_SIGNED、
STD_LOGIC_UNSIGNED 等
实体说明: ENTITY name … END ENTITY name;
结 构 体: ARCHITECTURE name OF entity_name …
END ARCHITECTURE name
三种描述方式:行为描述方式、数据流描述方式、结构描述方式