第三章 硬件描述语言 VHDL

115
1 第第第 第第第第第第 VHDL

description

第三章 硬件描述语言 VHDL. 3.1.1 什么是 VHDL ? VHDL : V HSIC (Very High Speed Integrated Circuit) H ardware D escription L anguage. 3.1 概述. 3.1.2 VHDL 的历史 80 年代初由美国国防部在实施超高速集成电 路( VHSIC )项目时开发的。 1987 年由 IEEE 协会批准为 IEEE 工业标准, 称为 IEEE1076-1987 。 各 EDA 公司相继推出支持 VHDL 的设计环境。 - PowerPoint PPT Presentation

Transcript of 第三章 硬件描述语言 VHDL

Page 1: 第三章  硬件描述语言 VHDL

1

第三章 硬件描述语言 VHDL

Page 2: 第三章  硬件描述语言 VHDL

2

3.1.1 什么是 VHDL ?

VHDL : VHSIC (Very High Speed Integrated Circuit)

Hardware

Description

Language

3.1 概述

Page 3: 第三章  硬件描述语言 VHDL

3

3.1.2 VHDL 的历史

80 年代初由美国国防部在实施超高速集成电路( VHSIC )项目时开发的。 1987 年由 IEEE 协会批准为 IEEE 工业标准,称为 IEEE1076-1987 。 各 EDA 公司相继推出支持 VHDL 的设计环境。 1993 年被更新为 93 标准,即 IEEE1076-1993 。进一步提高抽象描述层次,扩展系统描述能力。

Page 4: 第三章  硬件描述语言 VHDL

4

3.1.3 VHDL 的作用

1 ) VHDL 打破软、硬件的界限 传统的数字系统设计分为: 硬件设计(硬件设计人员) 软件设计(软件设计人员)

是电子系统设计者和 EDA 工具之间的界面

Page 5: 第三章  硬件描述语言 VHDL

5

EDA 工具及 HDL 的流行,使电子系统向集 成化、大规模和高速度等方向发展。 美国硅谷约有 80% 的 ASIC 和 FPGA/CPLD

已采用 HDL 进行设计。

2 ) VHDL 与 C 、 C++ 的比较:

C 、 C++ 代替汇编等语言 VHDL 代替原理图、逻辑状态图等

Page 6: 第三章  硬件描述语言 VHDL

6

3 ) VHDL 与电原理图描述的比较:

VHDL 具有较强的抽象描述能力,可进行系统行为级别的描述。描述更简洁,效率更高。 VHDL 描述与实现工艺无关。

电原理图描述必须给出完整的、具体的电路结构图,不能进行描象描述。描述繁杂,效率低。 电原理图描述与实现工艺有关。

Page 7: 第三章  硬件描述语言 VHDL

7

3.1.4 VHDL 语言特点 ①VHDL 具有强大的语言结构,系统硬件描述能力强、设计效率高;具有较高的抽象描述能力。 如:一个可置数的 16 位计数器的电原理图:

Page 8: 第三章  硬件描述语言 VHDL

8

用 VHDL 描述的可置数 16 位计数器:

Page 9: 第三章  硬件描述语言 VHDL

9

②VHDL 语言可读性强,易于修改和发现错误。 ③VHDL 具有丰富的仿真语句和库函数,可对 VHDL 源代码进行早期功能仿真,有利于大 系统的设计与验证。 ④VHDL 设计与硬件电路关系不大。 ⑤VHDL 设计不依赖于器件,与工艺无关 。 ⑥ 移植性好。 ⑦VHDL 体系符合 TOP-DOWN 和 CE (并行工 程)设计思想。 ⑧VHDL 设计效率高,产品上市时间快,成本低。 ⑨ 易于 ASIC 实现。

Page 10: 第三章  硬件描述语言 VHDL

10

3.1.5 VHDL 与其它硬件描述语言的比较

VHDL : 具有较强的系统级抽象描述能力,适合行为级和 RTL 级的描述。设计者可不必了解电路细节,所作工作较少,效率高。但对综合器的要求高,不易控制底层电路的生成。 IEEE 标准,支持广泛。

行为级 RTL 级 门电路级

RTL: Register Translate Level

Page 11: 第三章  硬件描述语言 VHDL

11

Verilog HDL : 系统级抽象描述能力比 VHDL 稍差;门级开关电路描述方面比 VHDL 强。适合 RTL 级和门电路级的描述。设计者需要了解电路细节,所作工作较多。 IEEE 标准,支持广泛。

ABEL 、 PALASM 、 AHDL(Altera HDL) : 系统级抽象描述能力差,一般作门级电路描述。要求设计者对电路细节有详细的了解。对综合器的性能要求低,易于控制电路资源。支持少。

Page 12: 第三章  硬件描述语言 VHDL

12

3.1.6 VHDL 设计简述

VHDL 主要用于描述数字系统的结构、行为、功能和接口。

