数字电子技术基础课件_第1页
数字电子技术基础课件_第2页
数字电子技术基础课件_第3页
数字电子技术基础课件_第4页
数字电子技术基础课件_第5页
已阅读5页,还剩158页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章数字系统硬件设计10.1VHDL概述10.2VHDL的基本设计流程10.3VHDL程序基本结构10.4VHDL数据类型与运算操作符10.5属性本章小结思考题与习题第10章数字系统硬件设计10.1VHDL概述

10.1VHDL概述

硬件描述语言(HardwareDescriptionLanguage,HDL)是电子系统硬件行为描述、结构描述和数据流描述的语言。3种描述方法形成3种不同的设计风格。利用硬件描述语言,可以进行数字电子系统SoC、FPGA和集成电路ASIC的设计。

10.1VHDL概述

硬件描述语言(Ha

电子设计自动化(ElectronicDesignAutomatic,EDA)技术的基础是描述语言、设计工具和实现器件。三者的关系是:设计师用硬件描述语言描绘出硬件的结构或行为,用EDA设计工具将这些描述编译、综合、映射成与半导体工艺无关的硬件配置文件,半导体器件FPGA则是这些硬件配置文件的实现载体。当给FPGA器件加载、配置上不同的文件时,这个器件便具有不同的功能。在这一系列的设计、综合、仿真、验证、配置的过程中,现代电子设计方法贯穿于其中。

电子设计自动化(ElectronicDes

以HDL语言表达设计意图、以FPGA为硬件实现载体、以计算机为设计开发环境、以EDA软件为开发工具的现代电子设计方法是电子设计工程师要掌握的基本技能之一。本章从应用的角度向读者介绍VHDL编程技术,让读者掌握VHDL编程方法,为集成电路的前端设计打下基础。

以HDL语言表达设计意图、以FPGA

10.1.1硬件描述语言的发展

1.VHDL发展的技术根源

在VHDL形成之前,已有许多程序设计语言,如C、Pascal、Fortran、Prolog等。这些语言运行在不同的硬件平台和不同的操作环境中,它们适合于描述过程和算法,不适合作硬件描述。在利用EDA工具进行电子设计时,逻辑图、分立电子元件作为整个电子系统的设计越来越复杂,已不适应设计要求。一款EDA工具,需要一种硬件描述语言来作为它的工作语言。众多的EDA工具开发者各自推出了自己的硬件描述语言。

10.1.1硬件描述语言的发展

1.VHDL发展的技

2.VHDL发展的社会根源

美国国防部电子系统项目有众多的承包公司。由于各公司的技术路线不一致,许多产品不兼容,再加上使用各自的设计语言,使得各公司的设计不能被重复利用,造成了信息交换困难和维护困难。美国政府为了降低开发费用,避免重复设计,由国防部为超高速集成电路提供一种硬件描述语言VHDL,期望它功能强大、语法严密、可读性好。政府要求各公司的合同都用该语言来描述,以避免产生歧义。

2.VHDL发展的社会根源

美国国防部电子系统项

10.1.2VHDL的特点

VHDL主要用于描述数字系统的结构、行为、功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式、描述风格以及语法类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计(可以是一个元件、一个电路模块或一个系统)分成实体和结构体。在对一个设计实体定义了外部界面后,一旦其结构体开发完成,其他的设计就可以直接调用这个实体,这种将设计项目分成实体和结构体的概念是VHDL系统设计的基本特点。与其他硬件描述语言相比,VHDL具有以下特点:

10.1.2VHDL的特点

VHDL主要用于描述数

1.功能强大、设计灵活

VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑功能。它具有多层次的设计描述功能,层层细化,支持设计库和可重复使用的元件生成,最后可直接生成电路级描述。VHDL支持时序电路、组合逻辑电路的设计,还支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言所不能比拟的。

1.功能强大、设计灵活

VHDL具有功能强大的语

2.支持广泛、易于修改

由于VHDL已经成为IEEE标准所规范的硬件描述语言,目前大多数EDA工具都支持VHDL,这也为VHDL的进一步推广和广泛应用奠定了基础。

在硬件电路设计过程中,主要的设计文件都是用VHDL进行源代码的设计,而由于VHDL语法严谨、结构清晰、参数化设计等优点,并遵循统一的标准和规范,所以易读及易于修改。

2.支持广泛、易于修改

由于VHDL已经成为I

3.强大的系统硬件描述能力

VHDL具有多层次的设计描述功能,既可以描述系统级电路,又可以描述门级电路。而描述既可以采用行为描述、寄存器传输描述或结构描述,也可以采用三者混合的混合级描述。强大的行为描述能力,可以避开具体的器件结构,能够从逻辑行为上描述和设计大规模的电子系统,它支持大规模设计的分解和已有设计的再利用。

VHDL具有丰富的数据类型,支持预定义和自定义的数据类型,给硬件描述带来较大的自由度。

3.强大的系统硬件描述能力

VHDL具有多层次的

4.独立于器件的设计、与工艺无关

VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必关心最终设计实现的目标器件是什么,就可以开展独立的电路功能和系统行为设计。

设计人员用VHDL进行硬件电路设计时,不需要考虑制造器件的工艺,因此可以集中精力进行功能设计。当设计经由综合器进行编译、模拟和综合后,可以选用不同的映射工具将设计映射到不同的工艺上去。映射到不同的工艺,只需要改变相应的映射工具,而无需修改VHDL语言描述。

4.独立于器件的设计、与工艺无关

VHDL对设计

5.很强的移植能力

VHDL是一种标准化的硬件描述语言,几乎所有的EDA开发工具都支持VHDL,使得VHDL的应用特别广泛。

用VHDL进行硬件电路设计时,VHDL的可移植性表现为:对于同一个设计的VHDL描述,可以用任一模拟工具进行模拟;进行综合时,也可以选择任一综合工具进行综合,因此VHDL具有强大的移植能力。

5.很强的移植能力

VHDL是一种标准化的硬件描

6.易于共享和复用

VHDL语法规范、标准、可读性强。用VHDL设计的源文件,既是程序,也是文档,可以作为设计人员进行设计成果交流的文件。

VHDL采用基于库(Library)的设计方法,这样,设计人员在进行大规模集成电路的设计时,不需要从底层电路开始一步步进行设计,可以直接调用原来设计好的模块。这些模块可以预先设计或使用以前设计中的存档模块,将这些模块存放到库中就可以在以后的设计中进行复用,减小了硬件电路设计的工作量,提高了设计效率,缩短了项目的开发周期。

6.易于共享和复用

VHDL语法规范、标准、可读

10.1.3VHDL的设计技术

1.自底向上设计方法

传统的电子设计技术,多数属于手工设计技术(如目前多数数字电路教材中介绍的数字电路设计技术),通常是自底向上(BottomUp)的,即首先确定构成系统最底层的电路模块或目标元件的类别和功能,然后根据主系统的功能要求,将它们组合成更大的功能块,使它们的结构和功能满足高层系统的要求,并以此流程逐步向上递推,直至完成整个目标系统的设计。

10.1.3VHDL的设计技术

1.自底向上设计方

2.自顶向下设计方法

随着EDA技术的快速发展,自顶向下(TopDown)的设计方法得到了有效应用,是EDA技术的首选设计方法,成为CPLD、FPGA以及ASIC开发的主要设计手段。自顶向下的设计方法的本质是层次建模、分模块设计。设计者首先规划整个系统的功能和性能,然后对系统功能进行划分,将系统分割为功能较简单、规模较小的若干个功能子块,并确立它们之间的相互关系;然后进一步对各个子模块进行分解,直至达到无法进一步分解的底层功能模块。在进行模块划分时,需要注意各模块功能的完整性和可重复利用性。

2.自顶向下设计方法

随着EDA技术的快速发

10.2VHDL的基本设计流程

图10.2.1是基于EDA软件的FPGA/CPLD开发流程框图,下面分别介绍各设计模块的功能特点。对于目前流行的EDA工具软件,图10.2.1的设计流程具有一般性。

10.2VHDL的基本设计流程

图10.2.1是基于图10.2.1FPGA/CPLD的开发流程图10.2.1FPGA/CPLD的开发流程

1.设计规范

设计者首先需要对产品的应用场合、功能、要求等进行考虑和分析,确定一些技术指标,如面积、速度、功耗等。

2.设计输入

设计输入指用一定的逻辑表达方式将电路系统设计表达出来。常用的表达方式可分为图形输入和文本输入两种类型。

1.设计规范

设计者首先需要对产品的应用场合、功

1)图形输入

图形输入通常包括状态图输入、波形图输入和原理图输入。

状态图输入:常用于状态机的设计,即将一个系统划分为有限个状态,确定不同状态间的转移条件以及输入和输出。用绘图的方法在EDA工具的状态图编辑器上绘出状态图,EDA工具可自动将状态图转化为HDL代码。

波形图输入:将待设计的电路系统看成是一个黑盒子,只需告诉EDA工具黑盒子电路的输入和输出时序波形图,EDA工具就能据此要求完成电路系统的设计。

1)图形输入

