100
课课课 课课课 VHDL 课课课课课课

课程简介

  • Upload
    bonnie

  • View
    118

  • Download
    6

Embed Size (px)

DESCRIPTION

数字系统与 VHDL 程序设计语言.  课程简介. 引例 :. VHDL 原理 :.  VHDL 语言. 非常高速硬件描述语言 , 也就是一种硬件 ( 数字电路 ) 设计语言 . 其 最大特点 是对电路的行为与结构进行高度抽象化规范化,并对设计进行模拟验证与综合优化,使分析和设计高度自动化。.  支持 VHDL 语言的软件平台. Max+PlusII.  由软件设计到硬件实现之间的媒介. CPLD / FPGA ( 可编程器件 ).  由软件设计到硬件实现的流程. 在 Max+PlusII 编写 VHDL 程序. 存盘 - PowerPoint PPT Presentation

Citation preview

Page 1: 课程简介

课程简介

数字系统与 VHDL 程序设计语言

Page 2: 课程简介

引例 :

VHDL 原理 :

可 编程 逻辑 器件

串行口

目 标器 件接 口

软 件 编 程

牛 自 动 生 产 线

牛 罐 头酸 辣 味 儿五 香 味 儿麻 辣 味 儿

计 算 机 控 制 系 统

Page 3: 课程简介

VHDL 语言

非常高速硬件描述语言 , 也就是一种硬件 ( 数字电路 ) 设计语言 . 其最大特点是对电路的行为与结构进行高度抽象化规范化,并对设计进行模拟验证与综合优化,使分析和设计高度自动化。

支持 VHDL 语言的软件平台

Max+PlusI

I 由软件设计到硬件实现之间的媒介

CPLD / FPGA ( 可编程器件 )

Page 4: 课程简介

在 Max+PlusII 编写 VHDL 程序

存盘( 文件名为实体名 , 后缀为 .VHD)

编译

软件仿真

管脚安排

下载

由软件设计到硬件实现的流程

Page 5: 课程简介

基本顺序语句

( 1 ) Process 语句

( 2 ) If-Else 语句

( 3 ) Case-When 语句

( 4 ) Null 语句

( 5 ) Wait until 语句

( 6 )变量赋值语句

( 7 ) For-Loop 语句

( 8 )过程调用语句

基本的并行语句

( 1 )直接赋值语句

( 2 ) Process 语句

( 3 ) When-Else

( 4 ) With-Select-When

( 5 )元件例化语句

( 6 ) For-Generate

Page 6: 课程简介

常用数字电路回顾( 1 )编码器

A 7

A 6

A 5

A 4

A 3

A 2

A 1

A 0

E N

Y 2

Y 1

Y 0

8 X 3

编码器

输入信号

输出信号

使能端口

Page 7: 课程简介

注: EN 为 1 时编码器工作

Page 8: 课程简介

举例

参看 EWB 辅助电路

Page 9: 课程简介

( 2 )译码器

Y3 Y2 Y1 Y0

1 1 1 01 1 0 11 0 1 10 1 1 1

A1 A0

0 00 11 01 1

A1 A0

0 00 11 01 1

Y3 Y2 Y1 Y0

1 1 1 01 1 0 11 0 1 10 1 1 1

S

1 × × 1 1 1 1 0000

译码器

1 2 3 4 5 6 7 8

16 15 14 13 12 11 10 9

V cc Y 0 Y 1 Y 2 Y 3 Y 4 Y 5 Y 6

A 0 A 1 A 2 S 3 S 2 S 1 Y 7 G N D

C T 74138

Page 10: 课程简介

VHDLVHDL 与数字电路设计与数字电路设计

引引 言言 VHDLVHDL 简介简介

一、由来 VHDL 是 Very High speed Integrated Circuit Hardware Description Language (非常高速集成电路硬件描述语言)的英文缩写。它是由美国国防部支持的一项研究计划,于 1983 年创建,目的是以文字化方法描述电子电路与系统。至今VHDL 约有 40 年的发展历史, 1987 年, VHDL 成为 IEEE标准,即 IEEE1076 标准, 1993 年修改为 IEEE1164 标准,1996 年, IEEE 又将电路合成的标准程序与规格加入到 VHDL 语言中,称为 1076.3 标准。之后,又有 1076.4 标准和 1076.6 标准。

Page 11: 课程简介

第一章 VHDL 的程序结构和软件操作

1-1 VHDL 程序的基本结构

1-2 软件操作— Max+plusⅡ 的操作

Page 12: 课程简介

第一章 VHDL 的程序结构和软件操作

1-1 VHDL 程序的基本结构 ( 1 ) LIBRARY 和 PACHAGE 的声明部分

作用:库( Library )是用于存放预先编译好的程序包 ( Package ),程序包中定义了数据集合体、逻 辑操作和元件等。主要是声明在设计或实体中 将用到的常数,数据类型,元件及子程序等。

使用格式: LIBRARY 库名;

USE 库名 . 程序包名 . All ;

Page 13: 课程简介

( 2 ) ENTITY 定义

作用:定义本设计的输入 / 出端口,即定义电路的外观, 即 I/O 接口的类型和数量使用格式:

端口名 :端口模式 数据类型; ) ;

ENTITY 实体名 Is

End 实体名;

格式格式 ::

