Top Banner
1 第 4 第 VHDL 第第第第
80

第 4 章 VHDL 设计入门

Jan 19, 2016

Download

Documents

Wendi

第 4 章 VHDL 设计入门. 基本知识:. 理解 QuartusⅡ 的 HDL 输入法 理解 VHDL 程序的基本结构 理解 VHDL 程序的顺序结构 理解 VHDL 程序的并行结构 理解 VHDL 程序的语言要素. QuartusⅡ 软件的操作顺序:. 编写 VHDL 程序(使用 Text Editor ) 编译 VHDL 程序(使用 Complier ) 仿真验证 VHDL 程序(使用 Waveform Editor 、 Simulator ) 进行芯片的时序分析(使用 Timing Analyzer ) - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 第 4 章  VHDL 设计入门

1

第 4 章 VHDL 设计入门

Page 2: 第 4 章  VHDL 设计入门

2

基本知识:

理解 QuartusⅡ 的 HDL 输入法

理解 VHDL 程序的基本结构

理解 VHDL 程序的顺序结构

理解 VHDL 程序的并行结构

理解 VHDL 程序的语言要素

Page 3: 第 4 章  VHDL 设计入门

3

QuartusⅡ 软件的操作顺序:

• 编写 VHDL 程序(使用 Text Editor )

• 编译 VHDL 程序(使用 Complier )

• 仿真验证 VHDL 程序(使用 Waveform Editor 、 Simulat

or )

• 进行芯片的时序分析(使用 Timing Analyzer )

• 安排芯片脚位(使用 Floorplan Editor )

• 下载程序至芯片(使用 Programmer )

Page 4: 第 4 章  VHDL 设计入门

4

§4.1 QuartusⅡ 的 HDL 输入法

常用的输入法有三种: AHDL 、 VHDL 、 Verilog HD

L 。

以 7 段数码显示译码器设计为例介绍 QuartusⅡ 的 V

HDL 文件的输入编辑和编译仿真方法。

一、输入编辑 VHDL 文件

1.建立工程项目

执行 File-New Project Wizard… 命令,建立工程,项目名称 DECL7S

Page 5: 第 4 章  VHDL 设计入门

5

一、输入编辑 VHDL 文件

2. 新建 VHDL 文件

执行 File-New… 命令,弹出图 4-8 对话框选择 VHDL File 。然后保存文本文件 File-save as…

图 4-8

图 4-9

Page 6: 第 4 章  VHDL 设计入门

6

一、输入编辑 VHDL 文件

3. 编辑 VHDL 文件

Page 7: 第 4 章  VHDL 设计入门

7

二、编译仿真 VHDL 文件

1. 编译 VHDL 文件

执行 Processing-Start Complication, 进行编译,如有错误进行修改保存后再编译直到编译成功。

2. 仿真 VHDL 文件

新建波形文件 File-New… ,如同仿真原理图一样步骤

先装载引脚 d 和 led ;然后设置仿真结束时间 Ed

it-End Time 和网格大小 Edit-Grid Size ;编辑波形后保存,最后进行波形仿真 Processing-Start Simula

tion.

Page 8: 第 4 章  VHDL 设计入门

8

二、编译仿真 VHDL 文件

图 4-26 仿真结果

Page 9: 第 4 章  VHDL 设计入门

9

§4.2 VHDL 的程序基本结构 117

1.USE 定义区

2.PACKAGE 定义区

3.ENTITY 定义区

4.ARCHITECTURE 定义区

5.CONFIGURATION 定义区

Component 定义区

信号定义

Data Flow 描述Behavior Process 描述 Structure 描述

定义元件库定义使用哪些自

定义元件库

定义电路实体的外观; I/O 接口的规

描述电路内部的功能,说明电路执行什么

动作或功能

决定哪一个 architecture 被使

Page 10: 第 4 章  VHDL 设计入门

10

VHDL 基本程序结构:

USE 定义区ENTITY 定义区

ARCHITECTURE 定义区

1 ) USE 定义区和标准定义库包括:LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

由于 VHDL 已是 IEEE 规定的标准,所以只要是 CPLD 、FPGA 等芯片公司,它们都会提供这个标准的定义库( Library IEEE ),而且由于这里面写了许许多多的定义与参数,初学者一时之间也不容易全部了解,所以全部写上以减轻负担。

常用库:

IEEE 库

STD 库

ASIC 矢量库

WORK 库

用户自定义库

Page 11: 第 4 章  VHDL 设计入门

11

1 ) USE 定义区和标准定义库包括

程序包( PACKAGE )是预先定义或设计好的数据类型、子程序和各种设计实体的集合;库( LIBRARY )则是用来存储已经完成的程序包等 VHDL 设计与数据的仓库。