图形输入通常包括状态图输入、波形图

原理图输入:最常用的图形输入方法。这是一种类似于传统电子设计方法中电路原理图的绘制,即在EDA软件的图形编辑界面上绘制能完成特定功能的电路原理图。原理图由逻辑器件(符号)和连接线构成,图中的逻辑器件可以是EDA软件库中预定义的功能模块(如与门、非门、或门、触发器以及各种含74系列器件功能的宏功能块等),也可以是自定义的功能模块。

原理图输入:最常用的图形输入方法。这是一种类似于传统电

原理图输入方法的优点主要在于不需要增加新的相关知识(诸如HDL等),设计过程形象直观,适用于初学或教学演示等。然而,其缺点同样十分明显。

(1)由于图形设计并未标准化,不同的EDA图形处理工具对图形的设计规则、存档格式和图形编译方式都不同,因此图形文件兼容性差,难以交换和管理。

(2)随着电路设计规模的扩大,原理图输入描述方式必然引起一系列难以克服的困难,如电路功能原理的易读性下降,错误排查困难,整体调整和结构升级困难等。

原理图输入方法的优点主要在于不需要增加新的相关知识(诸

(3)由于在原理图中已确定了设计系统的基本电路结构和元件,留给综合器和适配器的优化选择空间已十分有限,因此难以实现用户所希望的面积、速度以及不同风格的综合优化。显然,原理图的设计方法明显偏离了电子设计自动化最本质的涵义。

(4)在设计中,由于必须直接面对硬件模块的选用,因此行为模型的建立将无从谈起,从而无法实现真实意义上的自顶向下的设计方案。

(3)由于在原理图中已确定了设计系统的基本电路结构和元

2)HDL文本输入

HDL文本输入方式与传统的计算机软件语言输入类似,就是对使用了某种硬件描述语言的电路设计文本(如VHDL或VerilogHDL的源程序)进行编辑输入。

应用HDL文本输入方法克服了上述原理图输入法存在的所有弊端,为EDA技术的应用和发展打开了一片广阔的天地。当然,在一定的条件下,情况会有所改变。目前有些EDA输入工具可以把图形的直观与HDL的优势结合起来,如状态图输入的编辑方式,即用图形化状态机输入工具,用图形的方式表示状态图。

2)HDL文本输入

HDL文本输入方式与传统的计

3.综合、优化

整个综合过程就是依据给定的硬件结构组件和约束控制条件对设计者在EDA平台上编辑输入的HDL文本、原理图或状态图形设计等进行编译、优化、转换和综合,最终获得门级电路甚至更底层的电路结构描述的网表文件。由此可见,综合器工作前,必须预先设置各类约束条件(如时间约束、面积约束等,以及设计库和工艺库),然后综合器能够自动选择最优的方式将软件设计翻译为底层电路结构,也就是说,对于同一个软件设计,综合器可以综合出不同的电路结构,有的面积小,但速度慢;有的速度快,但面积大。

3.综合、优化

整个综合过程就是依据给定的硬件结

4.适配

适配器也称为结构综合器,它的功能是将由综合器产生的电路结构网表文件与指定的目标器件进行逻辑映射,即将工程的逻辑和时序要求与目标器件的可用资源进行匹配。适配用来将每个逻辑功能分配给最合适的逻辑单元进行布局布线,并选择相应的互联路径和引脚分配,使之产生最终的下载文件,如JAM、SOF、POF等格式的文件。适配所选定的目标器件必须属于原综合器指定的目标器件系列。

4.适配

适配器也称为结构综合器,它的功能是将由

5.时序仿真与功能仿真

在编程下载前必须利用EDA工具对适配生成的结果进行模拟验证,即仿真。通过仿真,可以检查设计文件的结构是否和设计要求一致,从而可以在设计的早期进行错误排除,缩短设计周期和成本。仿真是EDA设计过程中的重要步骤。时序仿真与功能仿真通常由PLD公司的EDA开发工具完成(当然也可以选用第三方的专业仿真工具)。

5.时序仿真与功能仿真

在编程下载前必须利用E

1)时序仿真

时序仿真是接近真实器件运行特性的仿真,仿真文件中已包含了器件硬件特性参数以及硬件延迟信息,因而仿真精度高。时序仿真文件来自综合与适配后产生的文件。

2)功能仿真

功能仿真直接对HDL、原理图描述或其他描述形式的逻辑功能进行测试模拟,以验证其实现的功能是否满足原设计的要求。仿真过程不涉及任何具体器件的硬件特性,甚至不经历综合与适配阶段,在设计项目编辑编译后即可进入门级仿真器进行模拟测试。