Port ( 端口名 :端口模式 数据类型;

Page 14: 课程简介

( 3 ) ARCHITECTURE 定义

作用:定义实体的实现。即电路的具体描述,说明电路执 行什么动作或实现功能。

ARCHITECTURE 结构体名 Of 实体名 Is

Begin

描述语句;

End 结构体名;

使用格式使用格式 ::

Page 15: 课程简介

在 Max+plusⅡ 系统中有 4 个库能支持 VHDL 语言,它们分

别是 Std 库、 IEEE 库、 Altera 库和 Lpm 库。 Std 库和 IEEE 库

提供基本的逻辑运算函数及数据类型转换函数等。 IEEE

库中的程序包 std_logic_1164 定义了 std_logic 和

std_logic_vector 等数据类型。

Page 16: 课程简介

举例举例 :: 设计一个与门电路设计一个与门电路

111

001

010

000

YBA

逻辑符号逻辑符号 真值表真值表

Page 17: 课程简介

Library IEEE;

Use std.standard.all;

Entity and2 is

Port( A : in bit; B : in bit; Y : out bit);

End and2;

-- 首先定义输入输出端口名字,

模式( Mode ),信号类型

-- 注意最后语句的分号在括号外

实体定义 :

Page 18: 课程简介

Architecture Na of and2 is

Begin

Y<=’0’ when a=’0’ and B= ‘0’

else’0’ when A=’1’ and B = ‘0’

else ’0’ when A=’0’ and B = ‘1’

else ‘1’;

End Na

结构体定义 :

端口模式有以下几种类型: IN ; OUT ; INOUT ; BUFFER 。

Page 19: 课程简介

Architecture Nb of and2 is

Begin

c <=’1’ when a=’1’ and b = ‘1’ else ‘0’;

End Nb;

以上结构体表达何种电路?

一个实体可以有几个结构体,即结构体的定义可以有不同的形式

结论:

Page 20: 课程简介

1-2 软件操作— Max+plusⅡ 的操作 1-2-1 建立和编写一个 VHDL 语言的工程文件

1-2-2 VHDL 程序的编译

1-2-3 VHDL 语言程序的仿真

1-2-4 芯片的时序分析

1-2-5 安排芯片脚位

Page 21: 课程简介

1-2 软件操作— Max+plusⅡ 的操作

1.Max+plusⅡ 开发工具是美国 Altera 公司自行设计的一种软件工具,其全称为 Multiple Array Matrix and Programmable

Logic User System 。它具有原理图输入和文本输入(采用硬件描述语言)两种输入手段,利用该工具所配备的编辑、编译、仿真、综合、芯片编程等功能,将设计电路图或电路描述程序变成基本的逻辑单元写入到可编程的芯片中(如 FPGA 芯片),作成 ASIC 芯片。它是 EDA 设计中不可缺少的一种工具。2. 软件安装

Page 22: 课程简介

我们通过范例介绍:利用 Max+plusⅡ 系统

( 1 )如何编写 VHDL 程序(使用 Text Editor );

( 2 )如何编译 VHDL 程序(使用 Compiler ); ( 3 )如何仿真验证 VHDL 程序(使用 Waveform Editor , Simulator );

( 4 )如何进行芯片的时序分析(使用 Timing Analyzer );

( 5 )如何安排芯片脚位(使用 Floorplan Editor );

( 6 )如何下载程序至芯片(使用 Programmer )。

Page 23: 课程简介

1-2-1 建立和编写一个 VHDL 语言的工程文件

首先启动 Max+plusⅡ 系统,启动后系统进入主菜单画面,在主菜单

上有 5 个选项,分别是: Max+plusⅡ 、 File 、 Assign 、 Options 和 Help 。

( 1 )打开文本编辑器;用鼠标点击 File 选项,点击子菜单中的 New 选项,接着屏幕会出现 New 的对话框。在对话框内有 4 种编辑方式:图形编辑、符号编辑、文本编辑和波形编辑。 VHDL 文件属于文本,那么应该选择文本编辑方式,点击 OK按钮,屏幕上将出现一个无名的编辑窗口,则系统进入 文本编辑状态。

Page 24: 课程简介

( 2 )在编辑窗口中进行编辑输入,输入相应的描述语句。

( 3 )存盘。( a 我们编辑的 VHDL 文件扩展名为 vhd ; b 保存的文 件名必须和所定义的实体名相同。 c 文件存盘的目录不应是 根目录或桌面,建议存放在 Max2work 或 Maxplus2 目录,或 其子目录。)

以与门的设计为例讲述具体过程

Page 25: 课程简介

1-2-2 VHDL 程序的编译

( 1 )若文件没有打开,需首先打开要编译的 VHDL 文件;

( 2 )将目前的文件设置成工程文件;点击 File 选项,光标移到子菜单的

Project 项停留几秒钟,屏幕上会出现下一级菜单,点击 Set Project to

Current File

( 3 )打开编译器;点击主菜单 MAX+plusⅡ/Compiler 选项,屏幕上就出现编译 对话框。

( 4 )开始编译;完成了上述编译前的准备及必要的设置工作,点击编译对话框 中的 Start按钮,编译即开始。

以与门的设计为例讲述具体过程

Page 26: 课程简介

1-2-3 VHDL 语言程序的仿真

仿真是为了验证我们所编写的 VHDL 程序的功能是否正确。

( 1 )首先生成仿真波形文件

( a )打开波形编辑器;点击主菜单的 MAX+plusⅡ/Waveform Editor 选项,就

可在屏幕上显示波形编辑器窗口。在未输入信号名以前,整个窗口是空

白的。

( b )确定仿真持续时间( File/End Time )。

( c )选则输入输出端口名;

( d )编辑输入信号波形;

( e )信号波形编辑完成后,需存盘为仿真使用,文件名采取默认方式即可。

Page 27: 课程简介

( 2 )打开仿真器;点击主菜单 MAX+plus \SimulatorⅡ 项,此时弹出 Simulator

对话框。点击对话框的 Start按钮,仿真即开始。在仿真结束后打开仿真波 形文件(点击右下角的 Open SCF按钮)即可以显示仿真结果。

(以与门的设计为例讲述具体过程 )

Page 28: 课程简介

1-2-4 芯片的时序分析

仿真结果从波形上来看,很难给出定量的信号延迟关系,这一点时序分析却能

直观地用表来进行显示。

( 1 )选择要下载的器件型号;

( 2 )需要再编译一次。

(点击主菜单的 Assign/Device 项得到 Device对话框 )

( 3 )打开时序仿真器; (点击 Timing Analyzer 选项 )

( 4 )最后点击 Start按钮后,时序分析器开始启动。

(以与门的设计为例讲述具体过程 )

Page 29: 课程简介

1-2-5 安排芯片脚位

为了将程序下载到芯片,需安排芯片脚位。

( 1 )打开芯片脚位设置器; (MAX+plusⅡ/Floorplan Editor)

( 2 )将实体定义的端口名字和下载芯片的管脚进行具体对应; ( 3 )最后再进行一次编译。

教学演示片

Page 30: 课程简介

第二章 VHDL 语言要素

数 据 对 象变 量信 号常 数

数 据 类 型

操 作 数运 算 操 作 符

§2.1 VHDL 语言规则

数字型文字、字符串文字、标识符、下标名、段名数字型文字、字符串文字、标识符、下标名、段名

Page 31: 课程简介

§ 2-2 数据类型

数据类型分类:逻辑信号类型和数值信号类型。

§ 2-2-1 逻辑数据类型

( 1 )布尔代数( Boolean )型

定义位置:在 std 库的 standard 程序包中进行定义。

信号形式: FALSE , TRUE

( 2 )位( Bit )

定义位置:在 std 库的 standard 程序包中进行定义。

信号形式: 0 ,1

(低电位,高电位 )

Page 32: 课程简介

编码器 :

A 7

A 6

A 5

A 4

A 3

A 2

A 1

A 0

E N

Y 2

Y 1

Y 0

8 X 3

编码器

输入信号

输出信号

Page 33: 课程简介
Page 34: 课程简介

( 3 )位数组类型( Bit_Vector )

定义位置:在 std 库的 standard 程序包中进行定义。

例 :例 : Signal A: bit_vector(0 to 7);

Signal B: bit_vector(2 downto 0);

输入信号

输出信号

Page 35: 课程简介

( 4 )标准逻辑型( Std_Logic )

定义位置:在 IEEE 库的 std_logic_1164 程序包中进行定义

Page 36: 课程简介

可以看出,这个“标准逻辑”信号定义,比“位即 bit”信号对于数字逻辑电路的

逻辑特性描述更完整、更真实。所以在 VHDL 的程序里,对于逻辑信号的定

义,通常都是采用这个“标准逻辑”信号形式。使用这类数据信号,必须包含下面两条声明语句:

Library IEEE;

Use IEEE.std_logic_1164.all;

( 5 )标准逻辑数组类型( Std_Logic_vector )

定义位置:在 ieee 库的 std_logic_1164 程序包中进行定义。

Bit_Vector 与 Std_Logic_vector 的区别在于数组的

每一位前者为 BIT 型( 0 , 1 )后者为 Std_Logic 型

Page 37: 课程简介

§ 2-2-2 数值数据类型

( 1 )整数( Integer )

定义位置:在 std 库的 standard 程序包中进行定义。即数值范

围为 -231~231 。

( 2 )无符号( Unsigned )和有符号( Signed )类型

定义位置:有符号( Signed )和无符号( Unsigned )逻辑信号定义在

库 IEEE 的程序包 std_logic_arith 中。

Page 38: 课程简介

有符号类型数据代表有符号数值,即可以是正数, 0 ,负数;编

译器将有符号数类型作为一个补码的二进制数,最左边的位为

符号位。

无符号类型数据代表无符号数值,即代表 0 或正数;最左边的位

为最高位。如: Unsigned(“0110”) 代表 ;+6

+ 10

Unsigned(“1010”) 代表

如: signed(“0110”) 代表 +6 ; signed(“1010”) 代表-2 。

Page 39: 课程简介

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_arith.all;

entity data is

port(a,b: in unsigned(3 downto 0); --相应改为 a,b: in signed(3 downto 0);

c: out std_logic);

end data;

architecture m1 of data is

begin

c<='1' when a<b else '0';

end m1;

use ieee.std_logic_1164.all; ???

use ieee.std_logic_arith.all; ???

列举 a 、 b 具体值 ???

Page 40: 课程简介

当定义成无符号数据类型时,若 a<=”1000”,b=’0001’ ,即 a=8 , b=1 则结果

当定义成无符号数据类型时,若 a<=”1000”,b=’0001’ ,即 a=8 , b=1 则结果

另外:还有其他 positive ,natural,real 数据类型以及用户自定义数据

类型等。这些数据类型各有 特点,以后用到再行讲解

另外:还有其他 positive ,natural,real 数据类型以及用户自定义数据

类型等。这些数据类型各有 特点,以后用到再行讲解

c=’1’ 。

c=’0’ ;

当定义成有符号数据类型时,若 a<=”1000”,b=’0001’ , a=-8 , b=1 ,则结果

Page 41: 课程简介

§2.3 VHDL 数据对象

数据对象( Data Objects ) :

凡是可以被赋予一个值的对象称为数据对象,

数据对象用于传递信号。

例 :例 :

数据对象名 数据对象名 数据对象类型 数据对象类型 数据对象值的类型

Page 42: 课程简介

2-3-1 信号

信号数据对象,代表电路内部传输线路线路,其在元件之间起互连作用

信号数据对象的定义格式为:

Signal 信号名:数据类型 [ : = 设定值 ] ;

如: Signal A : Std_logic_vector(3 Down to 0) := “0000”;

注意:由于 Maxplus II 系统往往会忽略信号对象定义时所赋初始值,建议在结

构体中用赋值语句完成对信号的赋值。

信号赋值语句的语法格式为:

目标信号名 <= 表达式(设定值);

A <= “1010”

Page 43: 课程简介

2-3-2 变量

它用于对中间数据的临时存储,并不一定代表电路的某一组件。

变量数据对象的定义格式为: Variable 变量名:数据类型 [ : = 设定值 ] ;

如: Variable a: integer := 0;

变量赋值语句的语法格式为:目标变量名 := 表达式(设定值);

注意:由于 MAXPLUSII 系统往往会忽略变量对象定义时所赋初始值,建议在结

构体中用赋值语句完成对变量的赋值。

如: a := b+c;

Page 44: 课程简介

常数的定义格式为: Constant 常数名:数据类型 : =表达式;

如: Constant D1: Integer:=3; Constant D2: Std_Logic_Vector(D1 Down to 0) := ”0000”;

注意:常数数据对象定义的同时进行赋值。赋值符号为 “ :=”

2-3-3 常数

Page 45: 课程简介

2-3-4 信号、变量、常数对比

一、定义

Signal A: std_logic;

Variable A: std_logic_vector(7 downto 0);

Constant A: integer :=6 ;

二、赋值及赋值时刻A <= “1010” ;(延时)A := “1010”; (立刻)

三、定义区域信号:实体、结构体、程序包变量:进程、子程序常数:实体、结构体、程序包、块、进程、子程序

Page 46: 课程简介

四、适用范围

信号:实体、结构体、程序包变量:定义了变量的进程、子程序的顺序语句中常数:视其定义的位置而定

若常数定义在实体中,适用范围是实体所对应的

有结构体。

若常数定义在结构体中,适用范围就是本结构体。

Page 47: 课程简介

=1

=1

c

bx

y

执行结果为:

x<=c xor b, y<=c xor b

Page 48: 课程简介

执行结果为:

x<=c xor a, y<=c xor b

=1

=1

c

ax

y b

Page 49: 课程简介

练习:

1.定义信号 A1,A2,A3,A4,A5,A6,A7,A8

其中每一位信号均为标准逻辑型

2. 定义信号 B ,其数据类型为标准逻辑型。

3. 定义信号 C, 数据类型为整数型。

4. 给 A 、 B赋值,其中 A 的值为 11001101 ; B 的值为 0 。

Page 50: 课程简介

Library IEEE

Use ieee.std_logic_1164.all

Signal A: std_logic_vector(1 to 8)

Signal B: std_logic

Signal C: integer

Library Std

Use std.standard.all

A<=“11001101”

B<=‘0’

Page 51: 课程简介

2.4 VHDL 操作符

VHDL 操作符:逻辑、算术、符号、关系操作符。

2.4.1 逻辑运算符

一、分类及功能

And (与), Or (或), Not (非), Nand (与非),

Nor (或非), Xor (异或), Xnor (同或)。

A B

AND OR NAND NOR XOR XNOR输 入输 出 运 算

0 0

0 1

1 0

1 1

Y1 Y2 Y3 Y4 Y5 Y6

0

0

0

1

0

1

1

1

1

1

1

0

1

0

0

0

0

1

1

0

1

0

0

1

Page 52: 课程简介

二 . 用法1. 操作数的数据类型必须符合操作符的要求

能进行逻辑运算的数据类型: bit 、 bit_vector 、 boolean

std_logic 、 std_logic_vector

例Signal a,b,y: std_logic;

Signal c,d,z: integer;

y<=a and b;

z<=c and d;

Page 53: 课程简介

2. 表达式中有多个运算符时一般要加括号表达式中有多个运算符时一般要加括号,但 and 、 or 、 xnor除外

例Signal a,b,c,d: std_logic_vector(3 downto 0);

Signal e,f,g,h: std_logic_vector(1 downto 0);

d<=a and b and c;d<=a or b or c;d<=a xnor b xnor c;h<=e nor f nor g;h<=(e nor f) nor g;

3. 运算符两侧的操作数要对称

d<=(e nor f) nor g; ×

Page 54: 课程简介

Library IEEE

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY liti IS ;PORT(a,b,c,d: IN STD_LOGIC;

e : out STD_LOGIC);

END liti ;

ACHITECTURE AA1 OF liti IS

BEGIN

e<=(a and b) or tmp ;

Signal tmp : std_logic;

tmp<= c xor d ;

END AA1 ;

1

1=

&ab

cd

e

Page 55: 课程简介

2.4.2 关系运算符

= (等于), /= (不等于), < (小于), > (大于),

<= (小于等于,和信号的赋值符号相同), >= (大于等于)。

1. 等于和不等于的操作对象可以是任何数据类型构成的操作数。

2. 其它关系运算符对数据类型有一定的限制。(整数,枚举型)3. = 、 /= 在实现硬件电路时比其它的关系运算符对芯片的利用率

要高

Page 56: 课程简介

ENTITY my1 is

PORT(a,b : in bit_vector(0 to 3)

m : out boolean ) ;

END my1 ;

ARCHITECTURE a1 of my1

BEGIN

m<=(a = b) ;

END a1;

ENTITY my1 is

PORT(a,b : in bit_vector(0 to 3) m : out boolean ) ;

ARCHITECTURE a1 of my1

BEGIN

m<=(a >= b) ;

END a1;

以上两程序最终所实现的硬件电路见课本 P78

END my1 ;

Page 57: 课程简介

2.4.3 算术运算符

一、分类及功能

求和运算符、求积运算符、符号运算符、混合运算符、移位运算符

二 . 运用1.求和运算符

VHDL 中的求和运算符包括加减运算和并置运算,操作

数的数据类型为整型。

例 1 : Variable a,b,c,d,e,f : integer range 0 to 255;

a := b + c ; d := e – f ;

例 2 : Signal a : std_logic_vector(4 to 0);

Signal b : std_logic_vector(2 to 0);

Signal c : std_logic_vector(1 to 0);

a <= b c

Page 58: 课程简介

2. 移位运算符移位运算所对应的数据类型为一维数组,其中的元素维 bit、 boolean

例:Variable a1 : std_logic_vector(3 to 0);

a1 := “1011”;

a1 SLL 1 ; a1= 0110

a1 SLL 2 ; a1= 1100

a1 ROL 1 ; a1= 0111

3. 其它

Page 59: 课程简介

二、应用

现在 VHDL 已成功地应用于 ASIC 自动设计的模拟验证和综合优化等方面。 VHDL 是以文字的方式设计电路,在应用上,目前 VHDL 语言还仅限于数字电路的开发和设计。

三、 VHDL 和电路图设计方式比较

VHDL 与电路图设计电路的方式不同,主要有如下几方面 的优越性:( 1)易于修改;( 2)设计能力更强;( 3) VHDL 语言很方便:独立于器件设计;相同的程序 代码可以用于不同厂家生产的器件。

Page 60: 课程简介

VHDL 操作符复习回顾

一、逻辑运算符

And (与), Or(或), Not (非), Nand (与非),

Nor (或非), Xor (异或), Xnor (同或)。

A B

AND OR NAND NOR XOR XNOR输 入输 出 运 算

0 0

0 1

1 0

1 1

Y1 Y2 Y3 Y4 Y5 Y6

0

0

0

1

0

1

1

1

1

1

1

0

1

0

0

0

0

1

1

0

1

0

0

1

能进行逻辑运算的数据类型: bit 、 bit_vector 、 boolean

std_logic、 std_logic_vector

Page 61: 课程简介

二、关系运算符

= (等于), /=(不等于), <(小于), >(大于),

<= (小于等于,和信号的赋值符号相同), >=(大于等于)。

1.等于和不等于的操作对象可以是任何数据类型构成的操作数。

2.其它关系运算符对数据类型有一定的限制。(整数,枚举型)

三、算术运算符

求和运算符、求积运算符、符号运算符、混合运算符、移位运算符

VHDL 中的求和运算符包括加减运算和并置运算,操作数的数据类型 为整型。

Page 62: 课程简介

Signal a : std_logic_vector(4 downto 0);

Signal b : std_logic_vector(2 downto 0);

Signal c : std_logic_vector(1 downto 0);

B2 B1 B0b:

C1 C0c:

b c

B2 B1 B0b: C1 C0 : c B2 B1 B0 C1 C0

a <= b c

A4 A3 A2 A1 A0a:

a: B2 B1 B0 C1 C0

Page 63: 课程简介

Variable A : std_logic_vector(6 downto 0);

A := “10110001”; 1 0 1 1 0 0 0 1

A:

A SLL 1 ; 1 0 1 1 0 0 0 1

A:0

1 0 1 1 0 0 0 1

A:

0

A ROL 1 ;

1 0 1 1 0 0 0 1

A:

1

Page 64: 课程简介

第三章 VHDL顺序语句

一、顺序语句概念

顺序语句的特点是,每一条顺序语句的执行顺序是与它们的书写顺

序基本一致的。顺序语句只能出现在进程( Process )和子程序中,

子程序包括函数( Function )和过程( Procedure )。

二、种类

进程语句赋值语句 流程控制语句 等待语句

子程序调用语句 返回语句 空操作语句

Page 65: 课程简介

3.1 进程语句 ( Process 语句)

A B C

A B CA

A B CB

A B CC

000

0

输入信号发生变化时,电路启动进行计算

﹠﹠

﹠﹠AB

C

Y 1

Y 2

Y 3

Y 4

Y

Page 66: 课程简介

进程语句是由顺序语句构成的,通过信号与结构体其余部分进行信

息交流,在进程中有一个敏感信号列表,表中列出的任何信号的改

变都将启动进程,执行进程内相应的顺序语句。进程语句是将并行

语句和顺序语句区分开来的标志之一。

语法格式:

[ 进程标号 :] Process [(敏感信号列表 )]

[Variable declarations] -- 变量声明

Begin

顺序语句;

End Process [Process label];

Page 67: 课程简介

Process(sel,x1,x2)

Begin

f<=x1;

If sel=1 then

f<=x2;

end if;

End process;

Process(sel,x1,x2

)

Begin

If sel=1 then

f<=x2;

end if;

f<=x1;

End process;

在第二个进程中,无论什么情况, f=x1 ,而在第一个进程中,只有信号 sel /=1 时, f=x1 。因此,语句的排列顺序很重要,会影响信号的输出结果。

区区别别

Page 68: 课程简介

3.2 赋值语句

赋值语句包括变量赋值语句和信号赋值语句,前者的赋值是立刻发生的,

后者的赋值发生在一个进程结束的时刻,并延时进行。

变量赋值目标 := 赋值源

信号赋值目标 <= 赋值源

在同一进程中,同一信号赋值目标有多个赋值源时,信号赋值目标获

得的是最后一个赋值源的值,其前面相同的赋值目标不做任何变化。

注:

3.2.1 信号和变量赋值

Page 69: 课程简介

Signal s1,s2 : std_logic ;

Signal sec : std_logic_vector(0 to 7);

Process (s1 , s2)

Variable v1,v2 : std_logic;

Begin

v1 := ‘1’;

v2 := ‘1’ ;

s1 <= ‘1’;

s2 <= ‘1’;

sec(0) <= v1;

sec(1) <= v2;

Signal s1,s2 : std_logic ;

Signal sec : std_logic_vector(0 to 7);

Process (s1 , s2)

Variable v1,v2 : std_logic;

Begin

v1 := ‘1’;

v2 := ‘1’ ;

s1 <= ‘1’;

s2 <= ‘1’;

sec(0) <= v1;

sec(1) <= v2;

sec(2) <= s1;

sec(3) <= s2;

v1 : = ‘0’;

v2 : = ‘0’;

s2 <= ‘0’;

sec(4) <= v1 ;

sec(5) <= v2 ;

sec(6) <= s1 ;

sec(7) <= s2 ;

END PROCESS

sec(2) <= s1;

sec(3) <= s2;

v1 : = ‘0’;

v2 : = ‘0’;

s2 <= ‘0’;

sec(4) <= v1 ;

sec(5) <= v2 ;

sec(6) <= s1 ;

sec(7) <= s2 ;

END PROCESS

“ 0100 0111 ”

Page 70: 课程简介

3.2.2 信号和变量赋值举例

1. 标识符赋值目标

Variable a , b : std_logic;

Signal c : std_logic_vector(1 to 4);

a: = ‘1’;

b: = ‘0’;

c <=“1100”;

c(3) <=‘1’ ;

注:一位值用单引号,多位值用双引号

Page 71: 课程简介

2. 段赋值

Signal c : std_logic_vector(1 to 4);

c(1 to 2) <=‘10’ ;

c(1 to 4) <=‘1010’ ;

3. 块赋值

Signal a,b,c,d : std_logic;

Signal s : std_logic_vector(1 to 4);

s <= “0100” ;

(a,b,c,d) <= s ;

位置关联

Page 72: 课程简介

Variable e,f : std_logic;

Variable g : std_logic_vector(1 to 2);

Variable h: std_logic_vector(1 to 4);

e := ‘0’ ;

f := ‘1’ ;

g := “10”;

h :=(e=>3, f=>4, g(1)=>2, g(2)=>1);

名称关联

结果: h 的值为

1010

Page 73: 课程简介

3.3 流程控制语句

3.3.1 IF 语句

语法格式:If expression Then

statement;

Elsif expression Then

statement;

Elsif Then

statement;

else

statement;

End if;

根据条件进行相应赋值操作

根据条件进行相应赋值操作

Page 74: 课程简介

例 1 :

A1 A2 Y

0 00 1

1 011

D0D1

D2D3

A1

A2

D0 D1 D2 D3

Y

四 选 一 数据 选 择 器

Process(A)

Begin

If A=”00” then

f<=D0;

elsif A=”01” then

f<=D1;

elsif A=”10” then

f<=D2;

else f<=D3;

end if;

end process;

Page 75: 课程简介

一、第一种 IF 语句

IF 条件句 THEN

顺序语句

END IF

IF 条件句 THEN

顺序语句

END IF

例题例题

语句格式

IF ( a >b ) THEN

out<= ‘1’ ;

END IF;

IF ( a >b ) THEN

out<= ‘1’ ;

END IF;

Page 76: 课程简介

二、第二种 IF 语句 IF 条件句 THEN

顺序语句

ELSE

顺序语句

END IF

IF 条件句 THEN

顺序语句

ELSE

顺序语句

END IF

语句格式

例题例题

IF ( a >b ) THEN

out<= ‘1’ ;

ELSE

out<=‘0’;

END IF;

IF ( a >b ) THEN

out<= ‘1’ ;

ELSE

out<=‘0’;

END IF;

Page 77: 课程简介

三、第三种 IF 语句

语法格式:If 条件句 Then

顺序语句 ;

Elsif 条件句 Then

顺序语句 ;

Elsif 条件语句 Then

顺序语句 ;

else

顺序语句 ;

End if;

语句格式

语句格式

Page 78: 课程简介

例题 1 :例题 1 :

Signal a,b,c,p1,p2,z : bit;

IF (p1=‘1’) THEN

z <=a;

ELSIF (p2=‘0’) THEN

z <= b;

ELSE

z <= c;

END IF;

Signal a,b,c,p1,p2,z : bit;

IF (p1=‘1’) THEN

z <=a;

ELSIF (p2=‘0’) THEN

z <= b;

ELSE

z <= c;

END IF;

? 选择方式选择方式

P1 P2 Z

0 00 1

1 011

cb

aa

画线部分意思: ELSIF (p1=‘0’ and p2=‘0’)注

Page 79: 课程简介

例题 2 : 8线- 3线优先编码器例题 2 : 8线- 3线优先编码器

I7 I6 I5 I4 I3 I2 I1 I0 Y3 Y2 Y11 1 1 10 1 1 1 00 0 1 1 0 10 0 0 1 1 0 00 0 0 0 1 0 1 10 0 0 0 0 1 0 1 00 0 0 0 0 0 1 0 0 10 0 0 0 0 0 0 1 0 0 0

Page 80: 课程简介

LIBRARY IEEE ;

USE IEEE.STD_LOGIC_1164.ALL;ENTITY coder IS

PORT(I : IN STD_LOGIC_VECTOR(0 TO 7)

Y: OUT STD_LOGIC_VECTOR(1 TO 3));

END coder ;

实 体 设 计

功能:设计元件外观功能:设计元件外观

Page 81: 课程简介

ARCHITECTURE a1 or coder IS

Begin

IF (I(7)=‘1’) THEN Y<=“111”;

ELSIF (I(6)=‘1’) THEN Y<=“110”;

ELSIF (I(5)=‘1’) THEN Y<=“101”;

ELSIF (I(4)=‘1’) THEN Y<=“100”;

ELSIF (I(3)=‘1’) THEN Y<=“011”;

ELSIF (I(2)=‘1’) THEN Y<=“010”;

ELSIF (I(1)=‘1’) THEN Y<=“001”;

ELSE Y<=“000”;

A7 A6 A5 A4 A3 A2 A1 A0 Y3 Y2 Y11 1 1 10 1 1 1 00 0 1 1 0 10 0 0 1 1 0 00 0 0 0 1 0 1 10 0 0 0 0 1 0 1 00 0 0 0 0 0 1 0 0 10 0 0 0 0 0 0 1 0 0 0

END a1;

结 构 体 设 计

功能:描述输入和输出之间的逻辑关系功能:描述输入和输出之间的逻辑关系

END IF;

Page 82: 课程简介

练习题: 设计一个 3线- 8线译码器

A1 A2 A3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0

0 0 0 0 0 0 0 0 0 0 10 0 1 0 0 0 0 0 0 1 00 1 0 0 0 0 0 0 1 0 00 1 1 0 0 0 0 1 0 0 01 0 0 0 0 0 1 0 0 0 01 0 1 0 0 1 0 0 0 0 01 1 0 0 1 0 0 0 0 0 01 1 1 1 0 0 0 0 0 0 0

A1

A2

A3

Y1Y2Y3Y4Y5Y6

Y0

Y7

3 8线 -线 译 码 器

元件外观元件外观 输入输出逻辑关系输入输出逻辑关系

Page 83: 课程简介

LIBRARY IEEE ;

USE IEEE.STD_LOGIC_1164.ALL;ENTITY coder IS

PORT(A : IN STD_LOGIC_VECTOR(1 TO 3)

Y: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));

