第3章 组合电路的VHDL设计_第1页
第3章 组合电路的VHDL设计_第2页
第3章 组合电路的VHDL设计_第3页
第3章 组合电路的VHDL设计_第4页
第3章 组合电路的VHDL设计_第5页
已阅读5页,还剩101页未读 继续免费阅读

下载本文档

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

文档简介

第3章组合电路的VHDL设计组合电路的VHDL设计3.1多路选择器及其VHDL描述3.2半加器及其VHDL描述3.34选1多路选择器及其VHDL描述3.4全加器及其VHDL表述3.5乘法器及其VHDL描述

本章首先给出几种大家熟知的简单而典型的组合电路实例,然后按以下几个步骤,由浅入深地引领大家进入“VHDL语言”与“电路情景”之间的对话——

(1)电路实例作为情景(Episode)探讨其性能特点和设计方法;(2)针对电路情景的具体对象,给出对应的VHDL表述;(3)对VHDL表述中出现的语句含义作详细解释,力图从整体和实用角度把握VHDL与电路情景的对应关系,以及程序的基本结构,表述特点和设计方法,快速进入VHDL世界;(4)随后将学到的知识在QuartusII和FPGA平台上加以验证和自主发挥,巩固学习效果、提高学习兴趣、强化理论与工程实际的结合。组合电路的VHDL设计3.1多路选择器及其VHDL描述

2选1多路选择器具备组合逻辑电路的简单性和典型性的特征。3.1多路选择器及其VHDL描述

例3-1给出的是mux21a所对应的VHDL完整描述之一。此描述展示了可综合的VHDL程序的模块结构。对于此程序,可使用VHDL综合器直接综合出实现此模块功能的逻辑电路,其电路功能见图3-3所示的时序波形。可以认为,图3-1的模块与图3-3的波形功能表述具有唯一对应关系,而其电路结构表述却没有唯一性。即对于既定的电路功能描述,对应的电路结构并不唯一,它可以对应不同的电路构建方式,这取决于:VHDL综合器的基本元件库的来源、优化方向和约束的选择,以及目标器件(如FPGA)的结构特点等。其实,基于EDA的数字系统设计更注重最终完成的电路功能和性能(包括系统速度,资源利用率等)而非电路构建形式。3.1多路选择器及其VHDL描述

3.1多路选择器及其VHDL描述

VHDL描述的两大组成部分——

(1)实体:以关键词(或关键字)ENTITY引导,ENDENTITYmux21a结尾的语句部分。例3-1中的mux21a称为实体名,。VHDL的实体描述电路器件的外部情况及各信号端口的基本性质,如信号流动方向、流动信号的数据类型等。图3-1可以认为是此实体的图形表述。

(2)结构体:以关键词ARCHITECTURE引导,ENDARCHITECTUREbhv结尾的语句部分。例3-1中的bhv称为结构体名。结构体负责描述电路器件的内部逻辑功能和电路结构。图3-2所示的是此结构体的某种可能的电路结构表达。下面对例3-1中出现的相关语句结构和语法含义作出说明。3.1多路选择器及其VHDL描述

1.条件语句

VHDL结构体中,用于描述逻辑功能和电路结构的语句分为顺序语句和并行语句两部分。

●顺序语句:按照语句的前后排列方式逐条顺序执行。

●并行语句:无论有多少行语句,都同时执行,与次序无关。

★“IF_THEN_ELSE”语句属于顺序语句

——

由关键词IF引导,首先通过条件语句判断:表达式(s=‘1’),即s为高电平,执行赋值语句y<=a,即将a端口的数据向y输出;否则(即ELSE),即s为低电平,则执行赋值语句y<=b。最后以“ENDIF;”结束。

用于条件语句的判断表达式可以是一个值,也可以是更复杂的逻辑或运算表达式。如例3-1中的(s=‘1’)或以下IF语句表述中的a或(s1=‘0’)AND(s2=‘1’)OR(c<b+1)。其表达形式不同,但本质上都输出一个用于作逻辑判断的布尔值:“真”或“伪”。3.1多路选择器及其VHDL描述

2.数据类型

PORT语句中端口信号a、b、s和y的数据类型都为BIT。

VHDL规定:任何一种数据对象的应用都必须对其传输或存储的数据的类型要作明确的界定。因此,在VHDL设计中,必须预先定义好要使用的数据类型,这对于大规模电路描述的排错十分有利。数据类型:整数类型INTEGER、布尔类型BOOLEAN和标准逻辑类型STD_LOGIC等。

BIT数据类型:信号规定的取值范围是逻辑位‘1’和‘0’。在VHDL中,逻辑位0和1的表达必须加单引号;否则,VHDL综合器将其解释为整数数据类型INTEGER,即:将1理解为1、2、3的1,而非二进制0、1的1,或逻辑位的1。3.1多路选择器及其VHDL描述

2.数据类型

BIT数据类型:可参与逻辑运算,结果仍是逻辑位的数据类型。

VHDL综合器:用1个二进制位表示BIT类型或BOOLEAN类型。例如:将例3-1中的端口信号a、b、s和y的数据类型都定义为BIT,即表示它们的取值范围,或者说数据范围都被限定在逻辑位‘1’和‘0’两个值的范围内。条件语句中判断表达式,如(s1=‘0’),输出的是判断结果,分别是“TURE”或“FALSE”,其数据类型是BOOLEAN,在数值上分别对应‘1’(真)或‘0’(伪)。即如果s1为低电平,则在综合器(s1=‘0’)=‘1’。注:这个由条件判断式计算出来的值‘1’的数据类型是BOOLEAN(代表“真”或“伪”的判断结果),不是二进制的‘1’(其类型可以是BIT)。3.1多路选择器及其VHDL描述

3.进程语句和顺序语句

进程语句:由PROCESS引导的语句。在VHDL中,所有顺序描述语句都必须放在进程语句中(也包括放在过程语句中)。例3-1可见,顺序语句“IF_THEN_ELSE_ENDIF;”是放在由PROCESS至ENDPROCESS引导的语句结构中的。

敏感信号表:PROCESS旁的(a,b,s)。通常要求将进程中所有的输入信号都放在敏感信号表中。例如例3-1中的输入信号a、b和s出现在了进程语句中,所以须将它们全部列入敏感信号表中。

PROCESS语句的执行依赖于敏感信号的变化(或称发生事件),当某一敏感信号有变,如a,从‘1’跳变到‘0’,或从‘0’跳变到‘1’时,就将启动此进程语句,于是该PROCESS至ENDPROCESS引导的语句(包括其中的顺序语句)被执行一遍;然后返回进程的起始端,进入等待状态,直到下一次敏感信号表中某一信号或某些信号发生事件后才再次进入“启动-运行”状态。