VHDL 将一个设计(元件、电路、系统)分为: 外部(可视部分、端口) 内部(不可视部分、内部功能、算法)

Page 13: 第三章  硬件描述语言 VHDL

13

外部与内部:

器件或

子系统

ARCHITECTURE

Process Process

ENTITY

SequentialProcess

Combinational Processports ports

component

Page 14: 第三章  硬件描述语言 VHDL

14

2 选 1 选择器的 VHDL 描述:

Page 15: 第三章  硬件描述语言 VHDL

15

VHDL 语言的一些基本特点: VHDL 语言由保留关键字组成; 一般, VHDL 语言对字母大小写不敏感; 例外:‘ ’、“ ”所括的字符、字符串; 每条 VHDL 语句由一个分号(;)结束; VHDL 语言对空格不敏感,增加可读性; 在“ --” 之后的是 VHDL 的注释语句; VHDL 有以下描述风格: 行为描述; 数据流(寄存器传输 RTL )描述; 结构化描述;

Page 16: 第三章  硬件描述语言 VHDL

16

基本结构包括:

实体( Entity ) 结构体( Architecture ) 配置( Configuration ) 库( Library )、程序包( Packag

e )

3.2 VHDL 程序基本结构

Page 17: 第三章  硬件描述语言 VHDL

17

库、程序包

实体( Entity )

结构体

( Architecture )

进程 或其它并行结构

配置( Configuration )

Page 18: 第三章  硬件描述语言 VHDL

18

3.2.1 实体(说明) 实体(说明):

定义系统的输入输出端口语法:

ENTITY <entity_name> IS Generic Declarations Port DeclarationsEND <entity_name>; (1076-1987 version)END ENTITY <entity_name> ; ( 1076-1993 version)

Page 19: 第三章  硬件描述语言 VHDL

19

1 、类属说明

类属说明: 确定实体或组件中定义的局部常数。模块化设计时多用于不同层次模块之间信息的传递。可从外部改变内部电路结构和规模。 必须放在端口说明之前。

Generic ( 常数名称:类型 [ : = 缺省值 ] {常数名称:类型 [ : = 缺省值 ]} ) ;

Page 20: 第三章  硬件描述语言 VHDL

20

类属常用于定义: 实体端口的大小、 设计实体的物理特性、 总线宽度、 元件例化的数量等。

例: entity mck is generic(width: integer:=16); port(add_bus:out std_logic_vector (width-1 downto 0)); …

Page 21: 第三章  硬件描述语言 VHDL

21

例: 2输入与门的实体描述entity and2 is

generic(risewidth: time:= 1 ns;

fallwidth: time:= 1 ns);

port(a1: in std_logic;

a0: in std_logic;

z0: out std_loigc);

end entity and2;

注:数据类型 time 用于仿真模块的设计。 综合器仅支持数据类型为整数的类属值。

Page 22: 第三章  硬件描述语言 VHDL

22

2 、端口声明 端口声明:确定输入输出端口的数目和类型。

其中,端口模式: in 输入型,此端口为只读型。 out 输出型,此端口只能在实体内部对其赋值。 inout 输入输出型,既可读也可赋值。 buffer 缓冲型,与 out 相似,但可读。

Port ( 端口名称 { ,端口名称 } :端口模式 数据类型; … 端口名称 { ,端口名称 } :端口模式 数据类型 );

Page 23: 第三章  硬件描述语言 VHDL

23

out 和 buffer 的区别:

Page 24: 第三章  硬件描述语言 VHDL

24

数据类型: 指端口上流动的数据的表达格式。为预先定义好的数据类型。 如: bit 、 bit_vector 、 integer 、 std_logic 、 std_logic_vector 等。例: entity nand2 is port ( a, b : in bit; z : out bit ) ; end nand2;

Page 25: 第三章  硬件描述语言 VHDL

25

3.2.2 结构体

作用:定义系统(或模块)的行为、元件及内部 的连接关系,即描述其逻辑功能。

两个组成部分:• 对数据类型、常数、信号、子程序、元件等元 素的说明部分。• 以各种不同的描述风格描述的系统的逻辑功能 部分。常用的描述风格有:行为描述、数据流 描述、 结构化描述。

Page 26: 第三章  硬件描述语言 VHDL

26

结构体

结构体说明

结构体功能描述

常数说明

数据类型说明

信号说明

例化元件说明

子程序说明

块语句 进程语句

信号赋值语句

子程序调用语句 元件例化语句

Page 27: 第三章  硬件描述语言 VHDL

27

实体与结构体的关系:

设计实体

结构体 1

结构体 2

结构体 3

结构体 n

一个设计实体可有多个结构体,代表实体的多种实现方式。各个结构体的地位相同。

Page 28: 第三章  硬件描述语言 VHDL

28

结构体的语法:

注:同一实体的结构体不能同名。定义语句中的常 数、信号不能与实体中的端口同名。

architecture 结构体名称 of 实体名称 is