END coder ;

实 体 设 计

功能:设计元件外观功能:设计元件外观

A1

A2

A3

Y1Y2Y3Y4Y5Y6

Y0

Y7

3 8线 -线 译 码 器

Page 84: 课程简介

ARCHITECTURE a1 or coder IS

Begin

IF A=“000” THEN Y<=“00000001”;

ELSIF A=“001” THEN Y<=“00000010”;

ELSIF A=“010” THEN Y<=“00000100”;

ELSIF A=“011” THEN Y<=“00001000”;

ELSIF A=“100” THEN Y<=“00010000”;

ELSIF A=“101” THEN Y<=“00100000”;

ELSIF A=“110” THEN Y<=“01000000”;

ELSE Y<=“10000000”;

END a1;

结 构 体 设 计

功能:描述输入和输出之间的逻辑关系功能:描述输入和输出之间的逻辑关系

END IF;

A1 A2 A3 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0

0 0 0 0 0 0 0 0 0 0 10 0 1 0 0 0 0 0 0 1 00 1 0 0 0 0 0 0 1 0 00 1 1 0 0 0 0 1 0 0 01 0 0 0 0 0 1 0 0 0 01 0 1 0 0 1 0 0 0 0 01 1 0 0 1 0 0 0 0 0 01 1 1 1 0 0 0 0 0 0 0