★1个结构体可包含任意个进程语句结构,所有的进程语句本身都是并行语句,而由任1进程PROCESS引导的语句属于顺序语句。

3.1多路选择器及其VHDL描述

4.端口语句和端口信号名

描述电路的端口及其端口信号必须用端口语句PORT()来引导,并在语句结尾处加分号“;”。

在例3-1的实体描述中——

IN:定义端口a、b和s为信号输入端口。

OUT:定义端口y为信号输出端口。端口模式用于定义端口上数据的流动方向和方式,有如图3-4所示的4种:3.1多路选择器及其VHDL描述

5.端口模式

(1)IN:输入端口。定义的通道为单向只读模式,即规定数据只能由此端口被读入实体中。

(2)OUT:输出端口。定义的通道为单向输出模式,即规定数据只能通过此端口从实体向外流出,或者说可以将实体中的数据向此端口赋值。

(3)INOUT:双向端口。定义的通道确定为输入输出双向端口,即从端口的内部看,可以对此端口进行赋值,或通过此端口读入外部的数据信息;而从端口的外部看,信号既可由此端口流出,也可向此端口输入信号,如RAM的数据口、单片机的I/O口等。

(4)BUFFER:缓冲端口。其功能与INOUT类似,区别在于当需要输入数据时,只允许内部回读输出的信号,即允许反馈。如计数器设计,可将计数器输出的计数信号回读,以作为下一计数值的初值。与INOUT模式相比,BUFFER回读的信号不是由外部输入的,而是由内部产生、向外输出的信号。3.1多路选择器及其VHDL描述

6.关键字

关键词(KeyWord):指VHDL中预定义的有特殊含义的英文词语。●VHDL程序设计者不能用关键字命名自用对象(如标识符等)。如例3-1中的ENTITY、ARCHITECTURE、END、IF、ELSE、OUT和IN等,还有AND、OR等逻辑操作符,这些都属于关键字。

●现在多数VHDL文本编辑器,包括QuartusII的编辑器,都是关键字敏感型的(遇到关键字会以特定颜色显示),所以在编辑程序时通常不会误用关键字。【注意】:也不要误将EDA软件工具库中已定义好的关键词或元件名当做普通标识符来用。

●VHDL的关键字对大小写不敏感,即在同一程序中,关键字大小写可以混用。3.1多路选择器及其VHDL描述

7.标识符

标识符(Identifier)是设计者在VHDL程序中自定义的,用于标识不同名称的词语。例如用作实体名、结构体名、端口名或信号名等。如例3-1中出现过的mux21a、b、one等。

●标识符也不区分大小写。例如在同一VHDL程序中,标识符A和a、y和Y分别表示同一信号。

●标识符不应用数字、数字起头的文字或中文来表述。

●符号“--”是注释符号。注释符号可用于隔离程序,添加程序说明文字。因此注释符号“--”后的文字仅仅是为了使对应的数据或语句更容易被看懂,它们本身没有功能含义,也不参加逻辑综合。3.2半加器及其VHDL描述

半加器(设此模块的器件名是h_adder)的电路原理图如图3-5所示,半加器对应的逻辑真值表如图3-6所示。此电路模块由两个基本逻辑门元件构成,即与门和异或门。

A和B:

加数和被加数的数据输入端口;

SO:是和值的数据输出端口;

CO:

是进位数据的输出端口。根据图3-5的电路结构,很容易获得半加器的逻辑表述是:

图3-7是此半加器电路的时序波形,它反映了此模块的逻辑功能。根据这些叙述可以给出对应的VHDL描述,即例3-2所示的半加器电路模块的VHDL表述。此描述展示了可综合的VHDL程序的模块结构。3.2半加器及其VHDL描述图3-8所示:VHDL程序最常用结构框图例3-2右侧的文字说明:

可看出,例3-2程序虽简单,但却包含了VHDL

完整的程序结构和必要的语句元素。

由例3-2和图3-8可见——

VHDL程序结构分三大部分:库与程序包的调用语句、由ENTITY引导的描述电路端口的实体,以及由ARCHITECTURE引导的描述电路功能的结构体。不过,后两个部分是必须存在的,例3-1就是一个例子。3.2半加器及其VHDL描述3.2半加器及其VHDL描述1.实体表达与实体名

下面在3.1节中已展示的VHDL相关知识的基础上,针对例3-2中新出现的VHDL语句结构、语法规则和程序设计规范作出说明。VHDL完整的、可综合的程序结构必须能完整地表达一个数字电路功能模块的端口形式和电路功能,即无论是一片74LS138还是一片CPU,都必须包含实体和结构体两个最基本的语言结构。

设计实体:含有完整程序结构(即图3-8所示的结构)的VHDL表述。实体描述的是:电路器件的端口构成(有哪些端口),端口类型(信号的流动方向和方式)和端口上流动的信号的属性,它的一般表述格式如下:3.2半加器及其VHDL描述

关键词:

ENTITY、IS、PORT和ENDENTITY都是描述实体的关键词,在实体描述中必须包含在内;

data_type:

是定义port_m等端口的数据类型名;

e_name:

是实体名。实体名属于标识符,具体取名由设计者自定。由于实体名实际上表达的应该是设计电路的器件名,所以通常根据相应电路的功能来确定。如4位二进制计数器,实体名可取为counter4b;8位二进制加法器,实体名可取为ADDER8B等。

★不能用与EDA软件工具库中已定义好的元件名作为实体名,如or2、latch等,也不能用数字起头的实体名,如74LS160。3.2半加器及其VHDL描述2.结构体表达结构体的一般表述格式如下:

其中,ARCHITECTURE、OF、IS、BEGIN和ENDARCHITECTURE都是描述结构体的关键词,在描述中必须包含它们。arch_name是结构体名,是标识符。

“说明语句”:包括在结构体中,用以说明和定义数据对象、数据类型、元件调用声明等。描述中并非必需。

“功能描述语句”:在结构体中给出的相应的电路功能描述语句,可以是并行语句、顺序语句或它们的混合。描述中必须存在。3.2半加器及其VHDL描述2.结构体表达

一个可综合的、完整的VHDL程序有比较固定的结构,如图3-8所示。

(1)各类库及其程序包的使用声明。包括未以显式表达的工作库WORK库的使用声明;

(2)实体描述;

(3)结构体描述。而在结构体中可以含有不同的逻辑表达语句结构。