[说明语句 ] 内部信号、常数、 数据类型、子程序(函数、过程)、 元件等的说明;begin

[ 并行处理(功能描述)语句 ] ;end [architecture] 结构体名称;

Page 29: 第三章  硬件描述语言 VHDL

29

例:结构体中错误的信号声明

Page 30: 第三章  硬件描述语言 VHDL

30

例:一个完整描述( 3 bit 计数器)

Page 31: 第三章  硬件描述语言 VHDL

31

3 bit 计数器的等效描述( out 与 buffer 的区别):

Page 32: 第三章  硬件描述语言 VHDL

32

3.2.3 配置

设计实体

结构体 1

结构体 2

结构体 3

结构体 n

。一个设计实体的多种实现方式

配置:从某个实体的多种结构体描述方式中选择 特定的一个。

Page 33: 第三章  硬件描述语言 VHDL

33

简单配置的语法:

例:一个与非门不同实现方式的配置如下:

configuration 配置名 of 实体名 is

for 选配结构体名

end for ;

end 配置名;

Page 34: 第三章  硬件描述语言 VHDL

34

library ieee;

use ieee.std_logic_1164.all;

entity nand is

port(a: in std_logic;

b: in std_logic;

c: out std_logic);

end entity nand;

architecture art1 of nand is

begin

c<=not (a and b);

end architecture art1;

Page 35: 第三章  硬件描述语言 VHDL

35

architecture art2 of nand 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 art2;

Page 36: 第三章  硬件描述语言 VHDL

36

configuration first of nand is

for art1;

end for;

end first;

configuration second of nand is

for art2

end for;

end second;

Page 37: 第三章  硬件描述语言 VHDL

37

例:一个对计数器实现多种形式的配置如下:

Page 38: 第三章  硬件描述语言 VHDL

38

Page 39: 第三章  硬件描述语言 VHDL

39

Page 40: 第三章  硬件描述语言 VHDL

40

程序包:

已定义的常数、数据类型、元件调用说明、子程序的一个集合。 目的:方便公共信息、资源的访问和共享。

库: 多个程序包构成库。

3.2.4 程序包、库

Page 41: 第三章  硬件描述语言 VHDL

41

程序包说明的内容:

常量说明; VHDL 数据类型说明; 元件说明; 子程序说明;

程序包的结构包括:

程序包说明(包首) 程序包主体(包体)

Page 42: 第三章  硬件描述语言 VHDL

42

1 、程序包说明(包首)语法:

包声明项可由以下语句组成: use 语句(用来包括其它程序包); 类型说明;子类型说明;常量说明;信号说 明;子程序说明;元件说明。

package 程序包名 is

{包说明项 }

end 程序包名;

Page 43: 第三章  硬件描述语言 VHDL

43

例:程序包说明

Page 44: 第三章  硬件描述语言 VHDL

44

2 、程序包包体程序包的内容:子程序的实现算法。包体语法:

包体说明项可含: use 语句;子程序说明;子程序主体;类型说明;子类型说明;常量说明。

package body 程序包名 is

{包体说明项 }

end 程序包名;

Page 45: 第三章  硬件描述语言 VHDL

45

程序包首与程序包体的关系: 程序包体并非必须,只有在程序包中要说明

子程序时,程序包体才是必须的。

程序包首可以独立定义和使用。如下:

package seven is

subtype segments is bit_vector(0 to 6);

type bcd is range 0 to 9;

end seven;

Page 46: 第三章  硬件描述语言 VHDL

46

library work;

use work.seven.all;

entity decoder is

port(input: in bcd;

drive: out segments);

end decoder;

architecture art of decoder is

begin

Page 47: 第三章  硬件描述语言 VHDL

47

with input select drive<=B“1111110” when 0, B“0110000” when 1, B“1101101” when 2, B“1111001” when 3, B“0110011” when 4, B“1011011” when 5, B“1011111” when 6, B“1110000” when 7, B“1111111” when 8, B“1111011” when 9, B“0000000” when others; end architecture art;

a

b

c

d

e

f

g

Page 48: 第三章  硬件描述语言 VHDL

48

3 、库的种类 VHDL 库可分为 5种: ( 1 ) IEEE 库 定义了四个常用的程序包: • std_logic_1164 (std_logic types & related

functions) • std_logic_arith (arithmetic functions) • std_logic_signed (signed arithmetic functions) • std_logic_unsigned (unsigned arithmetic functions)

Page 49: 第三章  硬件描述语言 VHDL

49

Type STD_LOGIC :

9 logic value system (‘U’, ‘X’, ‘0’, ‘1’, ‘Z’, ‘W’, ‘L’, ‘H’, ‘-’)

• ‘W’, ‘L’, ‘H” weak values (Not supported by Synthesis) • ‘X’ - (not ‘x’)used for unknown • ‘Z’ - (not ‘z’) used for tri-state • ‘-’ Don’t Care

Page 50: 第三章  硬件描述语言 VHDL