Page 85: 课程简介

3.3.2Case-When 语句

作用:根据条件进行相应的赋值操作。

语法格式:Case 表达式 Is

When 选择值 =>顺序语句

When 选择值 =>顺序语句 …

End case;

语法格式:Case 表达式 Is

When 选择值 =>顺序语句

When 选择值 =>顺序语句 …

End case;

CASE 语句根据满足的条件直接选择多项顺序语句的一项执行

=> 不是信号赋值符号,其意思等价于 “ THEN”

CASE 语句根据满足的条件直接选择多项顺序语句的一项执行

=> 不是信号赋值符号,其意思等价于 “ THEN”

Page 86: 课程简介

例题 1: 用 CASE 语句设计四选一数据选择器 例题 1: 用 CASE 语句设计四选一数据选择器

s1

s2

abcd

zMUX41

s1 s1 Y

0 00 1

1 011

ab

cd

Page 87: 课程简介

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL

ENTITY mux41 IS

PORT ( s1, s2 : in std_logic;

a,,b,c,d: in std_logic;

z: out std_logic);

END ENTITY mux41;

ARCHITECTURE activ OF mux41 IS

SIGNAL s :std_logic_vector(1 downto 0);

BEGIN

S<= s1& s2

PROCESS (s1,s2,a,b,c,d)