★例3-2的实体和结构体分别是以“ENDENTITYxxx;”和“ENDARCHITECTURExxx;”语句结尾的,这符合VHDL的IEEESTD1076-1993版的语法要求。若根据VHDL’87版本,即IEEESTD1076-1987的语法要求,这两条结尾语句只需写成“END;”或“ENDxx;”。★绝大多数常用的EDA工具中的VHDL综合器都兼容两种VHDL版本的语法规则。但对于不同的EDA工具,仍需根据设计程序不同的VHDL版本表述,在综合前作相应的设置。3.2半加器及其VHDL描述3.标准逻辑位数据类型STD_LOGIC

就数字系统设计来说,类型STD_LOGIC比BIT包含的内容丰富和完整得多,而且此数据类型也包含BIT类型VHDL的BIT数据类型定义语句——VHDL的STD_LOGIC数据类型包含BIT类型,其定义语句——STD_LOGIC所定义的九种数据的含义是——

‘U’表示未初始化的;‘X’表示强未知的;‘0’表示强逻辑0;‘1’表示强逻辑1;‘Z’表示高阻态;‘W’表示弱未知的;‘L’表示弱逻辑0;‘H’表示弱逻辑1;‘-’表示忽略。3.2半加器及其VHDL描述3.标准逻辑位数据类型STD_LOGIC

完整地概括了数字系统中所有可能的数据表现形式,因而其描述与实际电路有更好更实用的适应性。在仿真和综合中,将端口信号或其他数据对象定义为STD_LOGIC数据类型是非常重要且最为常用的,它可以使设计者精确地模拟一些未知的和具有高阻态的线路情况。对于综合器,高阻态‘Z’和忽略态‘-’(有的综合器用‘X’)可用于三态的描述。

STD_LOGIC型数据只有其中的四五种值在数字器件中可实现的(即综合器可接受的)

——‘X’(或/和‘-’)、‘0’、‘1’和‘Z’。其他类型不可综合,只能用于VHDL仿真。

STD_LOGIC数据类型中的取值多数可在现实电路中找到对应现象。如由74LS04某反相器输出高电平,则此端口对应强逻辑‘1’;若此端口串接一个100k电阻,其输出则对应弱逻辑‘H’;若此端口串接一大于1M电阻的输出则基本对应高阻态逻辑‘Z’;而‘X’或‘-’与数字电路教材中卡诺图中的任意值有对应关系。

3.2半加器及其VHDL描述4.赋值符号和逻辑操作符

例3-2中的表达式CO<=AANDB和SO<=AXORB表示输入端口A、B两信号分别作逻辑与和逻辑异或运算后,再分别将结果向输出端口CO和SO传输,或解释为向信号CO和SO赋值。这里,A和B是逻辑操作对象。VHDL要求赋值符“<=”两边信号的数据类型必须一致。

信号赋值的常用表述:即当等号右侧的驱动表达式中的任一信号变量发生变化时,此表达式即被计算一遍,并将获得的数据赋给等号左侧的变量名所标示的目标变量。

驱动的含义:强调这一表达式的本质是对于目标变量的激励源,或赋值源,它为左侧的目标变量提供运算操作后的结果。3.2半加器及其VHDL描述4.赋值符号和逻辑操作符VHDL共有七种基本逻辑操作符,如表3-1所示,它们分别是AND(与)、OR(或)、NAND(与非)、NOR(或非)、XOR(异或)、XNOR(同或)和NOT(取反)。信号在这些操作符的作用下可构成组合逻辑。

操作数(操作对象)的数据类型有3种:BIT、BOOLEAN和STD_LOGIC。即:仅此三种数据类型的数值或变量相互间可以进行逻辑操作。3.2半加器及其VHDL描述5.设计库和标准程序包表3-1

匕逻辑操作符5.设计库和标准程序包

有许多数据类型的说明,以及类似的函数是预先放在VHDL综合器(或仿真器)附带的设计库和程序包中的。如BIT数据类型的定义是包含在VHDL标准程序包STANDARD中的,而程序包STANDARD包含于VHDL标准库STD中。

为了使用BIT类型,应该在例3-1的程序上面增加以下三句说明语句:

LIBRARY:是关键词,LIBRARYWORK表示打开工作库WORK库;

LIBRARYSTD:表示打开STD库;

USB和ALL:是关键词,全句表示允许使用STD库中STANDARD程序包中的所有内容(.ALL),如类型定义、函数、过程、常量等。

LIBRARYWORK:VHDL设计文件保存在某一文件夹,如d:\myfile中,并指定为工程PROJECT的文件所在的目录,VHDL工具就将此路径指定的文件夹默认为工作库(WORKLIBRARY)。于是,在VHDL程序前面还应该增加“WORKLIBRARY;”语句,VHDL工具才能调用此路径中相关的元件和程序包。3.2半加器及其VHDL描述5.设计库和标准程序包使用库和程序包的一般定义表达式如下:

STD_LOGIC数据类型定义在被称为STD_LOGIC_1164的程序包中,此包由IEEE库定义,而且此程序包所在的程序库的库名被取名为IEEE。由于IEEE库不属于VHDL标准库,所以在使用其库中内容前,必须事先给予声明。正是出于此需要,即定义端口信号的数据类型为STD_LOGIC的目的,例3-2使用了以下两句语句:

即利用LIBRARY语句和USE语句,打开IEEE库的程序包STD_LOGIC_1164。

★在VHDL程序中根据实际情况也可以定义为BIT类型或其他数据类型,但一般应用中推荐尽可能使用STD_LOGIC类型。3.2半加器及其VHDL描述6.文件取名和存盘

当编辑好VHDL程序后,需要保存文件时,必须赋给一个正确的文件名。对于多数综合器,文件名可以由设计者任意给定。文件后缀扩展名必须是“.vhd”,如mux21a.vhd。考虑到某些EDA软件的限制、VHDL程序的特点,以及调用的方便性,建议程序的文件名尽量与该程序的模块名一致。对于QuartusII,则必须满足这一规定!如例3-1和例3-2的存盘文件名必须分别是mux21a.vhd和h_adder.vhd

。与Verilog不同,VHDL文件取名大小写不敏感,即存盘的文件名与此文件程序中的模块名的大小写不必一致。

VHDL程序必须存入某文件夹中(要求非中文文件夹名),不要存在根目录内或桌面上。

3.2半加器及其VHDL描述7.规范的程序书写格式