1)时序仿真

时序仿真是接近真实器件运行特性的仿

6.编程下载

编程下载是指把适配后生成的下载或配置文件,通过编程器或编程电缆下载到FPGA或CPLD器件,以便进行硬件调试和验证(HardwareDebugging)。通常,对CPLD的下载称为编程(Program),对FPGA中的SRAM进行直接下载的方式称为配置(Configure),但对于反熔丝结构和Flash结构的FPGA的下载,以及对FPGA的专用配置ROM的下载仍称为编程。当然也有根据下载方式分类的。

6.编程下载

编程下载是指把适配后生成的下载或配

7.硬件测试

硬件测试是对载入了设计文件的FPGA或CPLD的硬件系统进行测试,以便最终验证设计在目标系统上的实际工作情况,有助于在完成最终电路系统前排除错误,改进设计。

7.硬件测试

硬件测试是对载入了设计文件的FP

10.3VHDL程序基本结构

10.3.1VHDL设计的基本单元及其构成一个完整的VHDL设计文件,或者说设计实体,通常要求能为VHDL综合器所支持,并能作为一个独立的设计单元(模块),即以元件形式而存在的VHDL描述。这里所谓的元件,既可以被高层次的系统所调用,成为该系统的一部分,也可以作为一个电路功能块而独立存在和独立运行。

10.3VHDL程序基本结构

10.3.1VHDL设计

VHDL程序结构如图10.3.1所示,主要由库、程序包、实体、结构体和配置五部分组成,其中实体和结构体是基本组成部分,它们可以构成最基本的VHDL程序。图10.3.1VHDL程序结构

VHDL程序结构如图10.3.1所示,主要由库、程序包

例10.3.1是一个二选一多路选择器的VHDL描述,可以看出,实体说明是二选一器件外部引脚的定义,结构体则描述了二选一器件的逻辑电路和逻辑关系。

例10.3.1用VHDL语言描述二选一多路选择器。

例10.3.1是一个二选一多路选择器的VHDL描述数字电子技术基础[163页]课件

10.3.2实体

任何一个基本设计单元的实体说明都具有如下结构:

10.3.2实体

任何一个基本设计单元的实体说明都

实体说明必须以语句“ENTITY实体名IS”开始,以语句“ENDENTITY实体名;”结束。其中,实体名由设计者自己定义,用来表示设计电路实体的名称,也可作为其他设计调用该实体时的名称。在MAXPLUSⅡ和QUARTUSⅡ开发工具中,实体名与保存该实体的VHDL源文件名必须是一致的。

实体说明必须以语句“ENTITY实体名IS”开始,

大写字母表示实体说明的框架,即每个实体说明都应这样书写,是不可缺少和省略的部分;其余是设计者添写的部分,随设计单元的不同而不同。实际上,对VHDL而言,是不区分大、小写的,这里仅仅是为了阅读方便才加以区分。

1.类属参数说明

类属参数说明语句(可选项)必须放在端口声明之前,用于指定如位矢量、器件延迟时间等参数。

大写字母表示实体说明的框架,即每个实体说明都应这样书写数字电子技术基础[163页]课件

2.端口声明

端口声明是对设计实体(单元)与外部电路接口的描述,也可以说是对外部引脚信号的名称、输入/输出端口模式和数据类型的描述。其一般书写格式如下:

(1)端口名。端口名是赋予每个端口(引脚)的名称,通常由字母、数字和下划线组成,遵循VHDL中标识符的命名规则,具体规则参见10.4.2节。

2.端口声明

端口声明是对设计实体(单元)与外部

(2)端口模式。端口模式用来定义端口上数据的流动方向。IEEE1076标准包中定义了4种常用的端口模式:输入(IN)、输出(OUT)、双向(INOUT)和输出缓冲(BUFFER)。端口模式示意图如图10.3.2所示。图10.3.2端口模式示意图

(2)端口模式。端口模式用来定义端口上数据的流动方向。

·IN输入模式。采用输入模式进行方向说明的端口,其信号自端口输入到结构体,而结构体内部的信号不能从该端口输出,即数据只能通过此端口被读入。

·OUT输出模式。采用输出模式进行方向说明的端口,其信号将从结构体内经端口输出,而不能通过该端口向结构体输入信号。

·INOUT双向模式。双向模式用以说明该端口是双向的,既可以输入,也可以输出,但是同一时刻只能进行某一个数据流的操作,因此双向模式声明的端口信号一般需要另一个信号进行方向的控制。

·IN输入模式。采用输入模式进行方向说明的端口,其信

·BUFFER缓冲模式。缓冲模式用以说明该端口可以输出信号,且在结构体内部也可以利用该输出信号,与INOUT双向模式类似,但是,其输入的数据只允许回读内部输出的信号。另外,OUT允许对应多个信号,而BUFFER只允许对应一个信号。

·BUFFER缓冲模式。缓冲模式用以说明该端口可以输

(3)数据类型。端口信号必须确定其数据类型,即其上流动的数据的类型。VHDL是一种强类型语言,它对语句中所有操作数的数据类型都有严格的规定,即对传输或存储的数据类型作出明确的界定。

(3)数据类型。端口信号必须确定其数据类型,即其上流动

例10.3.2VHDL程序中数据类型的不同说明符号。

例10.3.2VHDL程序中数据类型的不同说明符号。

10.3.3结构体

结构体是一个基本设计单元的功能描述体,它具体指明了该基本设计单元的行为、元件及内部的连接关系,也就是说,它定义了设计单元的内部逻辑功能和电路结构。结构体对其基本设计单元的输入、输出关系可以用3种方式进行描述,即行为描述(基本设计单元的数学模型描述)、寄存器传输描述(数据流描述)和结构描述(逻辑单元连接描述)。不同的描述方式只体现在描述语句上,而结构体的结构是完全一样的。

10.3.3结构体

结构体是一个基本设计单元的功能

一个结构体的具体结构描述如下:

一个结构体的具体结构描述如下:

1.结构体名

结构体名是对本结构体的命名,它是该结构体的唯一名称。OF后面紧跟的实体名,表明该结构体所对应的是哪一个实体。用IS来结束结构体的命名。

2.说明语句

说明语句位于关键词ARCHITECTURE和BEGIN之间,主要是对结构体功能描述语句中将要用到的数据类型、常量、信号、子程序、函数、元件等进行声明。

1.结构体名

结构体名是对本结构体的命名,它是该

例10.3.3结构体示例。

例10.3.3结构体示例。

3.功能描述语句

功能描述语句处于关键词BEGIN和ENDARCHITECTURE之间,这些语句具体地描述了结构体的逻辑功能和电路结构。

结构体中的语句都是可以并行执行的,也就是说,语句的执行不以书写的顺序为执行顺序。

结构体描述的结束语句“ENDARCHITECTt1RE结构体名;”是符合VHDL93标准的语法要求的。若根据VHDL87标准的语法要求,可写为“END结构体名;”或直接使用“END;”。