一般情况下,库和程序包的引用声明放在设计文件的最前面。

Page 12: 第 4 章  VHDL 设计入门

12

库与程序包的使用

除 WORK 、 STD 库外,其他库与程序包使用前首先要声明。格式如下:

LIBRARY 库名 ;

USE 库名 . 程序包名 . 项目名 ;

USE 库名 . 程序包名 .ALL;

例: LIBRARY altera;

USE altera.maxplus2.ALL;

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

Page 13: 第 4 章  VHDL 设计入门

13

附程序包的定义:

PACKAGE 程序包名 IS

程序包首说明语句;

END [PACKAGE] 程序包名;

PACKAGE BODY 程序包名 IS

程序包体说明语句;

END [PACKAGE BODY] 包集合名;

提示:程序包体为可选项,程序包首与程序包体名字应相同。

Page 14: 第 4 章  VHDL 设计入门

14

2 )实体( ENTITY )命令格式:

ENTITY 芯片电路名称 is PORT( 管脚名称 1 :输出输入状态 资料类型; 管脚名称 2 :输出输入状态 资料类型; : 管脚名称 n :输出输入状态 资料类型 ); END 芯片电路名称;

※ 注意两点: a. 芯片电路名称是对你所编辑的电路功能的描述,比如半加器、全加器、 D 出发器及一些复杂的编程电路; b. 对每个管脚的描述完成后要打分号,但是最后一个管脚描述完成后不用分号,而是在括上反括号后打分号。

Page 15: 第 4 章  VHDL 设计入门

15

端口方向:IN( 输入 ) ,只能读,用于时钟输入、控制输入(装入、复位、使能)、单向数据输入;OUT( 输出 ) ,只能被赋值,用于不能反馈的输出;BUFFER(缓冲 ) ,类似于输出,但可以读,读的值是被赋值,用做内部反馈用,不能作为双向端口使用。

ENTITY and_n IS

GENERIC(n:POSITIVE:=8);

PORT(a:IN BIT_VECTOR((N-1) DOWNTO 0);

f:OUT BIT);

END and_n;

Page 16: 第 4 章  VHDL 设计入门

16

3 ) Architecture 定义区的命令格式:

ARCHITECTURE 结构名称 OF 芯片电路名称 ( 实体名 ) IS

BEGIN

: (电路内部的描述)END 结构名称;

※ 这里的结构名称是可以根据用户的习惯定义,但是需要和芯片电路名称相区别。

Page 17: 第 4 章  VHDL 设计入门

17

例:

ENTITY adder IS

PORT(op1,op2 : IN UNSIGNED(7 DOWNTO 0);

Result: OUT INTEGER);

END adder;

ARCHITECTURE maxpld OF adder IS

BEGIN

result<=CONV_INTEGER(op1+op2);

END ARCHITECTURE maxpld;

Page 18: 第 4 章  VHDL 设计入门

18

4 ) CONFIGURATION配置的命令格式: 一个实体可以有几个结构体,就好像一个电路可以有几个不同的实现方案一样。配置是在一个实体有几个结构体时,用来为实体指定在特定的情况下使用哪个特定的结构体。在仿真时可以利用配置为实体选择不同的结构体。

CONFIGURATION 配置名 OF 实体名 IS

FOR 结构体名 END FOR;

END[CONFIGURATION] 配置名;

Page 19: 第 4 章  VHDL 设计入门

19

例:

CONFIGURATION MY_CONFIG OF COUNTER3 IS

FOR MY_ARCH

END FOR;

END MY_CONFIG;

Page 20: 第 4 章  VHDL 设计入门

20

以一个芯片内部俯视图为例:

Pin48 Pin7

试用 VHDL 编写程序

实际上这只是将输入

脚 Pin48 直接引一条

线至输出脚 Pin7 。

图 4-5-1 芯片内部俯视图

Page 21: 第 4 章  VHDL 设计入门

21

程序如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CH1_1_1 IS PORT( PIN48: IN STD_LOGIC; PIN7: OUT STD_LOGIC );END CH1_1_1;ARCHITECTURE A OF CH1_1_1 ISBEGIN PIN7<=PIN48;END A;

Page 22: 第 4 章  VHDL 设计入门

22

基本数据类型 :逻辑信号、数值信号

信号

逻辑信号

数值信号

布尔代数 (Boolean)

位 (Bit)

标准逻辑 (Std_Logic)

整数( Integer Unsigned)

实数 (Real)

正整数 (Positive)

自然数 (Natural)

§4.5 VHDL 程序的语言要素总结

Page 23: 第 4 章  VHDL 设计入门