VHDL程序书写格式要求十分宽松,可以在一行写多条语句(只要能写下),也可分行书写。但良好的,规范的VHDL源程序书写习惯是高效的电路设计者所必备的。规范的书写格式能使自己或别人更容易阅读和检査错误。

例3-2给出了近似规范的书写格式:最顶层的LIBRARY、ENTITY、ENDENTITY实体描述语句放在最左侧;比它低一层次的描述语句(如PORT)向右靠一个Tab键距离,即4个小写字母的间隔。同一语句的关键词要对齐,如ENTITY和ENDENTITY、PROCESS和ENDPROCESS、IF和ENDIF等。

★说明:为了在书中放入更多的内容而节省篇幅、降低成本,教材中的多数程序都未能严格按照规范书写。

3.3.1四选一多路选择器及CASE语句表述方式3.3四选一多路选择器及其

VHDL描述

4选1多路选择器的电路模型如图3-9所示,当s1和s0取值分别为00、01、10和11时,输出端y将分别输出来自输入口a、b、c、d的数据。图3-10是此模块的时序波形。图中的S是选通信号s1和s0的矢量或总线表达信号,它可以在仿真激励文件中由设计者设置。3.3四选一多路选择器及其

VHDL描述

3.3.1四选一多路选择器及CASE语句表述方式3.3.2CASE语句3.3四选一多路选择器及其

VHDL描述

CASE语句属于顺序语句,因此必须放在进程语句PROCESS中使用。CASE语句的一般表述如下:3.3.2CASE语句3.3四选一多路选择器及其

VHDL描述

当执行到CASE语句时,首先计算<表达式>的值,然后根据WHEN条件句中与之相同的<选择值或标识符>,执行对应的<顺序语句>,最后结束CASE语句。条件句中的“=>”不是操作符,它的含义相当于THEN(或“于是”)。CASE语句使用中应该注意以下几点:(1)WHEN条件句中的选择值或标识符所代表的值必须在CASE的<表达式>的取值范围内,且数据类型也必须匹配。(2)除非所有条件句中的选择值能完整覆盖CASE语句中表达式的取值,否则最末一个条件句中的选择必须加上最后一句“WHENOTHERS=><顺序语句>;”。关键词OTHERS表示以上已列的所有条件句中未能列出的其他可能的取值。【注】:OTHERS只能出现一次,且只能作为最后一种条件取值。关键词NULL表示不做任何操作。(3)CASE语句中的选择值只能出现一次,不允许有相同选择值的条件语句出现。(4)CASE语句执行中必须选中,且只能选中所列条件语句中的一条。3.3四选一多路选择器及其

VHDL描述

3.3.2CASE语句

例3-3中的CASE语句的功能——

当CASE语句的表达式S由输入信号s1和s0分别获得‘0’和‘0’时,即当S=“00”时,执行赋值语句y<=a,即y输出来自a的数据;当S=“01”时,执行赋值语句y<=b,即y输出来自b的数据;……;以此类推。

CASE语句多条件选择值的一般表达式如下:选择值[|选择值]

选择值可以有四种不同的表达方式:

(1)单个普通数值,如6。

(2)数值选择范围,如(2TO4),表示取值为2、3或4。

(3)并列数值,如3|5,表示取值为3或者5。

(4)混合方式,以上三种方式的混合。3.3四选一多路选择器及其

VHDL描述

3.3.2CASE语句例3-4给出了以上用法的示例,示例中的对应处给出了详细说明。3.3四选一多路选择器及其

VHDL描述

3.3.2CASE语句例3-5给出了CASE语句使用中几种容易发生的错误。3.3四选一多路选择器及其

VHDL描述

3.3.2CASE语句

当条件句中的选择值未能完整覆盖CASE语句中表达式的取值时,例如例3-5中第一个CASE语句示例,未列全2~15的值的情况,要注意三点:

(1)如果不加OTHERS语句,综合器通常将判为错。(2)如果加WHENOTHERS=>NULL语句,则可能在输出口综合出时序模块(锁存器),应该避免。

(3)只能在WHENOTHERS=>语句后加上顺序语句,如out1<=‘0’;而不是NULL语句!这时才能综合出纯组合电路。所以尽量不要用NULL语句。3.3四选一多路选择器及其

VHDL描述

3.3.2CASE语句

与IF语句相比,CASE语句的程序可读性更好,因为它把条件中所有可能出现的情况全部列出,一目了然。

CASE语句的条件性独立、排它,条件句的次序不重要,它的执行过程更接近于并行方式。

IF语句有一个逐项条件顺序比较的过程(向上相与的逻辑过程)。

★对相同的逻辑功能,CASE语句比IF语句的描述耗用更多的硬件资源。

★对于有的逻辑,CASE语句无法描述,只能用IF语句来描述,这是因为IF-THEN-ELSIF语句具有条件相与的功能和自动将逻辑值“-”包括进去的功能(逻辑值“-”有利于逻辑的化简),而CASE语句只有条件相或的功能3.3.3IEEE库预定义标准逻辑位与矢量3.3四选一多路选择器及其

VHDL描述

标准逻辑位矢量STD_LOGIC_VECTOR数据类型与STD_LOGIC一样,都定义在STD_LOGIC_1164程序包中(而此程序包的所在库是IEEE库)。

STD_LOGIC:属于标准逻辑位类型;

STD_LOGIC_VECTOR:属于标准一维矢量数组,数组中的每一个元素的数据类型都是标准逻辑位STD_LOGIC。

★使用STD_LOGIC_VECTOR,可以表达电路中并列的多通道端口或节点,或者总线。

★使用STD_LOGIC_VECTOR,必须注明其数组宽度,即位宽,如定义:3.3.3IEEE库预定义标准逻辑位与矢量3.3四选一多路选择器及其

VHDL描述

上句表明,标识符B的数据类型被定义为一个具有8位位宽的矢量或总线端口信号,它的最左位,即最高位是B(7)。通过数组元素排列指示关键词“DOWNTO”向右依次递减为B(6),B(5),…,B(0)。第二条语句定义A的数据类型为4位位宽总线,数据对象是信号SIGNAL,其最左位是A(1),通过关键词“TO”向右依次递增为A(2)、A(3)和A(4)。于是根据以上两式的定义,对B的赋值方式如下:

其中“01100010”表示二进制数。VHDL规定:多于一位的二进制数必须加双引号,如“01”;而单一二进制数则用单引号,如‘1’。3.3.3IEEE库预定义标准逻辑位与矢量3.3四选一多路选择器及其

VHDL描述