50

( 2 ) STD 库(默认库) 库中程序包为: standard , 定义最基本的数据类型: Bit , bit_vector , Boolean , Integer , Real , and Time

注: Type BIT

2 logic value system (‘0’, ‘1’)

( 3 )面向 ASIC 的库 ( 4 ) WORK 库(默认库) ( 5 )用户定义库

Page 51: 第三章  硬件描述语言 VHDL

51

4 、库及程序包的使用

库及程序包的说明总是放在实体单元前面,默认库及程序包可不作说明。用关健字 library

说明要使用的库,用 关健字 use 说明要使用的库中的程序包。 库及程序包的作用范围:仅限于所说明的设计实体。 每一个设计实体都必须有自已完整的库及程序包说明语句。

Page 52: 第三章  硬件描述语言 VHDL

52

库、程序包

实体( Entity )

结构体

( Architecture )

进程 或其它并行结构

配置( Configuration )

Page 53: 第三章  硬件描述语言 VHDL

53

库的使用语法:

程序包的使用有两种常用格式:

例: library ieee ; use ieee.std_logic_1164.all ; use ieee.std_logic_unsigned.conv_integer;

library 库名;

use 库名.程序包名.项目名 use 库名.程序包名. All ;

Page 54: 第三章  硬件描述语言 VHDL

54

2 选 1 选择器:

Page 55: 第三章  硬件描述语言 VHDL

55

2 选 1 的另一种描述

Page 56: 第三章  硬件描述语言 VHDL

56

四类语言要素:

数据对象( Data Object )

数据类型( Data Type )

操作数( Operands )

操作符( Operator )

3.3 VHDL 语言要素

Page 57: 第三章  硬件描述语言 VHDL

57

3.3.1 VHDL 文字规则1 、数字型文字

( 1 )整数文字:十进制整数

如: 5 , 678 , 156E2 ( =15600 ),

45_234_287 ( =45234287 )

( 2 )实数文字:带小数的十进制数

如: 23.34 , 2.0 , 44.99E-2 ( =0.4499 )

88_67_551.23_909 ( 8867551.23909 )

Page 58: 第三章  硬件描述语言 VHDL

58

( 3 )以数制基数表示的文字

格式:

如: 10#170# ( =170 )

2#1111_1110# ( =254 )

16#E#E1 ( =2#1110_0000# =224 )

或:( =14×16=224 )

16#F.01#E+2

( = ( 15+1/ ( 16 × 16 )) × 16 × 16=3841.00 )

基数 # 数字文字 #E指数

Page 59: 第三章  硬件描述语言 VHDL

59

( 4 )物理量文字

如: 60 s 、 100 m 、 177 A

注:整数可综合实现;

实数一般不可综合实现;

物理量不可综合实现;

Page 60: 第三章  硬件描述语言 VHDL

60

2 、字符串型文字

按字符个数多少分为:

字符:用单引号引起来的 ASCII 字符,可以是

数值,也可以是符号或字母。

如:‘ A’ ,‘ *’ ,‘ Z’

字符串:用双引号引起来的一维字符数组

Page 61: 第三章  硬件描述语言 VHDL

61

字符串分为:

( 1 )文字字符串:“文字”

如:“ ERROR” ,

“XXXXXXXX” ,

“ZZZZZZZZ” ,

“X” ,

“BOTH S AND Q EQUAL TO L” ,

Page 62: 第三章  硬件描述语言 VHDL

62

( 2 )数位字符串: 称为位矢量,代表二进制、八进制、十六进 制的数组。其位矢量的长度为等值的二进制数的 位数。 格式:

其中基数符号有三种: B :二进制基数符号。 O :八进制基数符号,每一个八进制数 代表一个 3 位的二进制数。

基数符号 “数值”

Page 63: 第三章  硬件描述语言 VHDL

63

X :十六进制基数符号,每一个十六进制数代表

一个 4 位的二进制数。

如:

B“1_1101_1110” 二进制数数组,长度为 9

O“34” 八进制数数组,长度为 6

X“1AB” 十六进制数数组,长度为 12

Page 64: 第三章  硬件描述语言 VHDL

64

3 、标识符

定义常数、变量、信号、端口、子程序或

参数的名字。

基本标识符的要求( 87 标准):

以英文字母开头;

不连续使用下划线“ _”;

不以下划线“ _” 结尾;

由 26 个大小写英文字母、数字 0~9及

下划线“ _” 组成的字符串。

Page 65: 第三章  硬件描述语言 VHDL

65

基本标识符中的英文字母不分大小写;

VHDL 的保留字不能作为标识符使用。

合法标识符如下:

my_counter 、

Decoder_1 、

FFT 、

Sig_N 、

Not_Ack 、

State0

Page 66: 第三章  硬件描述语言 VHDL

66

非法标识符如下:

_Decoder_1 、

2FFT 、

Sig_#N 、

Not-Ack 、

ALL_RST_ 、