23

一、逻辑信号1.布尔代数 (Boolean)

Type Boolean is (False,True)

一个布尔量具有两个状态:“真”或“假”。布尔量不属于数值,因此不能用于运算,它只能通过关系运算符获得。一般这一类型的数据初始值总为 FALSE.

2. 位 (Bit)

Type Bit is(‘0’, ‘1’)

可视为数字电路里的低电位 ,高电位

Eg. 要设置一个定义为 Bit 的 Result 管脚信号为高电位输出,则

Entity中 Result: out Bit;

Architecture中 Result<=‘1’;

Page 24: 第 4 章  VHDL 设计入门

24

3. 标准逻辑 (Std_Logic)

Type STD_LOGIC is (‘X’,--Forcing Unknown ; 浮接不定

‘0’,--Forcing 0; 低电位

‘1’,--Forcing1;高电位

‘Z’,--High Impedance;高阻抗

‘W’,--Weak Unknown ;浮弱接

‘L’,--Weak 0;弱低电位

‘H’,--Weak 1;弱高电位

‘-’,--Don’t care; 不必理会

);

“标准逻辑”信号定义,远较“ Bit” 信号对于的数字逻辑电路的逻辑特性描述更完整、更真实。对逻辑信号的定义,通常都采用

Page 25: 第 4 章  VHDL 设计入门

25

4.逻辑序列信号以数字电路而言,有许多时候都是将几个信号合成一组代表特定功能的序列信号,例如:数据总线( Data Bus )、地址总线( Address Bus )等。实际上从电路的观点上,CLK 信号看成一条线上的信号,而 Data 是 8条线合成的排线信号。

Data4 8

Address

CE

ROM

图 5-1-1 序列信号在电路上的表示意义

Page 26: 第 4 章  VHDL 设计入门

26

针对这种序列信号的表示,提供以下功能:

Bit_Vector : 位序列

Std_Logic_Vector : 标准逻辑序列

Signal Data : Std_logic_vector(7 Downto 0);--Data output

Signal Address:Std_logic_vector(0 to 3);--Address

Signal CE:Std_logic --chip enable

对序列信号的表示,除了序列的范围大小须注意外,还须特别留意序列的编号顺序。

Page 27: 第 4 章  VHDL 设计入门

27

ARCHITECURE m of test isSignal A : Std_logic_vector(3 Downto 0);Signal B :Std_logic_vector(0 to 3);Begin B<=A; --A 序列信号传递至 B 序列信号End m;

A(3)

A(2)

A(1)

A(0)

B(0)

B(1)

B(2)

B(3)

图 5-1-2 A 、 B 序列信号的传递

Page 28: 第 4 章  VHDL 设计入门

28

5 、序列信号的分解与合并

在信号的处理上, VHDL 的语法是接受分解与合并的,如图 5-1-3“&”符号代表执行信号合并的动作。

A(3)

A(2)

A(1)

A(0)

B(0)

B(1)

B(2)

B(3)

C(0) D(1)

C(1) D(0)

1

图 5-1-3 序列信号的分解与合并

Page 29: 第 4 章  VHDL 设计入门

29

程序为:

ARCHITECTURE M OF TEST IS

Signal A :Std_logic_vector(3 downto 0);

Signal B :Std_logic_vector(0 to 3);

Signal C :Std_logic_vector(0 to 1);

Signal D :Std_logic_vector(1 downto 0);

BEGIN

C<=A(2 DOWNTO 1); -- 分解: A(2~1) 序列信号传至 D

B<=A(3) & D & ‘1’; -- 合并; A ( 3 )、 D 、要“ 1” 信号传递至 D

END M;

Page 30: 第 4 章  VHDL 设计入门

30

6 、逻辑信号的运算

配合逻辑信号的基本运算符,通常包含有两种:

逻辑运算、关系运算

1 )逻辑运算符( 6 种)NOT(非 ) OR (或) AND (与)NOR (或非) NAND (与非) XOR (异或)

2 )关系运算符= (等于) /= (不等于) < (小于)<= (小于等于) > (大于) >= (大于等于)

Page 31: 第 4 章  VHDL 设计入门

31

例 2 :ENTITY CH2_1_2 ISPORT( A: IN Std_logic_vector(3 downto 0); B: IN Std_logic_vector(3 downto 0); C: OUT Std_logic_vector(7 downto 0) );END CH2_1_2;ARCHITECTURE M OF CH2_1_2 ISBEGIN C(0)<=NOT A(0); C(2 DOWNTO 1)<=A(2 DOWNTO 1) AND B(2 DOWNTO 1); C(3)<='1' XOR A(3); C(7 downto 4)<="1111" when(A/=B)ELSE "0000";END M;