BEGIN

CASE s IS

WHEN “00”=> z<=a;

WHEN “01”=> z<=b;

WHEN “10”=> z<=c;

WHEN “11”=> z<=d;

WHEN OTHERS => z<=‘x’;

END CASE;

END PROCESS;

END activ;

s1

s2

abcd

zMUX41

Page 88: 课程简介

ARCHITECTURE activ OF mux41 IS

SIGNAL s :std_logic_vector(1 downto 0);

BEGIN

S<= s1& s2

PROCESS (s1,s2,a,b,c,d)

BEGIN

IF s =“00” then a=>z;

ELSIF s=“01” then b=>z;

ELSIF s=“10” then c=>z;

ELSE d=>z;

END IF;

END ARCHITECTURE activ;

ARCHITECTURE activ OF mux41 IS

SIGNAL s :std_logic_vector(1 downto 0);

BEGIN

S<= s1& s2

PROCESS (s1,s2,a,b,c,d)

BEGIN

CASE s IS

WHEN “00”=> z<=a;

WHEN “01”=> z<=b;

WHEN “10”=> z<=c;

WHEN “11”=> z<=d;

WHEN OTHERS => z<=‘x’;

END CASE;

END PROCESS;

END activ;

Page 89: 课程简介

例题 2:例题 2:SIGNAL SEL : INTEGER RANGE 0 TO 15;