3.功能描述语句

功能描述语句处于关键词BEG

实体描述的结束语句“ENDENTITY实体名;”也是符合VHDL93标准语法规则的,也可根据VHDL87标准语法要求写成“END实体名;”或“END;”的形式。

按照具体电路逻辑实现的方式进行分类,VHDL的描述方式可分为结构化建模和行为建模两类,下面分别进行介绍。

实体描述的结束语句“ENDENTITY实体名;”也是

1)结构化建模

结构化建模是通过明确的硬件实现来指定电路的功能,它描述设计单元的硬件结构,表示元件之间的互连。如例10.3.4所示的二选一多路选择器,其逻辑电路由与门、或门和非门构成,而这些基本的逻辑门电路都已经是现成的设计单元,那么将它们连接就可以构成新的电路系统,类似于电路原理图中设计器件的连接。

1)结构化建模

结构化建模是通过明确的硬件实现来

例10.3.4用VHDL语言描述二选一多路选择器。

例10.3.4用VHDL语言描述二选一多路选择器。

另一种常见的结构化建模的描述方式是,首先根据设计的逻辑功能进行模块的划分,进行各个模块的设计和验证;然后在顶层文件中对多个模块进行调用,描述底层各模块之间的连接关系,即层次型的VHDL描述,该描述主要采用元件声明和元件例化语句完成。

另一种常见的结构化建模的描述方式是,首先根据设计的逻辑

2)行为建模

行为建模只规定了电路系统的功能或行为,不关心电路的实际结构,没有明确指明涉及的硬件及连线等,即只关心“做什么”,而不关心“怎么做”。行为建模是VHDL语言描述的一大特色,是VHDL编程的核心,它使得设计者可以在不了解硬件电路结构的情况下实现电路系统。行为建模通常由一个或多个进程构成,每一个进程内包含了一系列的顺序语句。行为建模的描述形式充分体现了VHDL语言相对于其他硬件描述语言的优势。例10.3.1所示的二选一多路选择器就是行为建模的描述方式。

2)行为建模

行为建模只规定了电路系统的功能或行

10.3.4库和程序包

根据VHDL语法规则,在VHDL语言中使用的文字、数据对象、数据类型都需要预先定义,因此可以将预先定义好的数据类型、元件调用声明以及一些常用子程序汇集在一起,形成程序包,供VHDL设计实体共享和调用,若干个程序包则构成库。

10.3.4库和程序包

根据VHDL语法规则,在

1.库和程序包的种类

1)IEEE库IEEE库是目前使用频率最高和应用最为广泛的库,主要包含IEEE标准的程序包以及其他一些支持工业标准的程序包。

(1)std_logic_1164程序包。

(2)std_logic_arith程序包。

(3)std_logic_signed程序包。

(4)std_logic_unsigned程序包。

1.库和程序包的种类

1)IEEE库IEEE库是

2)STD库

STD库是VHDL的标准设计库,它包含两个预定义的程序包,即standard程序包和textio程序包。

(1)standard程序包。

(2)textio程序包。

2)STD库

STD库是VHDL的标准设计库,

3)WORK库

WORK库是用户进行VHDL设计的现行工作库,用于存放用户设计和定义的一些设计单元和程序包。VHDL标准规定WORK库总是可见,因此在实际使用时,也不需要使用LIBRARY和USE语句显式地打开。VHDL标准要求为设计项目建立一个文件夹,与此项目相关的工程、文件等都保存于此文件夹内,VHDL综合器会将此文件夹默认为WORK库,指向该文件夹的路径。需要注意的是,WORK库并不是这个文件夹的名字,它是一个逻辑名。

3)WORK库

WORK库是用户进行VHD

4)面向ASIC的库

在VHDL中,为了能够进行门级仿真,各个公司提供了面向ASIC设计的逻辑门库,库中包括大量与各种逻辑门相对应的各种设计实体单元的VHDL程序。长期以来,由于缺乏高效、可靠的用VHDL描述的ASIC库,一定程度上影响了VHDL的广泛使用。而建立ASIC库最大的困难就是VHDL中没有一个统一有效的方法来处理时域参数,因此工业界和IEEE为解决这一问题而开展了一系列研究工作,其中VITAL库就是这一研究的成果。

4)面向ASIC的库

在VHDL中,为了能够

5)用户自定义库

在VHDL的实际应用中,用户为自身设计需要所开发的公共程序包和实体等也可以汇集在一起定义为一个库,这种库就是用户自定义库或称用户库,可供其他开发者调用,但在使用时需要在程序的开始部分进行说明。

5)用户自定义库

在VHDL的实际应用中,用户

2.库和程序包的使用

使用库的方法是在设计项目的开头声明选用的库名,用USE语句声明选中的程序包。在前面提到的几类库中,除了STD库和WORK库以外,其他库在使用前都需要用LIBRARY和USE语句进行声明。声明格式如下:

2.库和程序包的使用

使用库的方法是在设计项目的

其中:第一条语句表示打开什么库;第二条语句表示打开指定库中特定程序包内的所有内容。此处,关键字all代表指定程序包中的所有资源。当然,也可以只打开程序包内所选定的某个项目或函数,其声明格式如下:

其中:第一条语句表示打开什么库;第二条语句表示打开指定

例如,语句

库声明语句的作用范围从一个实体说明开始到它所属的结构体、配置为止,或者从一个程序包的说明开始到该程序包的定义结束为止。当一个VHDL程序中出现两个或两个以上实体或程序包时,库使用声明的语句必须在每个实体说明语句或包说明语句前重复书写。

例如,语句

库声明语句的作用范围从一个实体

3.程序包的定义

程序包类似于C语言中的include语句,用来单纯地罗列VHDL语言中所用到的各种常数定义,数据类型定义,元件、函数和过程定义等。程序包是一个可编译的设计单元,也是库结构中的一个层次。程序包可分为预定义程序包和用户自定义程序包两类。上述的std_logic_1164、std_logic_arith等程序包属于常用的预定义程序包。

3.程序包的定义

程序包类似于C语言中的inc数字电子技术基础[163页]课件

程序包的结构由两大部分组成:程序包首和程序包体。一个完整的程序包中,程序包首的程序包名和程序包体的程序包名应是同一个名称。程序包体是一个可选项,当没有定义函数和过程时,程序包可以只由程序包首构成。程序包首的说明语句部分进行数据类型的定义,常数的定义,元件、函数及过程的声明等。程序包体的说明语句部分进行具体函数、过程功能的描述。

程序包的结构由两大部分组成:程序包首和程序包体。一个完