Page 32: 第 4 章  VHDL 设计入门

32

二、数值信号 在 VHDL 的程序中,将信号定义成数值,是为了方便作数值方面的运算,如“加 6 计数器”、“ 10 分频器”,为后续作加减乘等运算就相对容易许多。

1 、整数 (Integer)

Type INTEGER is range -2147483648 to 2147483647

实际上一个整数是由 32 位的 BIT_VECTOR 所构成,所以数值范围也可以看成是 -231 ~231-1

①正整数

Subtype POSITIVE is range 0 to INTEGER’High

②自然数

Subtype NATRAL is range 1 to INTEGER’High

Page 33: 第 4 章  VHDL 设计入门

33

数值范围的限制方法,是以 Range…To 命令来达成。

Signal A : INTEGER; --32 位整数的定义

Signal B : Integer range 0 to 7; --3 位整数的定义

Signal C : Integer range -1 to 1; --2 位整数的定义

上面的 A 、 B 、 C 信号的定义,原本都是 32 位的整数,但经 Range…To 的限制结果,将有效控制 B 、 C 的位长度。

Page 34: 第 4 章  VHDL 设计入门

34

2 、无符号整数

和前面的“标准逻辑”序列( Std_logic_vector )信号相似,定义时必须指明这个无符号整数的位数,例如下面的定义:

Signal A : Unsigned(3 Downto 0); --4 位无符号整数定义

Signal B : Unsigned(7 Downto 0); --8 位无符号整数定义

Usigned 信号类型除了具有数值运算的好处外,它还具有与“标准逻辑”序列信号相似的逻辑运算特性。

通过一个实例来理解无符号整数与标准逻辑序列的异同:

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;

Page 35: 第 4 章  VHDL 设计入门

35

--

****************************************************

ENTITY CH2_1_3 IS

PORT(

A:IN STD_LOGIC_VECTOR(1 DOWNTO

0);

B:IN UNSIGNED(1 DOWNTO 0);

C:OUT UNSIGNED(7 DOWNTO 0);

D:OUT STD_LOGIC_VECTOR(1

DOWNTO 0)

);

END CH2_1_3;

--

*****************************************************

ARCHITECTURE M OF CH2_1_3 IS

SIGNAL E,F,G:UNSIGNED(1 DOWNTO 0);

SIGNAL H :UNSIGNED(7 DOWNTO 0);

BEGIN

E<=UNSIGNED(A);

F<=B;

H(1 DOWNTO 0)<=E+F;

H(3 DOWNTO 2)<=E-F;

H(7 DOWNTO 4)<=E*F;

G(0)<=E(0) AND F(0);

G(1)<=E(1) OR F(1);

C<=H;

D<=STD_LOGIC_VECTOR(

G);

END M;

Page 36: 第 4 章  VHDL 设计入门

36

※ 注意:

1 、由上述的范例可以了解, Unsigned (无符号整数)与 Std_logic_vector (标准逻辑)信号之间是可以作转换的。

2 、 Unsigned (无符号整数)信号的序列编号是由高至低,所以一定要使用 Downto 的序列形式定义。

Page 37: 第 4 章  VHDL 设计入门

37

3 、实数( Real )

实数信号的定义形式为:

Type REAL is range -1.7E38 to 1.7E38

必须表示成“带小数点”或科学计数的表示方式。ARCHITECTURE m OF TEST IS

Signal A,B,C,D : REAL;

BEGIN

A<=1.5; --带小数点

B<=5.0;

C<=3.0E8; --科学计数

D<=-4.9E-9;

END m;

Page 38: 第 4 章  VHDL 设计入门

38

数据对象的定义

• VHDL语言的标识符

• 数据对象的定义常数( Constant )

信号( Signal )

变量( Variable )

Page 39: 第 4 章  VHDL 设计入门

39

VHDL语言的标识符

VHDL中的标识符可以是常数、变量、信号、端口、子程序或参数的名字。使用标识符要遵守如下法则:

• 标识符由字母( A…Z ; a…z )、数字和下划线字符组成。• 任何标识符必须以英文字母开头。• 末字符不能为下划线。• 不允许出现两个连续下划线。• 标识符中不区分大小写字母。• VHDL 定义的保留子或称关键字,不能用作标识符。• VHDL中的注释由两个连续的短线( -- )开始,直到行尾。

Page 40: 第 4 章  VHDL 设计入门

40