……

CASE SEL IS

WHEN 0 => Z1 <=‘1’;

WHEN 1 3 =>Z2 <=‘1’;

WHEN 4 TO 7 2 => Z3<=‘1’;

WHEN OTHERS =>Z4<=‘1’;

IF 与 CASE比较IF 与 CASE比较

1. IF 语句中条件句之间是相与的关系,

CASE 语句中条件句之间是相或的关系。2. CASE 条件语句必须将所有情况列出而 IF则不必。

3. IF 语句可实现优先级, CASE 语句则不可以。

Page 90: 课程简介

课堂练习题:试设计一个 4 位奇偶校验器

奇 偶校 验

A1A2A3A4

Y

A1 A2 A3 A4 Y

0 0 0 0 10 0 0 1 00 0 1 0 00 0 1 1 10 1 0 0 00 1 0 1 10 1 1 0 10 1 1 1 01 0 0 0 01 0 0 1 11 0 1 0 11 0 1 1 01 1 0 0 11 1 0 1 01 1 1 0 01 1 1 1 1

Page 91: 课程简介

数码显示一、数码显示器

(一 ) 发光二极管 ↗↗

发光二极管特性 :当加正向电压时 ,二极管导通并发光 .利用这了

一特性可制成共阴极和共阳极七段数码显示器。