data__BUS 、

return 、

entity

Page 67: 第三章  硬件描述语言 VHDL

67

扩展标识符( 93 标准):

以反斜杠来界定,免去了 87 标准中基本标

识符的一些限制。

可以以数字打头,

允许包含图形符号,

允许使用 VHDL 保留字,

区分字母大小写等。

如: \74LS163\ 、 \Sig_#N\ 、

\entity\ 、 \ENTITY\

Page 68: 第三章  硬件描述语言 VHDL

68

4 、下标名及下标段名 下标名:用于指示数组型变量或信号的某一个 元素。 格式: 下标段名:用于指示数组型变量或信号的某一 段元素。 格式:如: a : std_logic_vector(7 downto 0)

a(7), a(6)… a(0)

a(7 downto 0), a(7 downto 4), a(5 downto 3)…

标识符(表达式)

标识符(表达式 to/downto 表达式)

Page 69: 第三章  硬件描述语言 VHDL

69

3.3.2 数据对象

三种对象:常量( Constant ) 变量( Variable ) 信号( Signal )三种对象的物理含义: 常量代表数字电路中的电源、地、恒定逻辑值等常数; 变量代表暂存某些值的载体,常用于描述算法; 信号代表物理设计中的某一条硬件连接线,包括输入、输出端口。

Page 70: 第三章  硬件描述语言 VHDL

70

三种对象的特点及说明场合:

信号:全局量,

用于 architecture 、 package 、 entitiy 。

变量:局部量,

用于 process 、 function 、 procedure 。

常量:全局量,可用于上面两种场合。

Page 71: 第三章  硬件描述语言 VHDL

71

1 、常量说明

常量说明:对某一个常量名赋予一个固定的值。

格式:

例: constant data: bit_vector(3 downto 0):=“1010”

constant width: integer: = 8 ;

constant x: new_bit: = ‘x’ ;

常量数据类型必须与表达式的数据类型一致。

constant 常数名:数据类型: = 表达式;

Page 72: 第三章  硬件描述语言 VHDL

72

常量的可视性(作用范围):

库、程序包

实体( Entity )

结构体 1

进 程 1

结构体 2

进 程 2

常量是全局量,其作用范围取决于常量被定义的位置。

Page 73: 第三章  硬件描述语言 VHDL

73

2 、变量说明 变量是一个局部量,只能在进程和子程序中定义、使用。其作用范围仅限于定义了变量的进程和子程序中。格式:

例: variable a, b : bit;

variable count : integer range 0 to 255 := 10;

变量的初值可用于仿真,但综合时被忽略。

variable 变量名:数据类型 约束条件: = 表达式;

Page 74: 第三章  硬件描述语言 VHDL

74

3 、信号说明 电子硬件系统运行的基本特性: 各部分电路工作的并行特性; 信号传输过程中的延时特性; 多驱动源的总线特性; 时序电路中触发器的记忆特性等。 信号是电子系统内部硬件连接和硬件特性的抽象表示。用来描述硬件系统的基本特性。格式:

signal 信号名:数据类型 约束条件:= 表达式;

Page 75: 第三章  硬件描述语言 VHDL

75

例:

signal a, b : bit;

signal init : integer := -1;

signal s1 : std_logic := ‘0’;

signal s2 : std_logic_vector(15 downto 0);

注: a. 综合时初值被忽略。 b. 信号是全局量。可在结构体、实体、块中说明和使用信号。 c. 在进程和子程序中只能使用信号,不能说明信号。

Page 76: 第三章  硬件描述语言 VHDL

76

例:进程中信号与变量的使用Entity ex is port(…..);end ex;architecture arch_ex of ex is signal a, b :std_logic;begin process(a, b) variable c, d : std_logic; begin c:= a + b; d:= a - b; …… end process;end arch_ex;

Page 77: 第三章  硬件描述语言 VHDL

77

信号与端口的区别: 除没有方向说明外,信号与 实体的“端口( PORT )” 概念相似。端口是一种隐形的信号。 entity exam is port([signal] a, b: in std_logic; [signal] c: out std_logic); end exam;

端口是一种有方向的信号。即输出端口不能读出数据,只能写入数据;输入端口不能写入数据,只能读出数据。 信号本身无方向,可读可写。

Page 78: 第三章  硬件描述语言 VHDL

78

3.3.3 VHDL 数据类型 VHDL 是一种强数据类型语言。 要求设计实体中的每一个常数、信号、变量、函数以及设定的各种参量都必须具有确定的数据类型,并且相同数据类型的量才能互相传递和作用。 VHDL 数据类型分为四大类: 标量类型( SCALAR TYPE )、 复合类型( COMPOSITE TYPE )、 存取类型( ACCESS TYPE )、 文件类型( FILES TYPE )

Page 79: 第三章  硬件描述语言 VHDL

79

又分为: 预定义数据类型、 用户自定义数据类型