与STD_LOGIC_VECTOR对应的是BIT_VECTOR位矢量数据类型,其每一个元素的数据类型都是逻辑位BIT,使用方法同STD_LOGIC_VECTOR。

例3-3中的内部信号S被定义为二元素的STD_LOGIC_VECTOR数据类型,高位是S(1),低位是S(0)。标准逻辑矢量(STD_LOGIC_VECTOR)类型定义语句如下:

在使用中,向STD_LOGIC_VECTOR数据类型的数据对象赋值的方式与普通的一维数组是一样的,即必须严格考虑位矢的宽度。同位宽、同数据类型的矢量间才能进行赋值。3.3.4其他预定义标准数据类型3.3四选一多路选择器及其

VHDL描述

VHDL综合工具配备的扩展程序包中定义了一些有用的类型。如Synopsys公司在IEEE库中加入的程序包STD_LOGIC_ARITH【arithmetic】中定义了如下的数据类型:无符号型(UNSIGNED)、有符号型(SIGNED)、小整型(SMALL_INT)。如果将信号或变量定义为这几个数据类型,就可以使用本程序包中定义的运算符。

★在使用这些数据类型之前,请注意必须加入下面的语句:

UNSIGNED用于无符号数的运算,SIGNED用于有符号数的运算。在IEEE库中,NUMERIC_STD和NUMERIC_BIT程序包中也定义了UNSIGNED型及SIGNED型,NUMERIC_STD是针对STD_LOGIC型定义的,而NUMERIC_BIT是针对BIT型定义的。在程序包中还定义了相应的运算符重载函数。3.3.4其他预定义标准数据类型3.3四选一多路选择器及其

VHDL描述

★有些综合器没有附带STD_LOGIC_ARITH程序包(QUARTUSII有此程序包),只能使用NUMERIC_STD和NUMERIC_BIT程序包。

(1)无符号数据类型。UNSIGNED数据类型代表一个无符号的数值,在综合器中,这个数值被解释为一个二进制数,这个二进制数的最左位是其最高位。例如,十进制的8可以表示如下:

若一个变量或信号的数据类型为UNSIGNED,则其位矢长度越长,所能代表的数值就越大。如一个4位变量的最大值为15,一个8位变量的最大值则为255,0是其最小值。不能用UNSIGNED定义负数。以下是两个无符号数据定义的示例:3.3.4其他预定义标准数据类型3.3四选一多路选择器及其

VHDL描述

其中变量var有11位数值,最高位是var(0),而非var(10);信号sig有6位数值,最高位是sig(5)。

(2)有符号数据类型。SIGNED数据类型表示一个有符号的数值,综合器将其解释为补码,此数的最高位是符号位,例如:SIGNED’(“0101”)代表+5,5SIGNED’(“1101”)代表-5

若将上例的var定义为SIGNED数据类型,则数值意义就不同了,如:其中,变量var有11位,最左位var(0)是符号位。3.3.4其他预定义标准数据类型3.3四选一多路选择器及其

VHDL描述

★特别注意:定义为数据类型UNSIGNED或SIGNED的数据具有双重性:

(1)这类数据可以像整数类型的数据一样直接进行各种算术运算(如加法),且不能进行逻辑运算;它们的取值范围也与整数类型相同:SIGNED类型的取值范围是-2147483647〜+2147483647,UNSIGNED类型的取值范围是0〜+2147483647。(2)它们本质上不属于整数类型INTEGER,而是被定义为STD_LOGIC的数组类型。它们在程序包STD_LOGIC_ARITH中的定义原文是:3.3.5信号定义和数据对象3.3四选一多路选择器及其

VHDL描述

例3-3(P67)中第8行的语句表示在描述的器件MUX41A内部定义标识符S的数据对象为信号SIGNAL,其数据类型为标准逻辑矢量STD_LOGIC_VECTOR(1DOWNTO0),其中元素S(1)和S(0)都为标准逻辑位类型STD_LOGIC。若要定义标识符e的数据对象为信号,数据类型为标准逻辑位,则可表示为:

其中的SIGNAL是定义某标识符为信号的关键词。信号属于数据对象(DataObjects)。在VHDL中,数据对象类似于一种容器,它接受不同数据类型的赋值。3.3.5信号定义和数据对象3.3四选一多路选择器及其

VHDL描述

数据对象有三类:信号(SIGNAL)、变量(VARIABLE)和常量(CONSTANT)。定义标识符:通常须确定为某类数据对象(规定该标识符的行为方式和功能特点),在此基础上还必须被定义为某种数据类型(限定取值范围)。

VHDL规定:标识符e的数据对象作为信号,它可以如同一根导线那样在整个结构体中传递信息,但传递或存储的数据类型(取值范围)只能包含在STD_LOGIC定义的元素中。对于端口信号也一样,所有端口的数据对象都默认为信号SIGNAL,其数据类型则根据需要另作显式定义。

譬如:例3-3中所有端口默认数据对象是信号,其数据类型被显式定义为STD_LOGIC,取值类型最多可达九种,如‘1’、‘Z’或‘X’等。3.3.6并置操作符

3.3四选一多路选择器及其

VHDL描述

在例3-3中的操作符&表示将信号或是数组合并起来形成新的数组矢量。例如“VH”&“DL”的结果为“VHDL”;‘0’&‘1’&‘1’的结果为“011”。显然语句S<=s1&s0的作用是令:S(1)<=s1;S(0)<=s0。利用并置符可以有多种方式来建立新的数组——

(1)将一个单元素并置于一个数的左端或右端形成更长的数组;(2)将两个数组并置成一个新数组等。

★在实际运算过程中,要注意并置操作前后的数组长度应一致。3.3.7四选一多路选择器的VHDL不同描述方式3.3四选一多路选择器及其

VHDL描述

例3-6至例3-8(此三例中的S赋值语句以上的部分与例3-3【P66-67】的对应部分相同)给出了另外三种不同的VHDL描述方式,所描述的都是4选1多路选择器,其端口结构和仿真波形都与图3-9和图3-10(P66)相同。以下分别给予讨论.

例3-6的语句表述结构其实与例3-1相似,只是IF语句的条件判断式的变量变成了两位二进制数,所以就有了四种可能的选择。于是程序使用了能进行更多判断条件的IF语句,其形式如下:3.3四选一多路选择器及其

VHDL描述

IF_THEN_ELSIF_ELSIF_…ELSE_ENDIF3.3.7四选一多路选择器的VHDL不同描述方式