以下是非法标识符:-Decoder —起始不能为非英文字母3DOP —起始不能为数字Large#number —“#” 不能成为标识符的构成符号Data__bus — 不能有双下划线Copper_ — 最后字符不能为下划线On —关键字不能用作标识符。 注:在 AHDL 语言中标识符要区分大小写,但在 VHDL 语言中不区分大小写。所以写程序时,一定要养成良好的书写习惯,应用关键字时用大写,自己定义的标识符用小写。

Page 41: 第 4 章  VHDL 设计入门

41

标识符表示的几种数据对象的详细说明如下:1) 常数( Constant )• 常数是一个固定的值,主要是为了使设计实体中的常数更容易阅读

和修改。常数一被赋值就不能在改变。一般格式:

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

例: CONSTANT Vcc: REAL: =5.0;

—设计实体的电源电压指定

• 常数所赋得值应与定义的数据类型一致。

• 常量的使用范围取决于它被定义的位置。程序包中定义的常量具有最大的全局化特性,可以用在调用此程序包的所有设计实体中;设计实体中某一结构体中定义的常量只能用于此结构体;结构体中某一单元定义的常量,如一个进程中,这个常量只能用在这一进程中。

Page 42: 第 4 章  VHDL 设计入门

42

例如:定义一个 4 位( Nibble )长的常数零和一个 8 位( Byt

e )长的常数零,可分别写成:Constant Zero_4:Std_logic_vector(3 downto 0):=“0000”;

Constant Zero_8:Std_logic_vector(7 downto 0):=“00000000”;

常数名称的命令规则如标志符规则,数据类型如上一节所提 Bi

t 、 Unsigned 、 Std_logic_vector 。设置值必须要,而且定义完成后,就不能再更改。

Page 43: 第 4 章  VHDL 设计入门

43

2)变量( Variable )• 变量是一个局部变量,它只能在进程语句、函数语句和进程语句结构中使用。用作局部数据存储。在仿真过程中。它不像信号那样,到了规定的仿真时间才进行赋值,变量的赋值是立即生效的。变量常用在实现某种算法的赋值语句中。

• 一般格式:VARIABLE 变量名 数据类型 约束条件: =表达式;例: VARIABLE x, y: INTEGER; — 定义 x, y 为整数变量VARIABLE count: INTEGER RANGE0 TO255:=10; — 定义计数变量范围

• 变量的适用范围仅限于定义了变量的进程或子程序中。若将变量用于进程之外,必须该值赋给一个相同的类型的信号,即进程之间传递数据靠的信号。

• 变量赋值语句的语法格式如下: 目标变量: =表达式;• 变量赋值符号是“: =” 。赋值语句右方的表达式必须是一个与目标变

量有相同数据类型的数值。变量不能用于硬件连线和存储元件。

Page 44: 第 4 章  VHDL 设计入门

44

3 )信号( Signal ) 信号是描述硬件系统的基本数据对象,它类似于连接线,也可内连元件。端口也是信号。事实上,端口能够专门被定义为信号。它除了没有数据流动方向说明以外,其它性质与实体的端口( Port )概念一致。变量的值可以传递给信号,而信号的值不能传递给变量。信号通常在构造体、包集合和实体中说明。信号说明格式为:SIGNAL 信号名: 数据类型;信号初始值的设置不是必需的,而且初始值仅在 VHDL 的行为仿真中有效。信号除了没有方向的概念以外几乎和端口概念一致。例: SIGNAL sys_clk: BIT:=’0’;

SIGNAL ground: BIT:=’0’

在程序中,信号值输入信号时采用代入符” <=” ,而不是赋值符“: =” ,同时信号可以附加延时。信号传送语句: s1<=s2 AFTER 10ns

信号是一个全局量,可以用来进行进程之间的通信

Page 45: 第 4 章  VHDL 设计入门

45

信号与变量的区别:• 信号赋值可以有延迟时间,变量赋值无时间延迟;

• 信号除当前值外还有许多相关值,如历史信息等,变量只有当前值;

• 进程对信号敏感,对变量不敏感;

• 信号可以是多个进程的全局信号,但变量只在定义它之后的顺序域可见;

• 信号可以看作硬件的一根连线,但变量无此对应关系。

Page 46: 第 4 章  VHDL 设计入门

46

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CH2_2_2A IS PORT( IP:IN STD_LOGIC; CP:IN STD_LOGIC; OP:OUT STD_LOGIC );END CH2_2_2A;

ARCHITECTURE M OF CH2_2_2A IS SIGNAL D:STD_LOGIC;BEGIN

PROCESS(CP,IP) BEGIN IF CP'EVENT AND CP='1' THEN D<=IP; OP<=D; END IF; END PROCESS;END M;