Page 92: 课程简介

( 二 ) 七段数码显示器1.工作原理

↗↗↗↗↗↗

↗↗

↗↗

↗↗

a

b

c

d

e

f

g

共阴极接法

a b c d e f g

a

b

cd

e

f g

Page 93: 课程简介

2. 显示代码概念

a b c d e f g

a

b

c

d

e

fg

1 1 1 1 0 1 11 1 1 1 0 1 1

9 的显示代码

字型

显 示 代 码

a b c d e f g1 1 1 1 1 1 0

0 1 1 0 0 0 0

1 1 0 1 1 0 1

1 1 1 1 0 0 1

0 1 1 0 0 1 10 1 1 0 0 1 1

1 0 1 1 1 1 1

1 1 1 0 0 0 0

1 1 1 1 1 1 11 1 1 1 0 1 1

Page 94: 课程简介

辅助实验辅助实验

Page 95: 课程简介

显示译码器

显示译码器功能显示译码器功能

15

14

13

12

11

10

9

Y f

Y g

Y a

Y b

Y c

Y d

Y e

A 1

A 2

A 3

A 0

a

d

g

Page 96: 课程简介

A3 A2 A1 A0 Ya Yb Yc Yd Ye Yf Yg

0 0 0 0 1 1 1 1 1 1 0 0