例3-6中的IF语句是一条完整的条件句。其中的关键词ELSIF包含了ELSE和IF二者的含义,即有“否则假如…”的含义。它起到了在不满足前述条件的情况下,开辟另一条件判断分支的作用。由此构建了当条件多于两个时完成判断的语句结构。1.WHEN_ELSE条件信号赋值语句

3.3四选一多路选择器及其

VHDL描述

3.3.7四选一多路选择器的VHDL不同描述方式

与例3-3和例3-6不同,例3-7和例3-8中使用了并行语句,以下分别给予说明。

例3-7中出现的语句形式称为条件信号赋值语句,属于并行语句,它不需要进程语句引导。此类语句也称为并行赋值语句(相对于进程中的赋值语句),其一般表达式如下:

3.3四选一多路选择器及其

VHDL描述

3.3.7四选一多路选择器的VHDL不同描述方式

在结构体中的条件信号赋值语句的功能与在进程中的IF语句类同。在执行条件信号语句时,每一“赋值条件”是按书写的先后关系逐项测定的,一旦发现赋值条件为TURE,立即将“表达式”的值赋给“赋值目标”信号。但应注意由于条件测试的顺序性,条件信号赋值语句中的第一子句具有最高赋值优先级,第二句其次,依此类推。例如在以下程序中,如果当p1和p2同时为‘1’时,z获得的赋值是a而不可能是b★在整个条件赋值语句中,只有最后一个“表达式”后有一个分号。2.选择信号赋值语句

3.3四选一多路选择器及其

VHDL描述

与例3-7相同,例3-8中也使用了相似的并行语句,称为选择信号赋值语句,其一般语句格式如下:

选择信号赋值语句不能在进程中应用,但其功能却与进程中的CASE语句的功能十分相似。

CASE语句:执行依赖于进程中敏感信号的改变而启动进程,各子句的条件不能有重叠,必须包容所有的条件。

选择信号赋值语句:也有敏感量,即关键词WITH旁的选择表达式。不允许有条件重叠、条件涵盖不全情况。

★当选择信号赋值语句在条件句中未能覆盖所有条件选择时,要求在末尾加上与NULL类似涵义的关键词UNAFFECTED。

3.4全加器及其VHDL表述3.4.1全加器设计及例化语句应用

全加器可以由两个半加器和一个或门连接而成,其经典的电路结构如图3-11所示,其整个设计过程和表述方式都可以用VHDL来描述。

半加器元件的逻辑功能和VHDL表述已在3.2节中给出,程序是例3-2(P61),文件名即其实体名h_adder.vhd;或门元件的VHDL表述如例3-10(P75)所示,文件名是or2a.vhd。例3-9为全加器的VHDL顶层描述。3.4.1全加器设计及例化语句应用3.4全加器及其VHDL表述3.4全加器及其VHDL表述3.4.1全加器设计及例化语句应用3.4全加器及其VHDL表述3.4.1全加器设计及例化语句应用

为了实现连接底层元件形成更高层次的电路设计结构,文件中使用了例化语句。

例3-9

在实体中首先定义全加器顶层设计元件的端口信号,然后在ARCHITECTURE和BEGIN之间加入调用元件的声明语句,即利用COMPONENT语句对准备调用的元件(或门和半加器)做了声明,并定义net1、net2和net3三个信号作为全加器内部的连接线,具体连接方式见图3-11左图。最后利用端口映射语句PORTMAP()将两个半加器模块和一个或门模块连接起来构成一个完整的全加器(例3-9)。

【注意】:这里是假设参与设计的半加器文件、或门文件和全加器顶层设计文件都存放于同一个文件夹中。

元件例化就是引入一种连接关系,将预先设计好的设计实体定义为一个元件,然后利用特定的语句将此元件与当前的设计实体中的指定端口相连接,从而为当前设计实体引进一个新的低一级的设计层次。

3.4全加器及其VHDL表述3.4.1全加器设计及例化语句应用

当前设计实体(如例3-9描述的全加器)相当于一个较大的电路系统,所定义的例化元件相当于一个要插在这个电路系统板上的芯片,而当前设计实体中指定的端口则相当于这块电路板上准备接受此芯片的一个插座。★元件例化是使VHDL设计实体构成自上而下层次化设计的一种重要途径。★元件例化是可以多层次的。一个调用了较低层次元件的顶层设计实体本身也可以被更高层次设计实体所调用,成为该设计实体中的一个元件。任何一个被例化语句声明并调用的设计实体可通过不同的形式出现,它可以是一个设计好的VHDL设计文件(即一个设计实体),也可来自FPGA元件库中的元件或是FPGA器件中的嵌入式宏元件功能块,或是以别的硬件描述语言,如VerilogHDL设计的元件,还可以是IP核。3.4全加器及其VHDL表述3.4.2VHDL例化语句

例化语句由两部分组成,第一部分是将一个现成的设计实体定义为一个元件,语句的功能是对待调用的这个元件做出调用声明。命名方式与实体中的PORT()语句一致,只需将ENTITY改写为COMPONENT。它的最简表达式如下:

元件定义语句必须放在结构体的ARCHITECTURE和BEGIN之间。另外应注意,尽管例3-9中对或门和半加器的调用声明的端口说明中使用与原来元件(VHDL描述)相同的端口符号,但这并非是唯一的表达方式,亦可以做如下表达:

注意端口信号的数据类型的定义必须与原设计实体文件一致,且信号排列方式也要与原来的一致,包括端口模式、数据类型、功能定义等。3.4全加器及其VHDL表述3.4.2VHDL例化语句

元件例化语句的第二部分则是此元件与当前设计实体(顶层文件)中元件间及端口的连接说明。即所谓的“端口名关联法”,表达方式为:

其中,“例化名”必须存在,它类似于PCB板设计时标在当前系统(电路板)中的一个插座编号名;而“元件名”则是准备在此插座上插入的、己定义好的元件名,也即待调用的VHDL设计实体的实体名。例如一块PCB板上可能插有三片相同的A74LS161,它们分别对应例化名IC1、IC2、IC3三个插座位置,而元件名都是A74LS161。