ARCHITECTURE M OF CH2_2_2B ISBEGIN PROCESS(CP,IP) VARIABLE D:STD_LOGIC; BEGIN IF CP'EVENT AND CP='1' THEN D:=IP; OP<=D; END IF; END PROCESS;END M;

Page 47: 第 4 章  VHDL 设计入门

47

VHDL 程序的顺序结构

• 顺序语句:

每一条语句在行为仿真时的执行顺序都是按照它们的书写顺序。

• 并行语句:

各个并行语句在行为仿真时执行是同步进行的,其执行顺序与它们的书写顺序无关。

Page 48: 第 4 章  VHDL 设计入门

48

§4.2 顺序语句(一)

•进程( Process )•If-Else(判断比较 )

•Wait( 等待 )

注意:

“顺序语句命令”与下一节所提“并行同时”命令的最大不同点是,顺序语句命令类似一般的程序语言,如 C 、 Basic等的执行方式,是一次一个命令,且依书写方式由上而下的执行。

但“并行同时”命令的执行方式,就像是电路板的动作方式,不论几个命令,是一次同时执行,产生结果。

Page 49: 第 4 章  VHDL 设计入门

49

1 、进程( Process )

语法格式:

[过程名称: ] Process [ (感测信号 1 ,感测信号 2 ,……) ]

[ 定义区 ]

Begin

:

End Process[过程名称 ] ;

说明:

1 )中括号表示可以省略的,包括过程名称、感测信号;

2 )“感测信号”代表这个信号有任何变化时,将促使这个过程所包含的顺序语句立刻执行一次;

3 )在 Architecture中,可存放多个 Process ,允许它们同时执行。

Page 50: 第 4 章  VHDL 设计入门

50

2 、 If-Else(判断比较 )

语法格式 1 :

If 条件 Then

顺序语句;Else

顺序语句;End If;

Page 51: 第 4 章  VHDL 设计入门

51

例 4.3

LIBRARY ieee;

USE ieee.std_logic_1164.ALL;

ENTITY multi_2 IS

PORT(

s,d0,d1:IN STD_LOGIC;

y:OUT STD_LOGIC

);

END multi_2;

ARCHITECTURE A OF multi_2 IS

BEGIN

- -Y<=(NOT s AND d0) OR

(s AND d1);

PROCESS(s,d0,d1)

BEGIN

IF (s='0')THEN

y<=d0;

ELSE

y<=d1;

END IF;

END PROCESS;

END A;

Page 52: 第 4 章  VHDL 设计入门

52

图 4-27 例 4.3 的仿真波形

Page 53: 第 4 章  VHDL 设计入门

53

If-Else 命令还有以下几种变形:

语法格式 2

If 条件 Then

顺序语句;End If;

Page 54: 第 4 章  VHDL 设计入门

54

例 4.4无 ELSE 部分,综合时生成一个寄存器的结构LIBRARY ieee;

USE ieee.std_logic_1164.ALL;

ENTITY dff1 IS

PORT(

data_in: IN STD_LOGIC;

clock: IN STD_LOGIC;

data_out:OUT STD_LOGIC

);

END dff1;

ARCHITECTURE behv OF dff1 I

S

BEGIN

PROCESS(data_in,cloc

k)

BEGIN

IF(clock='1' AND cloc

k'event) THEN

data_out<=data_i

n;

END IF;

END PROCESS;

END behv;

Page 55: 第 4 章  VHDL 设计入门

55

图 4-28 例 4.4 的仿真波形

Page 56: 第 4 章  VHDL 设计入门

56

If 条件式 1 Then 语句命令 A 方块ElsIf 条件式 2 Then 语句命令 B 方块ElsIf 条件式 3 Then 语句命令 C 方块ElsIf 条件式 4 Then :Else 语句命令 N 方块End If;

说明:

1) 先判断条件式 1 结果是否为真,为真则执行语句命令 A ,执行完方块 A 内命令后,则跳至 End If 之后的命令继续执行;

2 )条件 1 为假时判断条件式 2 ,依次判断执行后跳至 End If当以上条件都不合适时则执行语句命令 N

方块;

语法格式 3:

Page 57: 第 4 章  VHDL 设计入门

57

例 4.5LIBRARY ieee;USE ieee.std_logic_1164.ALL;ENTITY encoder IS PORT( inv: IN STD_LOGIC_VECTOR(7 DOWNTO 0); y: OUT STD_LOGIC_VECTOR(2 DOWNTO 0) );END encoder;ARCHITECTURE rtl OF encoder ISBEGIN

PROCESS(inv)

BEGIN

IF inv(7) = '1' THEN y<="111";

ELSIF inv(6) = '1' THEN y<="110";

ELSIF inv(5) = '1' THEN y<="101";