0 0 0 1 0 1 1 0 0 0 0 1

0 0 1 0 1 1 0 1 1 0 1 2

0 0 1 1 1 1 1 1 0 0 1 3

0 1 0 0 0 1 1 0 0 1 1 4

0 1 0 1 1 0 1 1 0 1 1 5

0 1 1 0 0 0 1 1 1 1 1 6

0 1 1 1 1 1 1 0 0 0 0 7

1 0 0 0 1 1 1 1 1 1 1 8

1 0 0 1 1 1 1 0 0 1 1 9

输入 输出 显示结果

其真值表如下所示 :

输入代码 输出显示代码

Page 97: 课程简介

Library ieee;

Use ieee.std_logic_1164.all;

Use ieee.std_logic_unsigned.all;

Entity btod is

Port(A : in std_logic_vector(3

downto 0);

Y : out std_logic_vector(6 downto

0));

End btod;

Architecture a1 of btod is

Begin

Process(d)

Begin

Case A is

when "0000“ => Y<= "0111111”; --0

when "0001“ => Y<= " 0000110”; --1

when "0010“ => Y<= " 1011011”; --2

when "0011“ => Y<= " 1001111” ;--3

when "0100“ => Y<= " 1100110” ;--4

when "0101“ => Y<= " 1101101” ;--5

when "0110“ => Y<= " 1111101”; --6

when "0111“ => Y<= " 0000111”; --7

when “1000“ => Y<= “1111111 ”; --8

when “1001“ => Y<= " 1101111” ;--9

End a1;

Page 98: 课程简介

3.3.3 LOOP 语句

一、单个 LOOP 语句

[LOOP 标号 :] LOOP

顺序语句

END LOOP [LOOP 标号 ] ;

例:L2 : LOOP

a:= a + 1 ;

EXIT L2 WHEN a >10;

END LOOP L2;

Page 99: 课程简介

二、 FOR_LOOP 语句

[LOOP 标号 :] FOR 循环变量 IN 循环次数范围 LOOP

顺序语句;

END LOOP [LOOP 标号 ] ;

A7 A6 A5 A4 A3 A2 A1 A0 XOR结果1 1 1 0 0 0 0 1 01 1 1 1 1 0 0 1 01 1 1 0 0 0 0 0 11 1 1 1 1 0 0 0 1

例:试设计一个八位奇偶校验器

注: 0 XOR a = a

Page 100: 课程简介

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY JIOU ISPORT (a : IN STD_LOGIC_VECTOR(7DOWNTO 0);

y: OUT STD_LOGIC);

END JIOU;

ARCHITECTURE OPT OF JIOU IS

SIGNAL tmp : STD_LOGIC;

BEGIN

PROCESS (a)

BEGIN

tmp <= ‘0’;

FOR n IN 0 TO 7 LOOP

tmp <= tmp XOR a(n);

END LOOP;

y <= tmp;

END PROCESS;

END opt;