例10.3.5给出了一个程序包定义的示例,其程序包名称是my_package,其中定义了一个新的数据类型color、一个常数y以及一个函数positive_edge。由于函数必须要有具体的内容,所以在程序包体内进行描述。如果该程序包在当前WORK库中已定义,要使用该程序包中的内容,则可利用USE语句,如例10.3.6所示。例10.3.5相关的语法知识会在后续章节中介绍,这里只是对程序包的格式和用法进行说明。

例10.3.5给出了一个程序包定义的示例,其程序包名称数字电子技术基础[163页]课件

例10.3.6用USE语句使用程序包中的内容。

例10.3.6用USE语句使用程序包中的内容。

10.3.5配置

配置(Configuration)主要用来描述各种设计实体和元件之间的连接关系,以及设计实体和结构体之间的连接关系。

例如,对于既定的电路功能,对应的电路结构并不是唯一的,它可以对应不同的电路结构,这意味着一个VHDL的设计只能有一个实体,但是可以有几个结构体,即使用几种方案实现同一种功能,其中每个结构体的地位是相同的,但结构体名不能重复。

10.3.5配置

配置(Configuration数字电子技术基础[163页]课件

例10.3.7对计数器实现多种形式的配置。

例10.3.7对计数器实现多种形式的配置。数字电子技术基础[163页]课件数字电子技术基础[163页]课件

在上例中,一个计数器实体counter带有两个不同的结构体count_255和count_64K,这时,就需要用配置语句来为设计实体选配不同的结构体。需要注意的是,为了达到选配不同结构体的目的,在计数器实体中对装入计数器和构成计数器的数据位宽度不应作具体说明,只要将输入和输出端口的数据定义为整型即可。其中,count_255是一个8位计数器,count_64K是一个16位计数器。

在上例中,一个计数器实体counter带有两个不同的结

10.4VHDL数据类型与运算操作符

VHDL语言是一种硬件描述语言,与软件语言(如:C语言)有一定的相似之处:有相似的运算操作符、表达式、子程序、函数等。需要注意的是,虽然VHDL语言与软件语言有相似之处,但它仍需要经过编译,然后综合成可实现的硬件结构,再通过布局布线后下载到PLD器件中;而不像软件语言,编译后由CPU执行即可。

10.4VHDL数据类型与运算操作符

VHDL语言是

10.4.1VHDL文字规则

VHDL文字主要包括数值型文字和标识符。数值型文字主要有数字型和字符串型。

1.数字型

数字型文字有多种表达方式,下面列举它们的类型和表达规则。

(1)整数(Integer)。

(2)实数(Real)。

(3)以数制基数表示的格式。

10.4.1VHDL文字规则

VHDL文字主要包括

2.字符串型

字符是用单引号引起来的ASCII字符,可以是数值,也可以是符号或字母,如‘R’、‘a’、‘*’、‘’等。如可用字符来定义一个新的数据类型:

TYPESTD_ULOGICIS('0','X','*','H','');

字符串是一维的字符数组,需放在双引号中。VHDL中有两种字符串:文字字符串和数位字符串。

(1)文字字符串。

(2)数位字符串。

2.字符串型

字符是用单引号引起来的ASCII

基数符的含义分别是:

B:二进制基数符号,表示二进制位0或者1,字符串中的每一位表示1位(Bit)。

O:八进制基数符号,字符串中的每一位代表一个八进制数,即代表一个3位二进制数。

X:十六进制基数符号(0~F),字符串中的每一位代表一个十六进制数,即一个4位二进制数。

基数符的含义分别是:

B:二进制基数符号,表示二数字电子技术基础[163页]课件

10.4.2标识符及其表述规则

VHDL中的标识符是最常用的操作符,可以是常数、变量、信号、端口、子程序或参数的名称。使用标识符要遵守一定的规则,这不仅是对电子系统设计工程师的一个约束,同时也为各种EDA工具提供标准的书写规范,使之在综合仿真过程中不产生歧义,易于仿真。VHDL中的标识符分为基本标识符和扩展标识符两种。

10.4.2标识符及其表述规则

VHDL中的标识符

基本标识符的规则如下:

(1)标识符由字母(A~Z,a~z)、数字(0~9)和下划线“_”组成。

(2)任何标识符必须以英文字母开头。

(3)不允许出现多个连续的下划线,只能是单一下划线,且不能以下划线结束。

(4)标识符中的英文字母不区分大小写。

(5)VHDL定义的保留字或关键词不能用作标识符。

(6)VHDL中的注释文字一律由两个连续的连接线“”开始,可以出现在任一语句后面,也可以出现在独立行。

基本标识符的规则如下:

(1)标识符由字母(A~数字电子技术基础[163页]课件

10.4.3数据对象

1.常数

常数的定义和设置通常是为了使程序更容易阅读和修改。例如,将逻辑位的宽度定义为一个常量,只要修改这个常量就可以很容易地改变宽度,从而改变硬件结构。在程序中,常数就是一个固定的值,所谓常数说明,就是对某一常数名赋予一个固定的值,赋值通常在程序开始前进行,该值的数据类型则在说明语句中指明。常数说明的一般格式如下:

10.4.3数据对象

1.常数

常数的定义和

常量使用时要注意以下几点:

(1)常量所赋的值应和定义的数据类型一致;

(2)常量一旦被赋值就不能改变。若要改变常量值,必须要改变设计,改变常量的声明。

(3)常量声明所允许的范围有实体、结构体、进程、子程序、块和程序包。

(4)常量的可视性,即常量的声明位置决定它的使用范围。

常量使用时要注意以下几点:

(1)常量所赋的值应

2.变量

变量用于暂时存储数据。变量是一个局部量,只能在进程语句和子程序内部定义和使用。变量的声明格式如下:

VARIABLE变量名:数据类型[∶=初始值];

2.变量

变量用于暂时存储数据。变量是一个局部量

虽然变量可以在声明时赋予初始值,但综合器并不支持初始值的设置,综合时将忽略。初始值仅对仿真器有效,当变量在声明语句中没有赋予初值时,可以在使用时通过变量赋值语句对其赋值。变量赋值语句的格式如下:

目标变量名∶=表达式;

虽然变量可以在声明时赋予初始值,但综合器并不支持初始值

需要注意的是,赋值语句中的表达式必须与目标变量具有相同的数据类型,这个表达式可以是一个运算表达式,也可以是一个数值。变量在使用时还需注意以下几点:

(1)变量是一个局部量,不能将信息带出对它所定义的设计单元。

(2)变量的赋值是立即发生的,不存在任何延迟。

(3)VHDL语言规则不支持变量附加延迟语句。

(4)变量常用在实现某种运算的赋值语句中,变量赋值和初始化赋值都使用符号“∶=”。

(5)变量不能用于硬件连线。

需要注意的是,赋值语句中的表达式必须与目标变量具有相同

3.信号

信号是电子电路内部硬件实体相互连接的抽象,可以实现进程之间的通信。信号声明的格式如下:

SIGNAL信号名:数据类型[∶=初始值];

3.信号

信号是电子电路内部硬件实体相互连接的抽

与变量相同,对信号赋初始值也不是必须的,并且仅在仿真中有效,一般在设计中对信号进行赋值。信号赋值语句的格式如下:

目标信号名<=表达式;

与变量相同,对信号赋初始值也不是必须的,并且仅在仿真中

信号的使用需要注意以下几个要点:

(1)信号的声明范围是程序包、实体和结构体。信号不能在进程和子程序中声明,但可以使用。

(2)与常量相似,信号也具有可视性规则。在程序包中声明的信号,对于所有调用此程序包的设计实体都可见;在实体中声明的信号,在其对应的所有结构体中都可见;在结构体中声明的信号,此结构体内部都可见。

(3)实体中定义的输入、输出端口也是信号,只是附加了数据流动的方向。

信号的使用需要注意以下几个要点:

(1)信号的声

(4)符号“∶=”用于对信号赋初始值,符号“<=”用于信号的代入赋值。信号代入时可以附加延迟,如:m<=″10110001″AFTER10ns。

(5)信号包括I/O引脚信号和IC内部缓冲信号,有硬件电路与之对应,所以即使没有设置延迟,信号之间的传递也有实际的附加延迟。

(6)信号能够实现进程间的通信,即把进程外的信息带入进程内部,把进程内部的信息带出进程,所以,信号能够列入进程的敏感信号列表,而变量不能。

(7)信号的赋值可以出现在进程中,也可以直接出现在结构体的并行语句中,但它们的运行含义不同。

(4)符号“∶=”用于对信号赋初始值,符号“<=”用于

4.信号与变量的区别

在VHDL语言中,变量和信号是常用的数据对象,在形式上非常相似,但本质上却有很大的差别。

变量赋值语句用来给变量赋值或改变变量值,使用赋值符号“∶=”,且只能在VHDL的顺序语句部分(进程和子程序)声明和使用,当给变量赋值时,赋值操作立即执行,该变量一直保留所赋值,直到下次赋值操作发生为止。变量一般用作局部数据的临时存储单元。

4.信号与变量的区别

在VHDL语言中,变量和数字电子技术基础[163页]课件

比较例10.4.1和例10.4.2,它们唯一的区别是对进程中的a和b定义了不同的数据对象,前者定义为信号而后者定义为变量。然而,它们的综合结果却有很大的不同,前者的电路是图10.4.1,后者的电路是图10.4.2。在此,例10.4.1和例10.4.2对信号与变量的不同特性作了很好的注解,这有助于深入理解有关信号与变量的行为特性。

比较例10.4.1和例10.4.2,它们唯一的区别是对图10.4.2例10.4.2图图10.4.2例10.4.2图

对于进程中的赋值行为应该注意以下三点:

(1)信号的赋值需要有一个δ延时,例如当执行到例10.4.1中的表达式a<=d时,d向a的赋值是在一个δ延时后发生的,此时a并未得到更新,即a并未获得d的值,只是刚刚启动了一个延时为δ的模拟定时器,只有在延时δ后,a才能被更新并获得d的赋值。

(2)一个进程中的赋值特点是,所有赋值语句,包括信号赋值和变量赋值,都必须在一个δ延时内完成(变量在δ延时前即已完成赋值),即一个进程的运行时间固定为一个δ延时。

对于进程中的赋值行为应该注意以下三点:

(1)信

(3)当进程中存在同一信号有多个赋值源(即对同一信号发生多次赋值)时,实际完成赋值(即赋值对象的值发生更新的信号)是最接近ENDPROCESS语句的信号。

(3)当进程中存在同一信号有多个赋值源(即对同一信号发

10.4.4数据类型

VHDL数据类型的定义相当严格,不同类型之间的数据不能直接代入,而且即使数据类型相同,位长不同也不能直接代入。因此,为了熟练地使用VHDL语言编写程序,必须很好地理解各种数据类型的定义。

1.标准数据类型

标准数据类型共有10种,如表10.4.1所示。

10.4.4数据类型

VHDL数据类型的定义相当严数字电子技术基础[163页]课件

(1)位(BIT)数据类型。BIT数据类型是数字逻辑中最基本的逻辑形式,在STD库中有明确的定义,其定义如下:

TYPEBITis('0','1');

(2)布尔(BOOLEAN)。BOOLEAN数据类型比BIT数据类型抽象层次更高,其定义如下:

typeBOOLEANis(FALSE,TRUE);

(1)位(BIT)数据类型。BIT数据类型是数字逻辑

(3)整数(INTEGER)。整数与数学中整数的定义相同,包括正整数、负整数和零。在VHDL语言中,整数使用32位有符号的二进制数表示,即整数的取值范围是-2147483647~+2147483647,即-(231-1)~+(231-1)。尽管整数值在电子系统中可能用一系列二进制位值来表示,但是整数不能看作位矢量,也不能按位来进行访问,对整数不能用逻辑操作符。当需要进行位操作时,可以用转换函数将整数转换成位矢量。

(3)整数(INTEGER)。整数与数学中整数的定义相

(4)实数(REAL)。VHDL语言中,实数也叫浮点型Floating,REAL数据是通常的数值运算中浮点型的抽象,它的数值范围为-1038~+1038。在VHDL中没有定义REAL数据的精度,但这个精度至少可以达到6个比特位。使用REAL类型数据时要注意,实数数据类型仅能在仿真器中使用,很多公司的综合工具都不支持REAL类型的数据。

(4)实数(REAL)。VHDL语言中,实数也叫浮点型

(5)物理型。物理型数据用于表示一些物理量,如重量、长度、时间或电压等,用户可以根据工程需要定义一些物理数据类型。完整的物理型数据包含数值和单位两部分,定义一个物理型数据类型时,必须先给出一个基准单位,其他的单位也必须是基准单位的倍数。

(5)物理型。物理型数据用于表示一些物理量,如重量、长

(6)字符型(CHARACTER)。字符型数据量通常用单引号括起来,例如‘Z’等。VHDL对大小写不敏感,但是字符中的大、小写被认为是不一样的,如‘B’和‘b’。字符量中的字符可以是a~z的任意字母,0~9中的任一个数及空格或者特殊字符,如$、@、%等。程序包STANDARD中给出了预定义的128个ASCII码字符,不能打印的用标识符给出。

(7)位矢量(BIT_VECTOR)数据类型。

(6)字符型(CHARACTER)。字符型数据量通常用数字电子技术基础[163页]课件

(8)字符串(STRING)数据类型。字符串数据类型是字符类型的一个非限定数组。字符串数据类型必须用双引号引起来,如“blue”、“abcd”。

(9)自然数(NATURAL)和正整数(POSITIVE)。自然数数据类型是整数类型的子类型,用来表示自然数(即非负的整数)。正整数数据类型也是整数类型的子类型,包含整数中非零和非负的数值。

(8)字符串(STRING)数据类型。字符串数据类型是

(10)错误等级类型。错误等级类型数据用来表征系统的状态,共有4种:NOTE(注意)、WARNING(警告)、ERROR(出错)和FAILURE(失败)。在系统仿真过程中,可以用这4种状态来提示系统当前的工作情况,这样可以使设计人员随时掌握当前系统工作的情况,并根据系统的不同状态采取相应的对策。

(10)错误等级类型。错误等级类型数据用来表征系统

2.IEEE预定义数据类型

IEEE库是VHDL设计中最为常用的库,包含IEEE标准的程序包和其他一些支持工业标准的程序包,如std_logic_1164、numeric_std、numeric_bit、std_logic_arith、std_logic_unsigned、std_logic_signed等。这些程序包内还定义了一些常用的数据类型,但由于这些程序包并非符合VHDL标准,所以在使用相应的数据类型前,需要在设计的最前面以显式的形式表达出来。

2.IEEE预定义数据类型

IEEE库是V

(1)STD_LOGIC数据类型。

(2)STD_LOGIC_VECTOR数据类型。

(3)STD_ULOGIC和STD_ULOGIC_VECTOR数据类型。

(4)UNSIGNED数据类型。

(5)SIGNED数据类型。

(6)SMALL_INT数据类型。

(1)STD_LOGIC数据类型。

(2)STD_数字电子技术基础[163页]课件

3.用户自定义数据类型

除了上述预定义数据类型外,用户还可以定义自己所需的数据类型。一般采用类型定义语句TYPE和子类型定义语句SUBTYPE来实现。

(1)TYPE语句。TYPE语句能够定义一种全新的数据类型,其语法格式如下:

TYPE数据类型名IS数据类型定义[OF基本数据类型];

3.用户自定义数据类型

除了上述预定义数据类型外

其中,数据类型名由用户自行定义,可有多个,采用逗号分开;数据类型定义部分用来描述所定义数据类型的表达方式和表达内容;关键词OF后的基本数据类型是指数据类型定义中所定义元素的基本数据类型,一般是已有的预定义数据类型,如BIT、STD_LOGIC等。下面将对枚举、整型、数组和记录数据类型进行具体介绍。

其中,数据类型名由用户自行定义,可有多个,采用逗号分开

①枚举类型。

顾名思义,枚举类型即为通过枚举该类型的所有可能值来定义。枚举类型的示例如下:

①枚举类型。

顾名思义,枚举类型即为通过枚举该类

②整数类型。整数类型在VHDL中已存在,这里所说的是用户自定义的整数类型,可以认为是整数类型的一个子类。利用关键词RANGE限定整数的取值范围,提高芯片资源的利用率。整数类型的示例如下:

②整数类型。整数类型在VHDL中已存在,这里所说的

③数组类型。数组是将相同类型的数据集合在一起所形成的一个新数据类型。它可以是一维的,也可以是二维或多维的,但VHDL综合器通常不支持更高维数的数组。其实前面讲述VHDL预定义数据类型时已经接触过一维数组了,如BIT_VECTOR、STD_LOGIC_VECTOR。图10.4.3进一步解释数组的构成,(a)显示单个元素,(b)显示一维数组,(c)显示一维×一维数组,(d)显示二维数组。

③数组类型。数组是将相同类型的数据集合在一起所形成的图10.4.3数组构成示意图图10.4.3数组构成示意图

VHDL既允许限定数组,又允许非限定数组,二者的区别在于:限定数组下标的取值范围在数组定义时就被确定,而非限定数组下标的取值范围留待具体数据对象使用时再确定。限定数组定义语法的格式如下:

TYPE数组名ISARRAY(数组范围)OF数据类型;

其中,数组名是新定义的限定数组类型的名称;数组范围明确指出数组元素的数量和排列形式,以整数来表示数组下标;数据类型即为数组内各元素的数据类型。

VHDL既允许限定数组,又允许非限定数组,二者的区别在

非限定数组定义语法的格式如下:

TYPE数组名ISARRAY(数组下标名RANGE<>)OF数据类型;

其中,数组名是新定义的非限定数组类型的名称;数组下标名是一个整数类型或子类型的名称;符号“<>”表示没有限定数组范围,在这种情况下,范围由信号说明语句等确定;数据类型为数组中每个元素的数据类型。

非限定数组定义语法的格式如下:

TYPE数组名I数字电子技术基础[163页]课件

④记录类型。记录类型和数组类型非常相似,不同的是记录类型所包含的元素的数据类型不相同。记录类型定义语法的格式如下:

④记录类型。记录类型和数组类型非常相似,不同的是记录数字电子技术基础[163页]课件

(2)SUBTYPE语句。SUBTYPE语句定义子类型,即已有数据类型的子集,它满足原数据类型(称为基本数据类型)的所有约束条件。子类型定义的语法格式如下:

SUBTYPE子类型名IS基本数据类型[范围]

子类型的定义只是在基本数据类型的基础上作一些约束,它并没有定义新的数据类型。上述的POSITIVE和NATURAL就是INTEGER数据类型的子类型,只要值在合适的子类型范围内,这些子类型都可以完成相加、乘、比较、赋值等操作。例10.4.9给出了POSITIVE和NATURAL之间有效和无效的赋值示例。例10.4.10是子类型定义示例。

(2)SUBTYPE语句。SUBTYPE语句定义子类型数字电子技术基础[163页]课件

4.数据类型的转换

在VHDL中,数据类型的定义相当严格,不同类型的数据是不能进行运算和直接代入的。为了实现正确的代入操作,必须将要代入的数据进行类型变换,即类型变换。设计者可以通过调用预先在程序包中定义的函数来进行数据类型的转换,也可以自定义转换函数。

转换数据类型的方法有类型标记法和函数转换法。

(1)类型标记法。类型标记就是类型的名称,仅适用于关系密切的标量类型之间的类型转换,其一般格式如下:

数据类型名(表达式)

4.数据类型的转换

在VHDL中,数据类型的定

有符号数SIGNED和无符号数UNSIGNED与位矢量BIT_VECTOR关系密切,可以用类型标记法进行转换;SIGNED和UNSIGNED与STD_LOGIC_VECTOR相近,也可以用类型标记法进行类型转换。

有符号数SIGNED和无符号数UNSIGNED与位矢

(2)函数转换法。在VHDL语言中,“STD_LOGIC_1164”“STD_LOGIC_ARITH”“STD_LOGIC_UNSIGNED”等包集合中都提供了不同数据类型的变换函数,用于不同数据类型间的转换。

(2)函数转换法。在VHDL语言中,“STD_LO数字电子技术基础[163页]课件数字电子技术基础[163页]课件

10.4.5VHDL操作符

VHDL中的各种表达式是由操作数和操作符组成的,其中操作数是各种运算的对象,而操作符是规定运算的方式。VHDL提供了6种类型的预定义操作符,分别是分配操作符(AssignmentOperators)、逻辑操作符(LogicOperators)、算术操作符(ArithmeticOperators)、关系操作符(RelationalOperators)、移位操作符(ShiftOperators)和串联操作符(ConcatenationOperators)。

10.4.5VHDL操作符

VHDL中的各种表达式

1.分配操作符

分配操作符用于对信号、变量和常量分配数值,又称为赋值操作符。分配操作符包含3个:<=,用于对信号赋值;∶=,用于对变量赋值;=>,用于对单个数组元素赋值或OTHERS赋值。

1.分配操作符

分配操作符用于对信号、变量和常量数字电子技术基础[163页]课件

2.逻辑操作符

逻辑操作符用于完成逻辑运算,包含7个:NOT,取反;AND,与;OR,或;NAND,与;NOR,或非;XOR,异或;XNOR,同或。

2.逻辑操作符

逻辑操作符用于完成逻辑运算,包含

3.算术操作符

算术操作符用于完成算术运算,在VHDL中有10种算术操作符:+,加;-,减;*,乘;/,除;**,乘方;MOD,求模;REM,取余;+,正(一元运算);-,负(一元运算);ABS,取绝对值。其中,符号操作符“+”和“-”的操作数只有一个,操作数类型是整型。操作符“+”对操作数不作任何改变;操作符“-”对原操作数取负,需要加括号,如x∶=a*(-b)。其余算术操作符可分为三类,分别是加减操作符、乘除操作符和混合操作符。

3.算术操作符

算术操作符用于完成算术运算,在

1)加减操作符

加减操作符的运算规则与常规的加减法是一致的。加减操作符示例如下:

1)加减操作符

加减操作符的运算规则与常规的加数字电子技术基础[163页]课件

2)乘除操作符