PORTMAP是端口映射,或端口连接的意思。其中的“端口名”是在元件定义语句中的端口名表中已定义好的元件端口的名字,或者说是顶层文件中待连接的各个元件本身的端口名;“连接端口名”则是顶层系统中准备与接入的元件的端口相连的通信线名,或者是顶层系统的端口名。因此端口名关联法也称端口名映射法。3.4全加器及其VHDL表述3.4.2VHDL例化语句★符号“=>”是连接符号,其左面放置内部元件的端口名,右面放置内部元件以外需要连接的端口名或信号名,这种位置排列方式是固定的;然而,连接表达式在PORTMAP语句中的位置是任意的。★符号“=>”仅代表连接关系,不代表信号流动方向,即符号“=>”不限制信号数据的流动方向。还有一种对应的连接表述方法称为位置关联法。即:以位置的对应关系连接相应的端口。譬如:例3-2及例3-9中,半加器的端口信号排列顺序都是(A,B,CO

,SO);当它作为元件u2在图3-11中连接时,其对应的连接信号就是(net1,cin,net3,sum

)。于是与此半加器u2的端口按顺序对应起来,就得到例3-9中关于u2的位置关联法例化表述。对于位置关联法(或称位置映射法),关联表述的信号位置十分重要,不能放错;而且,一旦位置关联例化语句确定,被连接元件的源文件中的端口表内的信号排列位置就不能再变动。如例3-2,这时只能把端口改成以下形式:

3.4全加器及其VHDL表述3.4.38位加法器设计及算术操作符应用3.4全加器及其VHDL表述

例3-11的仿真波形图如图3-12所示。从图3-13它的RTL图(寄存器传输级)中可以清晰看到8位数相加的和再加进位值的硬件方式。★由于图3-13—类RTL图直接来自NetlistViewers的RTLViewers生成器,主要用来了解VHDL描述电路的大致结构,不拘泥细节,所以包括其中的小字不清楚都无关紧要。因为详细功能主要是通过仿真来了解。3.4.38位加法器设计及算术操作符应用★为方便获得两个8位数据A和B相加后的进位值,这里首先定义一个9位信号DATA,然后用并位符&在A和B的高位并位一个‘0’,将其都扩为9位。

VHDL规定,赋值符号两边的数据类型必须一致,且若为矢量类型,两端值的位数也必须相等。

3.4全加器及其VHDL表述★在算式中直接使用并位操作符&时,必须对并位式加上括号,如(“00000000”&CIN)。这是因为不同的操作符其优先级别不同,例如乘除的优先级别一定高于加减,而加减与并位&操作级别相等。对于平级的情况,在前的操作符则具有较高的优先级,其运算将优先进行。例如,若(‘0’&B)项不加括号,则赋值语句右边最后的运算结果有17位,与左边的DATA不符;而若(“00000000”&CIN)不加括号,则运算结果有10位,因为在最后并位CIN前的运算结果己经有9位了。★例3-11中,使用了IEEE库中另一程序包:STD_LOGIC_UNSIGNED。

【原因】:VHDL只允许加减乘除(+、-、*、/)算术操作的操作数的数据类型是整数类型(INTEGER类型,如1、2、3、4等),且算术结果仍然是整数类型;而例3-11中,加号“+”两边的操作数的类型都是标准位矢类型,相加后赋值的DATA也是标准位矢类型。显然不符合VHDL的语法要求。3.4.38位加法器设计及算术操作符应用3.4全加器及其VHDL表述【解决方法】:

(1)运算符重载:调用一个具有特定功能的函数(运算符重载函数),以便赋予加号“+”具备新的数据类型的操作功能。

(2)重新定义运算符:VHDL允许用户对原有的基本操作符重新定义,赋予新的含义和功能,从而建立一种新的操作符。

VHDL的IEEE库中的STD_LOGIC_UNSIGNED程序包中预定义的操作符{加(+)、乘(*)、小于等于(<=)、不等于(/=)、逻辑与(AND)…}对相应的数据类型INTEGER、STD_LOGIC和STD_LOGIC_VECTOR的操作做了重载,允许被重载的运算符对新的数据类型进行操作,或者允许不同的数据类型之间用此运算符进行运算。即:完成标准矢量(或整数与标准矢量)间的各种运算,并使计算结果自动转换为标准逻辑矢量类型STD_LOGIC_VECTOR,向DATA进行赋值。

3.4.38位加法器设计及算术操作符应用3.5乘法器及其VHDL表述

3.5.1统计位矢中含‘1’个数的电路模块设计

下面通过几则实用电路模块,即乘法器及相关电路的VHDL设计程序,进一步展示常用的新的VHDL语句、程序结构、数据类型和电路设计方法。

例3-12所描述的电路是一个统计输入的8位位矢中含‘1’个数的程序,其仿真波形如图3-14所示。这是一则与移位相加型乘法器程序结构十分相似的电路模型。3.5乘法器及其VHDL表述

3.5.1统计位矢中含‘1’个数的电路模块设计3.5乘法器及其VHDL表述

3.5.1统计位矢中含‘1’个数的电路模块设计

例3-12的程序中有如下三点值得注意的语句结构:

(1)变量关键词VARIABLE的用法。这包括变量的定义方式、定义位置和赋值特点等。变量VARIABLE与信号SIGNAL一样,都属于数据对象,在此程序中的功能与信号相似。但变量的赋值符号与信号的赋值符号是不同的,信号的赋值符号是“<=”,而变量的赋值符号是“:=”。例如若a定义为变量,对其赋值可以写为a:=‘1’。与信号不同,变量的功能主要用于数据的暂存,而且只能在进程中定义变量,所以,变量无法将数据传递出进程。例3-12中的语句CNTH<=Q

则能帮助变量Q将数据传出去。

(2)程序中的IF语句没有用关键词ELSE。这种用法是一种条件响应不完整的现象,即没有表达当条件(DIN(n)=‘0’)时作何处理。第5章中将会进一步给予说明。

(3)程序使用了循环语句,即LOOP语句的一种类型。3.5乘法器及其VHDL表述

3.5.2FOR_LOOP循环语句用法

例3-12程序中使用的FOR_LOOP循环语句是LOOP语句的一种类型。LOOP语句属于可综合的循环语句,它可以使所包含的一组顺序语句被循环执行,其执行次数可由设定的循环参数决定。LOOP语句的常用表达方式有以下两种:

这种循环方式是一种最简单的语句形式,它的循环方式需引入其他控制语句(如EXIT语句)后才能确定跳出;“LOOP标号”可任选。用法示例如下:3.5乘法器及其VHDL表述

3.5.2FOR_LOOP循环语句用法

FOR后面的“循环变量”是一个临时变量,如n,属LOOP语句的局部变量,不必事先定义。这个变量只能作为赋值源,不能被赋值,它由LOOP语句自动定义。【注意】:在LOOP语句范围内不要再使用其他同名的标识符。

“循环次数范围”规定了LOOP语句中的顺序语句被执行的次数(以常数表示),否则在LOOP体内的逻辑可以重复任何可能的范围,这将导致耗费过大的硬件资源,综合器不支持没有约束条件的循环。例3-12中,循环语句中的顺序语句是一个IF语句。当测到DIN的某一个位为1时,则通过赋值语句Q:=Q+1作累加。