1 、 VHDL 的预定义数据类型1 )布尔量( boolean ) 布尔量具有两种状态: false 和 true

常用于逻辑函数,如相等( = )、比较( < )等中作逻辑比较。如, bit 值转化成 boolean 值: boolean_var := (bit_var = ‘1’);

Page 80: 第三章  硬件描述语言 VHDL

80

2 )位( bit ) bit 表示一位的信号值。 放在单引号中,如 ‘ 0’ 或 ‘ 1’ 。3 )位矢量 ( bit_vector ) bit_vector 是用双引号括起来的一组位数据。 如: “ 001100” X“00B10B”

4 )字符( character ) 用单引号将字符括起来。 variable character_var : character;

…...

Character_var : = ‘A’;

Page 81: 第三章  硬件描述语言 VHDL

81

5 )整数( integer ) integer 表示所有正的和负的整数。硬件实现时,利用 32 位的位矢量来表示。可实现的整数范围为: - ( 231-1 ) to (231-1)

VHDL 综合器要求对具体的整数作出范围限定,否则无法综合成硬件电路。 如: signal s : integer range 0 to 15;

信号 s 的取值范围是 0~15 ,可用 4 位二进制数表示,因此 s 将被综合成由四条信号线构成的信号。

Page 82: 第三章  硬件描述语言 VHDL

82

6 )自然数( natural )和正整数( positive )

natural 是 integer类型的子类型,表示非负整数。 positive 是 integer 类型的子类型,表示正整数。

定义如下: subtype natural is integer range 0 to integer’high;

subtype positive is integer range 1 to integer’high;

Page 83: 第三章  硬件描述语言 VHDL

83

7 )实数( REAL ) 或称浮点数 取值范围: -1.0E38 ~ +1.0E38

实数类型仅能用于 VHDL 仿真器,一般综合器不支持。8 )字符串( string ) string 是 character 类型的一个非限定数组。用双引号将一串字符括起来。如: variable string_var : string(1 to 7);

……

string_var := “Rosebud”;

Page 84: 第三章  硬件描述语言 VHDL

84

9 )时间( TIME )

由整数和物理单位组成

如: 55 ms , 20 ns

10 )错误等级( SEVERITY_LEVEL )

仿真中用来指示系统的工作状态,共有四种:

NOTE (注意)、

WARNING (警告)、

ERROR (出错)、

FAILURE (失败)

Page 85: 第三章  硬件描述语言 VHDL

85

2 、 IEEE 预定义标准逻辑位与矢量1 ) std_logic 类型 由 ieee 库中的 std_logic_1164 程序包定义,为九值逻辑系统,如下: (‘ U’ ,‘ X’ ,‘ 0’ ,‘ 1’ ,‘ Z’ ,‘ W’ ,‘ L’ ,‘ H’ ,‘ -’ ) ‘U’ :未初始化的, ‘ X’ :强未知的, ‘0’ :强 0 , ‘ 1’ :强 1 , ‘Z’ :高阻态, ‘ W’ :弱未知的, ‘L’ :弱 0 , ‘ H’ :弱 1 , ‘-’ :忽略

Page 86: 第三章  硬件描述语言 VHDL

86

由 std_logic 类型代替 bit 类型可以完成电子系统的精确模拟,并可实现常见的三态总线电路。

2 ) std_logic_vector 类型

由 std_logic 构成的数组。定义如下:

type std_logic_vector is array(natural range<>)

of std_logic;

赋值的原则:相同位宽,相同数据类型。

Page 87: 第三章  硬件描述语言 VHDL

87

3 、其它预定义标准数据类型

Synopsys 公司程序包 STD_LOGIC_ARITH中: 1 )无符号型( UNSIGNED ) 定义如下: type unsigned is array(natural range<>) of std_logic;

UNSIGNED (“ 1000” ) = 8

最左位是最高位: variable var:unsigned(0 to 10); var(0) 是最高位 signal sig:unsigned(5 downto 0); sig(5) 是最高位

Page 88: 第三章  硬件描述语言 VHDL

88

2 )有符号型( SIGNED )

定义如下: type signed is array

(natural range<>) of std_logic;

最高位为符号位,综合器认作补码。

SIGNED (“ 0101” ) = 5 ,

SIGNED (“ 1011” ) = -5

variable var: signed(0 to 10); var(0) 是符号位

3 )小整型( SMALL_INT ): 0 TO 1

Page 89: 第三章  硬件描述语言 VHDL

89

4 、 用户自定义类型

用户自定义类型是 VHDL 语言的一大特色。

可由用户定义的数据类型有: 枚举类型、 整数和实数类型、 数组类型、 记录类型、 子类型

Page 90: 第三章  硬件描述语言 VHDL

90

用类型定义语句 TYPE 和子类型定义语句

SUBTYPE 实现用户自定义数据类型。

TYPE 语句格式:

例: type byte is array(7 downto 0) of bit ; variable addend : byte ;

type week is (sun, mon, tue, wed, thu, fri, sat);

type 数据类型名 is 数据类型定义 [of 基本数据类型 ] ;

Page 91: 第三章  硬件描述语言 VHDL

91

SUBTYPE 语句格式:

例: subtype digits is integer range 0 to 9;

由 subtype 语句定义的数据类型称为子类型。

subtype 子类型名 is 基本数据类型 约束范围;

Page 92: 第三章  硬件描述语言 VHDL

92

1 )枚举类型 枚举该类型的所有可能的值。格式:

如: type std_logic is (‘U’ ,‘ X’ ,‘ 0’ ,‘ 1’ ,‘ Z’ , ‘W’ ,‘ L’ ,‘ H’ ,‘ -’)

如: type color is (blue, green, yellow, red) ; type my_logic is (‘0’, ‘1’, ‘U’, ‘Z’) ; variable hue : color ; signal sig : my_logic ; hue := blue ; sig <= ‘Z’ ;

type 类型名称 is (枚举文字 { ,枚举文字 } );

Page 93: 第三章  硬件描述语言 VHDL

93

枚举类型的编码:

综合器自动实现枚举类型元素的编码,一

般将第一个枚举量(最左边)编码为 0 ,以后的

依次加 1 。编码用位矢量表示 ,位矢量的长度

将取所需表达的所有枚举元素的最小值。

如: type color is (blue, green, yellow, red) ;编码为: blue=“00”; green=“01”;

yellow=“10”; red=“11”;

Page 94: 第三章  硬件描述语言 VHDL

94

2 )整数类型 用户定义的整数类型是标准包中整数类型的子范围。格式:

例: type my_integer is integer range 0 to 9 ;3 )数组类型 数组:同类型元素的集合。 VHDL 支持多维数组。 多维数组的声明: type byte is array(7 downto 0) of bit ; type vector is array(3 downto 0) of byte ; 限定数组、非限定数组、属性:

type 类型名称 is range 整数范围;

Page 95: 第三章  硬件描述语言 VHDL

95

限定数组: 其索引范围有一定的限制。格式:

非限定数组:数组索引范围被定义成一个类型范围。格式:

例: type bit_vector is array(integer range <>) of bit ; variable my_vector : bit_vector (5 downto -5) ;

type 数组名 is array( 数组范围 ) of 数据类型;

type 数组名 is array(类型名称 range <>) of 数据类型;

Page 96: 第三章  硬件描述语言 VHDL

96

属性:

VHDL 为多种类型定义了属性。

语法如下:

对象’属性

VHDL 为数组预先定义的属性: left right

high low

length range

reverse_range

Page 97: 第三章  硬件描述语言 VHDL

97

对应变量: variable my_vector : bit_vector (5 downto -5) ;各属性如下: my_vector’left 5

my_vector’right -5

my_vector’high 5

my_vector’low -5

my_vector’length 11

my_vector’range (5 downto -5)

my_vector’reverse_range (-5 to 5)

Page 98: 第三章  硬件描述语言 VHDL

98

4 )记录类型

记录是不同类型的名称域的集合。

格式如下:

访问记录体元素的方式: 记录体名 . 元素名

type 记录类型名 is record

元素名:数据类型名;

元素名:数据类型名;

end record ;

Page 99: 第三章  硬件描述语言 VHDL

99

例: constant len : integer:= 8 ; subtype byte_vec is bit_vector (len-1 downto 0) ; type byte_and_ix is record byte : byte_vec ; ix : integer range 0 to len ; end record ; signal x, y, z : byte_and_ix ; signal data : byte_vec ; signal num : integer ; ……. x.byte <= “11110000” ; x.ix <= 2 ; data <= y.byte ; num <= y.ix ; z <= x ;

Page 100: 第三章  硬件描述语言 VHDL

100

5 )子类型 子类型是已定义的类型或子类型的一个子集。格式: 例: bit_vector 类型定义如下: type bit_vector is array (natural range <>) of bit ; 如设计中只用 16bit ;可定义子类型如下: subtype my_vector is bit_vector(0 to 15) ;注:子类型与基(父)类型具有相同的操作符和子 程序。可以直接进行赋值操作。

subtype 子类型名 is 数据类型名 [范围 ] ;

Page 101: 第三章  硬件描述语言 VHDL

101

5 、数据类型转换

VHDL 是一种强类型语言,不同类型的数据

对象必须经过类型转换,才能相互操作。

1 )类型转换函数方式

通过调用类型转换函数,使相互操作的数据对

象的类型一致,从而完成相互操作。

Page 102: 第三章  硬件描述语言 VHDL

102

library ieee;

use ieee.std_logic_1164.all;

entity cnt4 is