VHDL的乘除操作符包含4个:“*”、“/”、“MOD”和“REM”,其中“MOD”和“REM”的本质与除法操作是一致的。需要注意的是,从优化的角度出发,最好不要轻易使用乘除操作符,因为当位数较多时,将会占用非常多的硬件资源,如16位的“*”运算将耗费几百个逻辑单元才能实现。乘除运算可以通过其他变通的方法来实现,如移位相加、LPM模块、DSP模块等。

2)乘除操作符

VHDL的乘除操作符包含4个:“

“MOD”和“REM”的操作数类型只能是整数,且运算结果也是整数。如果操作数都是正整数,则“MOD”和“REM”运算结果相同,都可以看作普通取余运算;但如果操作数出现负整数的情况,二者运算结果不同。

(1)“MOD”运算结果的正负与后面操作数的正负相同,如5MOD3=2,5MOD(-3)=-1。

(2)“REM”运算结果的正负与前面操作数的正负相同,如5REM3=2,(-5)REM3=-2。

“MOD”和“REM”的操作数类型只能是整数,且运算结

3)混合操作符

混合操作符包含“**”和ABS操作符,示例如下:

3)混合操作符

混合操作符包含“**”和ABS

4.关系操作符

关系操作符的作用是将相同数据类型的数据对象进行数值比较或关系排序判断,并将结果以BOOLEAN类型的数据表示出来,即结果只有TRUE和FALSE两种取值。