VHDL中的循环语句与C等软件描述语言中的循环语句大有不同:前者每一次循环都将产生一个硬件模块,随着循环次数的增加,耗用硬件资源,但工作时间未必增加;后者的每次循环损失的是运行时间。3.5乘法器及其VHDL表述

3.5.3移位相加型乘法器的VHDL表述方法

例3-13所示的是基于移位相加原理的4×4位乘法器的VHDL程序,其仿真波形如图3-15所示(注意图中所有变量的数据类型都被设置成十进制类型)。此例的程序结构与例3-12基本相同。主要不同之处是,这个乘法器可以仅仅通过改变其中的参数S,即能增加此乘法器的位数。不但如此,这个参数S的数值可以从外部,即顶层设计中传送进入,从而能在顶层设计中通过例化语句轻易改变此乘法器的尺寸。★例3-13中涉及的新的语法知识比较多,以下分别以分节的形式叙述之。3.5乘法器及其VHDL表述

3.5.3移位相加型乘法器的VHDL表述方法1011×)1001101100000000

+)101111000111111(A)×)1101(B)1111000011111111110000114位×4位乘法器的结果最多为8位——00001111(A0)×)1101(B)00001111

000000000

0000111100

00001111000

00011000011假设:A=1111,B=1101;A0=00001111;R1.0=00000000R1.1=R1+00001111=00001111;R1.2=R1.1+00111100=01001011;R1.3=R1.2+01111000=11000011;R1<=R1.3;R<=R13.5乘法器及其VHDL表述

3.5.3移位相加型乘法器的VHDL表述方法3.5乘法器及其VHDL表述

3.5.4GENERIC参数定义语句

实体中定义的端口:连接设计实体与外部电路信号和数据的有形通道。

类似端口的参数的通道:这是一种无形的通道,但却能像普通端口一样,在综合或仿真编译中接受外部的数据,以改变电路的规模或时序性质。

★参数传递说明语句(GENERIC语句)常以一种说明的形式放在实体或块结构体前的说明部分,为所说明的环境提供一种静态信息(时间参数或总线宽度)通道。被传递的参数,或称类属参量(类属值或类属变量)与普通常数不同,常数只能从设计实体的内部得到赋值,且不能再改变;而作为参数传递的类属值可由设计实体外部提供。因此,设计者可从外面通过类属参量的重新设定,十分方便地改变一个设计实体或一个元件的内部电路结构和规模。3.5乘法器及其VHDL表述

3.5.4GENERIC参数定义语句参数传递说明语句的一般书写格式如下:

参数传递说明语句以关键词GENERIC引导一个类属参量表,在表中提供时间参数或总线宽度等静态信息。此语句用于设计实体和其外部电路环境通信的参数和传递信息。GENERIC语句在所定义的环境中的地位与常数相似,但却能(在编译过程中)从外部动态地接受赋值,因此其行为类似于端口PORT。因此常如实体定义语句那样,将GENERIC语句的说明放在其中,且放在端口说明语句的前面。3.5乘法器及其VHDL表述

3.5.5整数数据类型

例3-13的GENERIC语句中,定义参数S的数据类型是整数类型INTEGER。整数数据类型INTEGER的元素包含正整数、负整数和零。在VHDL中,整数的取值范围是-2147483647〜+2147483647,即可用32位有符号的二进制数表示。应该特别注意的是,通常VHDL仿真器将INTEGER类型作为有符号数处理,而VHDL综合器则将INTEGER作为无符号数处理。在定义整数类型时VHDL综合器通常要求使用关键词RANGE构成的子句限定数的范围,然后根据所限定的范围来决定表示此信号或变量的二进制数的位数。

VHDL综合器无法综合未限定范围的整数类型的信号或变量。如:

定义Q的数据对象是信号,数据类型是整数,限定Q的取值范围是0〜15,共16个值,可用4位二进制数来表示。因此,VHDL综合器自动将Q综合成由四条信号线构成的总线方式信号:Q(3)、Q(2)、Q(1)和Q(0)。3.5乘法器及其VHDL表述

3.5.5整数数据类型整数常量的书写方式示例如下:【注意】:整数的表达不加引号,如1、0、25等;“#”类似于“()”的功能。16E3等于十进制整数“16的3次幂”3.5乘法器及其VHDL表述

3.5.5整数数据类型

自然数类型NATURAL是整数类型的一个子类型,包含0和所有正整数。若将Q定义为NATURAL类型,综合结果与INTEGER相同,示例如下:即将Q定义为NATURAL类型的BUFFER端口,取值范围是整数0〜15。

正整数类型POSITIVE也是整数类型的一个子类型,比NATURAL类型少一个0。对于许多综合器,如果定义上例的Q定义为POSITIVERANGE15DOWNTO0,仍然能综合出相同的电路来。与BIT、BIT_VECTOR一样,数据类型INTEGER、NATURAL和POSITIVE都定义在VHDL标准程序包SDANDARD中。

由于此程序包是默认打开的,所以不必为定义整数类型而以显式打开STD库和程序包SDANDARD。3.5乘法器及其VHDL表述

3.5.6省略赋值操作符

例3-13中的语句“R1:=(others=>‘0’);”等效于向变量R1赋值“00000000”,即:R1:=“00000000”,实际是为R1赋初始值0。如果将例3-13作为一个可被外部电路调用和参量控制的模块,则当前程序中的参数S是一个不定值,于是对R1所赋的值的二进制位数也是不定的。一般地,为了简化表达和位数不定情况下的赋值,可使用短语“(OTHERS=>X)”,这是一个省略赋值操作符,它可以在较多位的位矢量赋值中作省略化的赋值,如有:

最下的语句则等同于:d1<=“11111”;a1:=“0000000000000000”。其优点是在给大的位矢量赋值时简化了表述,明确了含义,特别是这种表述与位矢量长度无关。3.5乘法器及其VHDL表述

3.5.6省略赋值操作符

利用“(OTHERS=>X)”还可给位矢量的某一部分位赋值之后再使用OTHERS给剩余的位赋值,如d2<=(1=>‘1’,4=>‘1’,OTHERS=>‘0’)。此句意义是给位矢量d2的第1位和第4位赋值为‘1’,而其余位赋值‘0’。下例是用省略赋值操作符“(OTHERS=>X)”给d1赋其

温馨提示

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

评论

0/150

提交评论