ELSIF inv(4) = '1' THEN y<="100";

ELSIF inv(3) = '1' THEN y<="011";

ELSIF inv(2) = '1' THEN y<="010";

ELSIF inv(1) = '1' THEN y<="001";

ELSIF inv(0) = '1' THEN y<="000";

ELSE y<="000";

END IF;

END PROCESS;

END rtl;

Page 58: 第 4 章  VHDL 设计入门

58

图 4-29 例 4.5 的仿真波形

Page 59: 第 4 章  VHDL 设计入门

59

3 、 Wait( 等待 )

语法格式:

Wait Until 条件式;

说明:

上述命令的意义是要求等待条件式成立,常和 Process 或 Loop 命令合用。

Eg. 合并使用 Wait Until 和 Process 命令

Page 60: 第 4 章  VHDL 设计入门

60

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CH2_4_1 IS PORT( A,RST1 : IN STD_LOGIC; OP1 : OUT STD_LOGIC);END CH2_4_1;ARCHITECTURE M OF CH2_4_1 ISBEGIN PROCESS BEGIN OP1<=A; WAIT UNTIL RST1='1'; END PROCESS;END M;

Page 61: 第 4 章  VHDL 设计入门

61

§4.2 顺序语句 ( 二 ) Case-When,Null

Case-When 命令常用于选择执行有明确描述的信号,例

如读取内存地址是“ 0010”处的数据,,而 Null 命令常被用

于 Case-When 内的执行命令。1 、 Case-When (描述选择)

Case 选择信号 Is when 信号值 1 => 语句命令 A 方块 when 信号值 2 => 语句命令 B 方块 : when others => 语句命令 N 方块END Case;

Page 62: 第 4 章  VHDL 设计入门

62

Eg.利用 Case-When 的命令设计下面的电路方块功能。

其中 S1 、 S2控制开关的控制信号

OPOP

D0

D1

0

S1S2

Page 63: 第 4 章  VHDL 设计入门

63

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CH2_5_1 IS

PORT(

D0,D1:IN STD_LOGIC;

S:IN STD_LOGIC_VECTOR(1

DOWNTO 0);

OP:OUT STD_LOGIC

);

END CH2_5_1;

ARCHITECTURE M OF CH2_5_1 IS

SIGNAL A: STD_LOGIC;

BEGIN

PROCESS(S)

BEGIN

CASE S IS

WHEN "00"=>

A<=D0;

WHEN "01"=>

A<=D1;

WHEN "10"=>

A<=NOT A;

WHEN OTHERS=>

A<='0';

END CASE;

END PROCESS;

OP<=A;

END M;

Page 64: 第 4 章  VHDL 设计入门

64

2 、 Null (空语句)

与 Caes-when 语句连用

Signal S: Integer range 0 to 10;Signal A,D0,D1:Std_logic; :Case S Is when 2|4|5 => A<=D0; when 7=> A<=D1; when others=> NULL;End Case; :

Page 65: 第 4 章  VHDL 设计入门

65

作业:1 、试计算下列程序的 C 输出结果(假设 A=“0011” , B=“1001” )LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY lx2_1 ISPORT( A,B: IN STD_LOGIC_VECTOR(3 DOWNTO 0); C: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );END LX2_1;ARCHITECTURE M OF LX2_1 ISBEGIN C(1 DOWNTO 0)<=A(2 DOWNTO 1) OR B(1 DOWNTO 0); C(3 DOWNTO 2)<='1'&('1' XOR NOT A(3)); C(7 DOWNTO 4)<="1010" WHEN (A=B) ELSE "0100";END M;

Page 66: 第 4 章  VHDL 设计入门

66

2 、试设计 VHDL 程序完成下面的真值表功能:

输入 输出S2 S1 S0 Z

0 0 0 0

0 0 1 1

0 1 0 1

0 1 1 0

1 0 0 1

1 0 1 1

1 1 0 0

1 1 1 0

Page 67: 第 4 章  VHDL 设计入门

67

3 、试设计 VHDL 程序完成下面电路方块图:

1

23

D0D1

D2

D3

D4

'1'

'1'

OP

OP

S0S1S2

Page 68: 第 4 章  VHDL 设计入门

68

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY LX2_3 ISPORT( D0,D1,D2,D3,D4:IN STD_LOGIC; S:IN STD_LOGIC_VECTOR(2 DOWNTO 0); OP:OUT STD_LOGIC );END LX2_3;ARCHITECTURE M OF LX2_3 IS SIGNAL A: STD_LOGIC;BEGIN