port(clk: in std_logic;

p: inout std_logic_vector(3 downto 0);

end cnt4;

Page 103: 第三章  硬件描述语言 VHDL

103

library dataio;

use dataio.std_logic_ops.all;

architecture behv of cnt4 is

begin

process(clk)

begin

if clk’event and clk=‘1’ then

p<=to_vector(2, to_integer(p)+1);

end if;

end process;

end behv;

Page 104: 第三章  硬件描述语言 VHDL

104

2 )直接类型转换方式 对相互间非常关联的数据类型(如整型、浮点型),可进行直接类型转换。格式: 数据类型标识符(表达式)如: variable a, b : real;

variable c, d : integer;

……

a:= real ( c ) ;

d:= integer ( b ) ;

Page 105: 第三章  硬件描述语言 VHDL

105

3.3.4 VHDL 中的表达式 表达式:由操作符和操作数构成,完成算术或 逻辑运算。

1 、操作符 VHDL操作符的分类: 逻辑操作符( Logical Operator )、 关系操作符( Relational Operator )、 算术操作符( Arithmetic Operator )、 重载操作符( Overloading Operator )

Page 106: 第三章  硬件描述语言 VHDL

106

1 ) 逻辑操作符 6种: and 、 or 、 nand 、 nor 、 xor 、 not

要求:操作数类型必须相同。可为如下类型: bit 、 bit_vector 、 std_logic 、 std_logic_vector 、 boolean

数组操作数的维数、大小必须相同。注:当有两个以上的逻辑表达式时,左右没有优先 级差别,必须使用括号,如: x <= ( a and b ) or ( not c and d ) ;例外:当逻辑表达式中只有“ and” 、“ or” 、“ xor”运算 符时,可以省略括号。如:

Page 107: 第三章  硬件描述语言 VHDL

107

a <= b and c and d and e ;

a <= b or c or d or e ;

a <= b xor c xor d xor e ;

2 )关系操作符

6 种: = 、 /= 、 < 、 <= 、 > 、 >=

用于比较相同父类的两个操作数,返回 boolean值。

Page 108: 第三章  硬件描述语言 VHDL

108

3 )加减操作符 加操作符“ +” 、减操作符“ -” 、 串联(并置)操作符“ &”

串联操作符“ &”通过连接操作数来建立新的数组。操作数可以是一个数组或数组中的一个元素。例: signal a, d : bit_vector (3 downto ) ; signal b, c, g : bit_vector (1 downto 0) ; signal e : bit_vector(2 downto 0) ; signal f, h, i : bit ; a <= not b & not c ; -- array & array

d <= not e & not f ; -- array & element

g <= not h & not i ; -- element & element

Page 109: 第三章  硬件描述语言 VHDL

109

4 ) 一元操作符 仅有一个操作数的操作符。 包括:“ +” 、“ -”

5 ) 乘除操作符 用于整数类型:“ * ” 、“ / ” 、“ mod ” 、“ rem ”

综合的限制: “ / ” 、“ mod ” 、“ rem ” 三种 操作符的右操作数必须为 2

的正整数次幂,即 2n 。实际 电路用移位实现。

Page 110: 第三章  硬件描述语言 VHDL

110

2 、操作数 操作数:

操作符进行运算时所需的数据。

操作数的种类: 标志符;集合;属性;表达式;函数 调用;索引名;文字;限定表达式; 记录和域;片段名;类型转换

Page 111: 第三章  硬件描述语言 VHDL

111

3 、重载操作符 VHDL 是强类型语言,相同类型的操作数才能进行操作。 VHDL自身定义的算术和布尔函数仅对内部数据类型( standard 程序包中的数据类型)有效。即: 算术运算符 +, -, <, >, <=, >= 仅对 integer 类型有效。逻辑运算符 AND, OR, NOT仅对 bit 类型有效。 如: variable a , b , c : integer ; variable x , y , z : bit ; c := a + b ; z := x and y ;问题: a, b, c 与 x, y, z 之间,或与 std_logic 等其它数据类型之间能否相互操作?

Page 112: 第三章  硬件描述语言 VHDL

112

重载操作符定义: 对已存在的操作符重新定义,使其能进行不同类型操作数之间的运算,称为重载操作符。定义重载操作符的函数称为重载函数。 重载操作符由原操作符加双引号表示。如

“ +”

重载操作符的定义见 IEEE 库的程序包: std_logic_arith 、 std_logic_unsigned 、 std_logic_signed

Page 113: 第三章  硬件描述语言 VHDL

113

Page 114: 第三章  硬件描述语言 VHDL

114

重载操作符的使用:

Page 115: 第三章  硬件描述语言 VHDL

115

第 3章 习题一 1 、 VHDL 的优点是什么? 2 、 VHDL中最基本的结构是什么?其作用各 是什么? 3 、说明端口模式 inout 、 out 和 buffer 有何异 同点。 4 、什么是重载运算符,重载函数有何作用? 5 、 VHDL中有哪 3种数据对象?详细说明它们 的功能特点以及使用方法。 6 、表达式 c <= a + b 中, a 、 b 和 c 的数据类型 都是 std_logic_vector ,是否能直接进行加 法运算?说明原因和解决方法。