VHDL提供了6个关系运算操作符:=,等于;/=,不等于;<,小于;>,大于;<=,小于等于;>=,大于等于。

4.关系操作符

关系操作符的作用是将相同数据类型

关系运算符的左右两边是运算操作数,不同的关系运算符对两边操作数的数据类型有不同的要求。其中,等号“=”和不等号“/=”适用所有类型的数据,其他关系运算符则可适用于整数(INTEGER)、实数(REAL)、位(STD_LOGIC)等枚举类型以及位矢量(STD_LOGIC_VECTOR)等数组类型的关系运算。在进行关系运算时,左右两边操作数的数据类型必须相同,但是位长度不一定相同,当然也有例外的情况。利用关系运算符对位矢量数据进行比较时,比较过程从最左边的位开始,自左至右按位进行比较。在位长不同的情况下,只能将自左至右的比较结果作为关系运算的结果。例如,对3位和4位的位矢量进行比较如下:

关系运算符的左右两边是运算操作数,不同的关系运算符对两数字电子技术基础[163页]课件

为了能使位矢量进行关系运算,在包集合“STD_LOGIC_UNSIGNED”中对“STD_LOGIC_VECTOR”关系运算重新作了定义,使其可以正确地进行关系运算。注意:使用时必须首先说明调用该包集合。当然,此时位矢量还可以和整数进行关系运算。

为了能使位矢量进行关系运算,在包集合“STD_LOG

5.移位操作符

移位操作符是VHDL93标准中新增的,共包含6个:

sll逻辑左移,右端空出位置填“0”;

srl逻辑右移,左端空出位置填“0”;

sla算术左移,复制最右端位填充到右端空出位置;

sra算术右移,复制最左端位填充到左端空出位置;

rol循环左移,将左端移出的位填充到右端空出的位置;

ror循环右移,将右端移出的位填充到左端空出的位置。

5.移位操作符

移位操作符是VHDL93标准中

移位操作符支持的操作数数据类型为BIT_VECTOR或BOOLEAN类型组成的一维数组,其语法格式如下:

<左操作数><移位操作符><右操作数>;

其中,左操作数是待移位的数组;右操作数是移位位数,数据类型必须是整型(可加正负号)。

SIGNALa:BIT_VECTOR(0TO7)∶=″01010101″;

a<=(aROR1);a循环右移1位。

需要注意的是,移位运算符是在BIT_VECTOR中定义的,所以用移位运算符对STD_LOGIC_VECTOR进行移位时,需要进行数据类型转换。

移位操作符支持的操作数数据类型为BIT_VECTOR

6.串联操作符

“&”串联操作符通过连接操作数来建立新的数组,每个操作数可以是一个元素或一个数组,示例如下:

6.串联操作符

“&”串联操作符通过连接操作数来

7.操作符优先级

VHDL各操作符的优先级见表10.4.2

7.操作符优先级

VHDL各操作符的优先级见表1

10.5属性

属性是指从指定的对象中获取关心的数据或信息,利用属性可以使VHDL源代码更加简明扼要,如前面章节中已经出现过的clk'EVENT就是利用属性EVENT来检查时钟的边沿。属性可分为预定义属性和用户自定义属性两类,其中预定义属性又包含数值类属性、信号类属性和函数式类型。属性使用的语法格式如下:

10.5属性

属性是指从指定的对象中获取关心的数据

10.5.1预定义属性

1.数值类属性

数值类属性用于获取TYPE类型、数组或块的有关值,如数组的长度、范围等,包含以下几种:

LEFT——得到数据类或子类区间的左边界值;

RIGHT——得到数据类或子类区间返回数组索引的右边界值;

HIGH——得到数据类或子类

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论