PROCESS(S) BEGIN CASE S IS WHEN "000"=> A<=D0; WHEN "001"=> A<=D1; WHEN "011"=> A<=D2; WHEN "100"=> A<='1'; WHEN "101"=> A<=D3; WHEN "110"=> A<=D4 AND A; WHEN "111"=> A<='1'; WHEN OTHERS=> NULL; END CASE; END PROCESS;OP<=A;END M;

Page 69: 第 4 章  VHDL 设计入门

69

§4.3 并行同时语句(一)

基本的并行同时语句,可分三种形式来讨论:

• 直接设置语句:使用 <=运算符

•条件式信号设置语句: When-Else

•选择信号设置语句: With-Select

Page 70: 第 4 章  VHDL 设计入门

70

1 、直接设置语句:使用 <=运算符 虽然使用程序进行硬件描述,不过最终的结果是电路。所以,VHDL 的描述语法必须让电路具有同时并行处理的能力,而不是像 C 语言一次一个命令的方式顺序执行。

以下为, A 、 B 、 C 三点是将信号送入电路,此信号的结果 D 、E必须是以一次同时且并行方式出现,这样才符合电路硬件的动作规范。EG3-1. 赋值语句

Page 71: 第 4 章  VHDL 设计入门

71

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY CH2_3_1 IS

PORT(

A,B,C: IN STD_LOGIC;

D,E: OUT STD_LOGIC

);

END CH2_3_1;

ARCHITECTURE M OF CH2_3_1 IS

BEGIN

D<=A AND B;

E<=NOT C;

END M;

Page 72: 第 4 章  VHDL 设计入门

72

仿真结果:

Page 73: 第 4 章  VHDL 设计入门

73

2 、条件式信号设置语句: When-Else

When-Else 命令也是属于同时并行的语句命令,它的语法格式是:

信号 A<= 信号 B When (条件式 1 ) Else

信号 C When (条件式 2 ) Else

信号 D ;

说明:

1 )上述的条件式,是指一般常见的布尔表达式,亦即条件式的结果必定是真( Ture )或错 (False )中的 一种。

2 )当条件 1 为真时,则将信号 B传递给信号 A ,否则在确认条件式 2 为真时,将信号 C传递给信号 A 。最后条件1 和 2 都不成立时,将信号 D传递给信号 A 。

Page 74: 第 4 章  VHDL 设计入门

74

Eg3-2. 真值表( Ture Table)

输入 输出

X Y Z

0 0 0

0 1 1

1 0 1

1 1 0

Page 75: 第 4 章  VHDL 设计入门

75

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CH2_3_2A IS PORT( X,Y: IN STD_LOGIC; Z: OUT STD_LOGIC );END CH2_3_2A;ARCHITECTURE M OF CH2_3_2A ISBEGIN Z<='0' WHEN (X='0' AND Y='0') ELSE '1' WHEN (X='0' AND Y='1') ELSE '1' WHEN (X='1' AND Y='0') ELSE '0';END M;

Page 76: 第 4 章  VHDL 设计入门

76

仿真结果:

1 )其实在结构体中程序部分可以由 z<=x xor y;代替,其仿真结果完全相同。

2 ) Z 输出的延迟时间为 9.4ns

仿真结果说明:

Page 77: 第 4 章  VHDL 设计入门

77

3 、选择式信号设置语句: With-Select

语法格式:

With 选择信号 S Select

信号 Y<= 信号 A When 选择信号 S值为 m , 信号 B When 选择信号 S值为 n , :

信号 Z When Others;

说明:

1)With-Select 命令的作用是,判断选择信号 S 的值,依次是 m或 n 等相应的条件值,然后在判断成立时,将它对应的信号值 A或信号 B传递给信号 Y ;2 )当 S值不为罗列的任何值,则将 Others 保留字的信号值 Z ,传递给信号 Y ;3 ) S 的选择值必为不同

Page 78: 第 4 章  VHDL 设计入门

78

Eg3-3. 真值表( Ture Table)

输入 S 输出 Z

0 0 0

0 1 1

1 0 1

1 1 0

Page 79: 第 4 章  VHDL 设计入门

79

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CH2_3_3 ISPORT( S: IN STD_LOGIC_VECTOR(1 DOWNTO 0); Z: OUT STD_LOGIC);END CH2_3_3;ARCHITECTURE M OF CH2_3_3 ISBEGIN WITH S SELECT Z<='0' WHEN "00", '1' WHEN "01", '1' WHEN "10", '0' WHEN OTHERS;END M;

Page 80: 第 4 章  VHDL 设计入门

80

仿真结果:

使用 With-Select 时,必须特别注意它的功能在于,选择信号是针对某一特定的信号,而无法像When-Else 命令,作较多的信号条件比较。

说明: