大学数字电路第十一章  硬件描述语言_第1页
大学数字电路第十一章  硬件描述语言_第2页
大学数字电路第十一章  硬件描述语言_第3页
大学数字电路第十一章  硬件描述语言_第4页
大学数字电路第十一章  硬件描述语言_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

第十一章 硬件描述语言(VHDL)211.1 概述211.2 VHDL基本结构411.2.1 实体(ENTITY)511.2.2 结构体(ARCHITECTURE)611.2.3 配置(CONFIGURATION)711.2.4 库(LIBRARY)711.2.5 包(PACKAGE)811.3 VHDL语言元素1011.3.1 VHDL词法规则与标识符1011.3.2 数据对象和数据类型1111.3.3 运算符(operator)1311.4 VHDL常用编程语句1411.4.1 顺序(SEQUENTIAL)描述语句1411.4.2 并发(CONCURENT)描述语句1611.5 基本逻辑电路设计2011.5.1 组合逻辑电路设计2011.5.2 时序逻辑电路设计25习题29参考文献30内容提要 本章简要说明了用VHDL语言设计硬件电路的基本过程,介绍了VHDL语言的基本结构、语言元素,详细介绍了VHDL语言的常用编程语句以及基本组合逻辑电路、时序逻辑电路的设计方法。第十一章 硬件描述语言(VHDL)11.1 概述 在传统的硬件电路设计中,主要的设计文件是电路原理图,而采用HDL(Hardware Description Language)设计系统硬件电路时主要使用HDL编写源程序。该语言可以描述硬件电路的功能,信号连接关系及定时关系。VHDL(VHSIC* VHSIC 是Very High Speed Integrated Circuit的缩写。 Hardware Description Language)和verilog HDL作为IEEE(Institute of Electrical and Electronics Engineers)的工业标准硬件描述语言,在电子工程领域,用来描述、验证和设计电子线路,得到了广泛的接受和应用。为了用一种标准的方法描述电子系统,1980年,美国国防部开始进行VHDL的开发,。1987年由IEEE将VHDL制定为标准IEEE VHDL语言参考手册标准草案1076B版(IEEE VHDL Language Reference Manual Draft Standard version 1076B),称为IEEE10761987。应当注意,起初VHDL,只是作为描述系统规范(System Specification)而制定的一个标准,而不是为设计系统而制订的。 第2个版本VHDL93在1993年推出。它相对于VHDL87没有什么大变化。只是增添了主要是对VHDL模型的某些新的VHDL命令和属性。 在本章,只介绍VHDL87。VHDL作为一个规范语言和建模语言,其第一个模拟器出现于20世纪80年代后期,80年代末,随着VHDL的标准化,利用VHDL开发电子系统的工具逐渐出现,在设计中开始使用VHDL。和其它HDL语言相比,VHDL语言的优点如下:一、 易于共享和交流。易于将VHDL代码在不向的工作平台(如工作站和PC机)和开发工具之间交换,如在某一个制造商的模拟器用的VHDL程序可以不加修改地移到另制造商的模拟器。二、 设计结果与工艺无关。设计者可以专心致力于其功能,即需求规范的实现,而不需要对不影响功能的与工艺有关的因素花费过多的时间和精力。当门级或门级以上层次的描述通过仿真后,再用相应的工具将设计映射成不同的工艺(如MOS、CMOS工艺等),这样,当工艺改进时,无须修改原设计程序,只要改变相应的映射工具即可。而在传统的原理图设计中、设计者必须用手工检查与工艺有关的因素如时序、面积、驱动强度、元件选择、扇出等。三、 设计方法灵活、支持广泛。VHDL语言可以支持自上而下(Top Down)和基于库(Library-Based)的设计方法,支持同步电路、异步电路、FPGA以及其它随机电路的设计。其范围之广是其它HDL语言所不能比拟的。四、 系统硬件描述能力强。VHDL语言具有多层次描述系统硬件功能的能力,可以从系统的数学模型直至门级电路。另外,高层次的行为描述可以与低层次的RTL描述和结构描述混合使用。VHDL语言能进行系统级的硬件描述,是它的一个最突出的优点。 所谓用VHDL设计是指由设计者编写代码,然后用模拟器验证其功能,再把这些代码综合成一个与工艺无关的网络表,即翻译成由门和触发器等基本逻辑元件组成的原理图(门级电路),最后完成硬件设计。VHDL的一般设计流程如图11.1.1所示,分5步进行。图11.1 VHDL的一般设计流程第1步:系统分析和划分。从系统总体要求出发,自上而下地逐步将设计内容细化。第2步:行为级描述和仿真。所谓行为描述,就是对整个系统的数学模型的描述。一般来说,对系统进行行为描述的目的是试图在系统设计的初始阶段,通过对系统行为描述的仿真来发现设计中存在的问题。在行为描述阶段,并不真正考虑其实际的操作和算法用什么方法来实现,而考虑系统的结构及其工作过程是否能达到系统设计规格书的要求。第3步:RTL级描述和仿真。寄存器传输级( RTL: Register Transfer Level )描述又称数据流描述。用行为级描述的系统,其抽象程度高,很难直接映射到具体的硬件电路,必须将行为方式描述的VHDL语言程序改写为用RTL方式描述,才能导出系统的逻辑表达式,进行逻辑综合,得到具体的硬件实现。对RTL方式描述的程序进行仿真,且通过后,进行逻辑综合。第4步:逻辑综合。利用逻辑综合工具,将RTL方式描述的程序转换成用基本逻辑元件表示的文件(门级网络表)。门级网络表相当于人工设计电路时,用门电路、触发器等基本逻辑元件画出的逻辑电路图,可以将门级网络表以逻辑原理图的方式输出。然后,对逻辑综合结果在门电路级上再进行仿真,并检查定时关系。第5步:电路物理实现。可以用自动布线程序将门级网络表转换成相应的ASIC芯片的制造工艺,做出ASIC芯片;或者将网络表转换成HDPLD(如FPGA)芯片的编程数据,利用HDPLD完成硬件电路设计。11.2 VHDL基本结构元件(component)是VHDL的一个特定概念,它可以是一个完整的设计,或是系统的一小部分。对于一个元件,设计者通常只对输入/输出、功能规范和存取时间等外部特性感兴趣,通常无须知道元件的内部结构,即黑盒子原则。如第4章、第6章中用74138、74161等74xx系列MSI器件设计电路,只需考虑器件的逻辑功能、输入/输出引脚。一个元件由两个主要部分构成(见图11.2.1)。u 实体(entity):对元件的输入/输出端口进行描述,类似电原理图中的逻辑符号,它并不描述元件的具体功能,实体可以看作一个具有输入/输出端口的黑盒子;u 结构体(architecture):对元件的行为进行描述,即对元件完成的功能、执行的操作和元件内部各种对象之间的关系等进行描述。图11.2.1中表示一个2输入与门在VHDL中如何描述,实体描述该元件由2个输入信号和1个输出信号组成,其行为可以在结构体中发现,输出等于2个输入信号进行“与运算”,详细VHDL程序如图11.2.2所示。图11.2.1 一个元件分两部分:实体和结构体entity and_2 isport (in_a, in_b: in std_logic; out_a: out std_logic);end and_2; architecture behavioral of and_2 isbeginout_a = in_a and in_b;end behavioral;图11.2.2 元件AND_2的VHDL描述VHDL语言由实体(entity)、结构体(architecture)、配置(configuration)、包集合(package)和库(library)5个部分组成。前4种是可分别编译的源设计单元。一个VHDL程序必须包含实体和构造体两部分。下面通过一个具体的例子,说明如何用VHDL描述电路。例11.2.1 用VHDL描述一个具有异步清零的4位计数器。library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;- 库、包集合调用。entity cntm16 isport (clr : in std_logic; clk : in std_logic; q : buffer std_logic_vector(3 downto 0);end cntm16; - 实体。architecture rtl of cntm16 isbegin process (clk,clr) variable i:integer range 0 to 15;beginif(clr=0)theni:=0;elsif( clkevent and clk=1)thenif (i=15)theni:=0;elsei:=i+1;end if;end if;q=conv_std_logic_vector(i,4);end process;end rtl; - 结构体。11.2.1 实体(ENTITY)实体定义元件的外部接口信号。实体名与元件名相同。实体是设计中最基本的模块,如果设计分层次,设计中的最顶层实体称为顶级实体,在顶级实体中包含较低级别的实体。语法* 中的内容为必选项, 中的内容为可选项。:entity 实体名 isport ( signal 信号名:模式 类型指定; signal 信号名:模式 类型指定) ;end 实体名 ;1. 信号名:赋予每个外部引脚的名称,通常用一个或几个英文字母,或者用英文字母加数字命名。如d0,d1,sel等。2. 模式:定义外部引脚的信号方向是输入、输出等。有5种情况:in, out, inout, buffer, linkage。in 元件只读该信号的值;out 元件只把值写入该信号;inout 元件对该信号读和写(双向信号);buffer 元件写和读回该信号(不是双向信号,信号从元件出去);linkage 不指定方向,无论哪一个方向都可连接,只用在文档中。下面的例子中有一个输入信号a_in和一个输出信号b_out。entity component_1 is port (a_in : in std_logic; b_out: out std_logic);end component_1; 模式inout只能用于双向信号的情况下。如果信号必须被重读,则应该用模式buffer。保留字signal通常在端口说明中缺省、因为它不增加任何信息。模式in、end后面的实体名也可以缺省。因而下面的两个例子是相同的。注意,在VHDL中不区分大小写字母。entity component_1 isport ( signal a,b : in std_logic; signal c: out std_logic);end component_1; entity component_1 isport (a,b : std_logic; c: out std_logic); - 模式in可不写end; - 实体名可不写11.2.2 结构体(ARCHITECTURE)结构体指定元件的内部结构、输入与输出之间的关系等,是对元件具体功能的描述。结构体名与元件名不同,结构体与实体相联结。一个实体可以有多个结构体。语法:architecture 结构体名 of 实体名 结构体说明部分begin 结构体语句部分end 结构体名;结构体说明部分必须在第一个begin之前定义,它可以由类型、子程序、元件和信号说明等组成。例11.2.2 用VHDL描述一个2选1数据选择器。entity mux2 isport(d0,d1,sel:in bit; q:out bit); end mux2;architecture dataflow of mux2 isbeginq =(d0 and sel) or ( not sel and d1);end dataflow;11.2.3 配置(CONFIGURATION)一个实体可以对应多个结构体,配置语句把一个具体的结构体和实体结合在一起。配置的最简单形式是完全不用配置,这种情况下,被模拟的结构体将最后被编译。其次是默认配置,如果一个元件不包含任何其他的元件,可以使用默认配置。下面的例子中,实体mux有2个不同的结构体体:rtl和behv。配置指明哪个结构体要被模拟。名字为mux_rtl的配置指明用rtl,而名字为mux_behv的配置指明用behv。entity mux isend;architecture behv of mux isbegin end;architecture rtl of mux isbegin end;configuration mux_behv of mux isfor behvend for ;end mux_behv; - 结构体behv的默认配置configuration mux_rtl of mux isfor rtlend for ;end mux_rtl; - 结构体rtl的默认配置根据所编译的是上面哪个配置,决定要模拟的是behv还是rtl。综合工具通常忽略所有的配置,而对最后输入的结构体进行综合。总而言之,配置更多地用于模拟,而较少用于设计硬件。11.2.4 库(LIBRARY)在设计系统时,可以使用保存在设计库中的预先做好的元件、函数、过程等。在编译一个VHDL元件时,默认其保存在工作库(work)中。工作库不是PC或工作站正在进行编译的目录名,而是一个逻辑名。系统中有一个指示器定义工作库的物理地址,即指向该目录。VHDL工具通常在启动时自动定义工作库。 所有被编译的元件都保存在设计库(library)中。程序包通常也保存在设计库中。一个程序包(package)中可以包含若干函数、过程、常数、数据类型等。为了使用某个程序库中的元件和程序包,在VHDL代码中必须首先用下面的语句指定库和包的名字:library ;use .all; VHDL标准中规定工作库work、标准库std及std库中的standard程序包永远可见,因此,这两个库及standard程序包不必在VHDL代码中指定。这意味着每段VHDL代码中总是隐含有下面的不可见的行: library work;library std;use std.standard.all; 如果要用其他库和包,则必须在VHDL顶部即entity前面定义。库的作用范围是:从library语句后的实体到该实体所对应的结构体。standard程序包中定义了数据类型:bit、bit_vector、boolean、character、string、time、integer、real等,数据类型std_logic,std_ulogic,std_logic_vector,std_ulogic_vector定义在std_logic_1164程序包中,该程序包在库IEEE中。如果要用其中的数据类型(建议用这些数据类型),则在每个entity前必须包含下列语句行:library ieee;use ieee.std_logic_1164.all;11.2.5 包(PACKAGE)在设计大规模电路时,有些函数、数据类型和常量等常同时在几个元件中使用。例如,表示系统总线大小的常量,计算系统数据信息校验和的函数等。可以把这些常数、函数包含在一个程序包中,如果设计中要改变总线大小或者校验和的计算方法,只需在程序包中改变,则所有共享这些资源的元件都会更新。 所有程序包中定义的数据类型、常量和子程序等都可以在将来的设计中再利用,只要在VHDL代码顶部用use语句指定该程序包即可。程序包由下面两部分组成:u 包头部分;u 包体部分。 包头部分由函数、过程、类型、元件、常量组成,全都对外可见。一般包头给出所包含各项的名称,包体给出各项的具体细节。一个程序包可以只有包头,包体是一个可选项。包体(body)由包头中指定的函数和过程的程序体组成,描述包头中所说明的子程序(即函数和过程)的行为,包体可以与元件的一个architecture类比。要注意的是,包体中建立的内部子程序在程序包之外不可见,亦即不能在VHDL程序中使用包体内部的子程序。例 11.2.3 自定义包 mypackage。package mypackage is - - 包头 function minimum(a,b: in std_logic_vector) return std_logic_vector;- 以下部分说明可用于包外部的常数和数据类型:constant maxint : integer := 16#FFFF#;type arithmetic_mode_type is (signed, unsigned);end mypackage;package body mypackage is - - 包体 function minimum(a,b: in std_logic_vector)return std_logic_vector isbegin if ab then return a; else return b; end if;end minimum;end mypackage;语法:package 包名 is 外部子程序说明 外部常量说明 外部元件模板 外部类型说明 属性说明 属性指定end 包名;package body 包名 is 外部子程序体 内部子程序说明 内部子程序体 内部常量说明 内部类型说明end 包名;利用use语句,用户可以使用已做好的程序包。这个语句必须在entity之前,在library之后。library ieee;library mylib;use ieee.std_logic_1164.all;use mylib.mypackage.all;entity myentity isport (a: in std_logic; b: out std_logic);上面的例子假定在设汁库mylib中编译。系统必须有个指示器指出库mylib在什么位置,即对应于哪个日录。这个例子还指定了mypackage.all。语句中all的意义是可以使用package中的所有内容。如果只用程序包中定义的函数minimum,则必须写成: use mylib.mypackage.minimum;如果要用不同程序包中的几个不同的函数,则必须写成下面的样子:Iibrary mylib, ieee;use mylib.mypackage.minimum, ieee.std_logic_1164.all;或Iibrary mylib;Iibrary ieee;use mylib.mypackage.minimum;use ieee.std_logic_1164.all;11.3 VHDL语言元素11.3.1 VHDL词法规则与标识符一、 注释(comment) 为了提高VHDL源程序的可读性,在VHDL中加入注释。注释是以两短横杠“ ”开头,直到本行末尾的一段文字,编译后存入数据库中的信息也不包含注释。二、 标识符(identifier)标识符用来表示常数、变量、信号、子程序、运算符等的名字。标识符规则是VHDL语言中符号书写的一般规则,VHDL-93版对VHDL-87版的标识符语法规则进行了扩展,通常称VHDL-87版本标识符为短标识符,VHDL-93版本标识符为扩展标识符。以下只介绍短标识符语法规则。1. 必须以英文字母开头;2. 英文字母、数字(09)和下划线都是有效的字符;3. 不区分大小写;4. 下划线( _ )的前后都必须有英文字母或数字;通常,将VHDL的保留字(或称关键字,如entity 、signal等)大写或用黑体表示,设计者自己定义的标示符小写,以使程序便于阅读、检查,尽管VHDL仿真、综合时不区分大小写。三、 数(number)的表示VHDL中的数可以是十进制数,也可以表示为二进制、八进制或十六进制等数,可以是整数,也可以是含有小数点的浮点数。1. 十进制整数表示法:如 022 43 34_56134561 3E82. 以基表示的数:这种方式表示的数由5个部分组成。第一部分:用十进制数标明基数;第二部分:数值隔离符号“#”;第三部分:数值的有效位;第四部分:指数隔离符号“#”;第五部分:用十进制数表示的指数部分,这一部分如果为0,可以省去。如: 2#11000100# 16#C4# 4#301#E1 - 这三个数都等于十进制数196基数的最小值为2,最大值为16,以基表示的数中允许出现AF的字母,大小写不区分。3. 实数:实数必须带有小数点。如: 12.0 0.0 346_4l5.675_23 532.4E-2为了提高数字的可读性,在相邻数字之间允许插入下划线。允许在数前面出现若干个0,但不允许在数之间存在空格。11.3.2 数据对象和数据类型一、数据对象(object)VHDL语言中,可以赋予一个值的对象就称为数据对象。数据对象主要包括三种:变量(VARIABLE)、常量(CONSTANT)、信号(SIGNAL)。 变量和常量与普通计算机高级语言中的变量和常量类似。但是信号则体现了硬件描述语言的特点。1. 常数定义一个常数主要是为了使设计中的某些量易于阅读和修改。常数在数字电路设计中常用来表示电源和地等。常数是一个恒定不变的值,一旦被赋值,它在程序中就不能再改变。常数说明格式为: constant 常数名:数据类型 : 表达式;如: constant vcc:real := 5.0;2. 变量变量只能在进程(process)和子程序(包括函数(function)和过程(procedure)两种)中使用,是一个局部量,用来暂时保存信息,与硬件之间没有对应关系,不能将信息带出对它做出定义的当前设计单元。对变量的赋值是立即生效的,不存在任何的延时行为。变量定义语句的格式为: variable 变量名:数据类型:约束条件 : 初始值;如:variable n:integer range 0 to 15 : 2 ;variable x, y : integer ; 变量赋值语句的格式为: 日标变量名 := 表达式;符号“:= ”表示赋值操作,即将数据信息传入。赋值语句“:”右边的表达式必须与目标变量具有相同的数据类型,这个表达式可以是一个运算表达式也可以是一个数值。如:x := y +1;3. 信号信号是电子电路内部硬件连接的抽象,是一个全局量,用来进行进程之间的通信。它对应地代表物理设计中的某一条硬件连接线。对信号的赋值不是立即进行的,即需要经过一段延时,信号才能得到新值,明显地体现了硬件系统的特征。信号通常在实体、结构体和程序包中说明。信号说明语句格式为:signal 信号名:数据类型:约束条件 : 表达式;如:signal sys_d : bit : 0;signal tmp : std_logic; 信号赋值语句格式为: 目标信号名 表达式; 符号“= ”表示赋值操作,即将数据信息传入。数据信息传入时可以设置延时过程,这与器件的实际传播延时特性十分接近。如:a b ; s1 s2 after 10 ns ;这里a,b,s1,s2均为信号,关键字after后是延迟时间,即s2经过10 ns后,才将值代入s1,这与变量不同。第一句和第二句没有利用after设置信号的赋值延时值,将自动设置一个小的延时量,即延时,以便使信息传输的先后符合逻辑的排序。注意,综合器的综合过程将忽略所设的延时值,综合后的功能仿真中也将信号赋值看成是零延时。二、数据类型(type) 在对VHDL的数据对象进行定义时,都要指定其数据类型。VHDL有多种标准的数据类型,并且允许用户自定义数据类型。1. 标准数据类型VHDL所提供的标准数据类型见表11.3.1。2. 自定义数据类型VHDL语言有一个很突出的优点:用户可以自己定义数据类型, 从而给使用VHDL语言带来了极大的方便。可由用户定义的数据类型有:u 枚举类型(enumeration);u 整数类型(integer);u 实数类型(real);u 数组类型(array);u 存取类型(access);u 文件类型(file);u 记录类型(record);u 时间类型(time);u 子类型(subtype)下面对常用的几种自定义的数据类型进行说明。(1) 整数类型(integer)、实数类型(real)这里所说的用户自定义整数、实数类型,实际上是定义整数、实数的一个子类。说明格式如下:type 数据类型名 is 数据类型 约束范围 ;例如,在一个数码管上显示的数字的范围是从0到9的整数,则可定义用于数码管显示的数据类型如下:type digit is integer range 0 to 9;对实数,也有同样的情况,如:type myreal is real range 1e3 to 1e3;(2) 枚举类型(enumeration)枚举类型数据是一组按一定顺序排列的标示符、字符或数值的有限集合。说明格式如下:type 数据类型名 is (元素1 , 元素2 ,;例如:type arith_op is (add,sub,mul,div);type color is (red,green,blue);在VHDL中,存在许多已经声明的枚举类型,如:type bit is (0, 1);type boolean is (false,true);type std_ulogic* std_logic值的设定与std_ulogic相同,区别是std_logic为决断类型,允许一个信号由多个驱动器驱动。 is (U,X,0,1,Z,W,L,H,-);其中,U - Uninitialized (未定)X - Forcing Unknown(强未知)0 - Forcing 0(强0)1 - Forcing 1(强1)Z - High Impedance(高阻)W - Weak Unknown(弱未知)L - Weak 0(弱0)H - Weak 1(弱1)- - Dont care(无关,即不可能情况)(3) 数组类型(array)、记录类型(record)数组是相同类型的数据集合在一起所形成的一个新的数据类型。它可以是一维或多维的。例如:type big_word is array (0 to 63) of bit; - 一维数组type matrix_1 is array (0 to 15,0 to 31) of bit; - 二维数组记录是不同类型数据的集合体,如:type instruction is record operator : arith_op; - arith_op为枚举类型数据,其定义见(2)枚举类型 op1 : integer; op2 : integer;end record;(4) 子类型(subtype)子类型是基本类型的子集,是对基本类型的数值范围进行限制而形成的一种新的数据类型。其说明格式为:subtype 标识符 is 基类型 范围限制如:subtype my_int is integer range 0 to 65535;subtype iobus is std_logic_vector(7 downto 0);11.3.3 运算符(operator)VHDL中的运算符包括逻辑运算符、算术运算符、关系运算符、并置运算符、赋值运算符5种,如表11.3.1所示。11.4 VHDL常用编程语句在用VHDL语言描述系统硬件行为时,按语句执行顺序对其进行分类,可以分为顺序(sequential)描述语句和并发(concurrent)描述语句.11.4.1 顺序(SEQUENTIAL)描述语句顺序描述语句只能出现在进程或子程序中,像在一般高级语言中一样,语句是按出现的次序执行的。下面介绍常见的顺序描述语句。一、条件语句(if)if语句根据一个或多个条件选择程序执行的顺序,其语法如下:if 条件 then 顺序语句elsif 条件 then 顺序语句else 顺序语句end if;注意,if语句中允许有几个elsif,但只能有一个else。例11.4.1 简单if语句举例。if (a=1) thenc = b;end if; 例11.4.2 用if语句描述二选一数据选择器。设输入为一个矢量d :in std_logic_vector(1 downto 0),即输入为d(0),d(1),输出为y,地址变量为a0。library ieee;use ieee.std_logic_1164.all;entity mux4 isport (d : in std_logic_vector (1 downto 0); a0: in std_logic; y: out std_logic);end mux4;architecture archmux of mux4 isbeginprocess(d,a0) begin if (a0=0) theny = d(0);elsey = d(1);end if; end process;end archmux;例11.4.3 用if语句描述四选一数据选择器。设输入为一个矢量d :in std_logic_vector(3 downto 0),输出为y,地址变量为矢量a :in std_logic_vector(1 downto 0)。library ieee;use ieee.std_logic_1164.all;entity mux4 isport (d : in std_logic_vector (3 downto 0); a: in std_logic_vector (1 downto 0); y: out std_logic);end mux4;architecture archmux of mux4 isbeginprocess(d,a) begin if (a=“00”) then y = d(0);elsif (a=“01”) then y = d(1);elsif (a=“10”) then y = d(2);else y = d(3);end if; end process;end archmux;二、开关语句(case)case语句根据表达式取值的不同,选择不同的语句序列执行,虽然if语句也有类似的功能,但case语句的可读性更强。其语法如下:case 表达式 iswhen 选择 = 顺序语句;when 选择 = 顺序语句;when others = 顺序语句;end case;注意,case语句中表达式的所有取值都要一一列出,否则,在语法上是错误的。case语句中的“选择”可以是一个值;或者是多个值的“或”关系;或者是一个取值范围(用to或downto表示)。即可分别表示成如下形式:when 值 = 顺序语句;when 值|值| |值 = 顺序语句;when 值 to 值 = 顺序语句;例11.4.4 用case语句描述四选一数据选择器。library ieee;use ieee.std_logic_1164.all;entity mux4 isport (d : in std_logic_vector (3 downto 0); a: in std_logic_vector (1 downto 0); y: out std_logic);end mux4;architecture archmux of mux4 isbeginprocess(d,a) begin case a iswhen “00” = y = d(0);when “01” = y = d(1);when “10” = y = d(2);when others = y = d(3);end case;end process;end archmux;11.4.2 并发(CONCURENT)描述语句 由于VHDL语言所描述的实际系统的许多操作是并发执行的,并发描述语句就是用来表示这种并发行为的,即VHDL程序中的所有并发语言结构可以并行执行,与书写顺序无关。下面介绍常见的并发描述语句。一、进程语句(process)进程语句是VHDL语言中描述并发行为的最基本语句,一个结构体中可以包含多个进程语句。process语句具有如下特点:u 可以与其它进程并发运行,并可存取实体或结构体中定义的信号;u 进程结构中的所有语句按书写顺序执行;u 为启动进程,在进程结构中必须包含一个显式的敏感信号表或包含一个wait语句,即只有敏感信号表中或wait语句后的敏感信号发生变化,进程才被启动;u 进程间通过信号传递,实现相互通信。进程语句的语法如下:进程名: process (敏感信号表) 进程说明部分begin 顺序语句部分end process 进程名; 二、信号赋值语句(signal assignment)信号赋值语句可以在进程内部使用,此时它作为顺序语句形式出现;也可以在结构体的进程之外使用,此时它作为并发语句形式出现。其语法为:目标信号 = 表达式;例如:architecture behav of ab_signal isbeginoutput = a+b;end behav;三、when else语句when else语句可以根据不同条件将不同的多个表达式之一的值代入目标信号,其语法为:目标信号 = 表达式 when 条件 else表达式 when 条件 else表达式 when 条件 else表达式 ;允许有多个 when else行,但必须以else 表达式 结束。例11.4.5 用when else语句描述四选一数据选择器。library ieee;use ieee.std_logic_1164.all;entity mux4 isport (d : in std_logic_vector (3 downto 0); a: in std_logic_vector (1 downto 0); y: out std_logic);end mux4;architecture archmux of mux4 isbeginy= d(0) when a=“00” else d(1) when a=“01” else d(2) when a=“10” elsed(3);end archmux;四、with select语句其语法如下:with 表达式 select 目标信号 = 表达式 when 选择 ; with 和 select间表达式的所有可能的取值(即语句中的选择)必须一一列出,如果想在一行内把其余所有的选择集中在一起,可使用when others,且others必须是最后一个选择。例11.4.6 用with select语句描述四选一数据选择器。library ieee;use ieee.std_logic_1164.all;entity mux4 isport (d : in std_logic_vector (3 downto 0); a: in std_logic_vector (1 downto 0); y: out std_logic);end mux4;architecture archmux of mux4 isbeginwith a selecty= d(0) when “00” , d(1) when “01” , d(2) when “10” ,d(3) when others;end archmux;五、元件说明语句(component declaration)、元件例化语句(component instantiation)在一个大型设计中,通常采用层次化的设计方法,即一个实体(称顶层实体)中通常包含若干个元件(实体),并将其相互连接起来。元件可以嵌套,即低层元件又可以包含更低一层的元件。利用层次化描述方法可以将已有的设计成果方便地用到新的设计中,大大提高设计效率。例如某系统由若干个插件板组成,每一插件板又由若干个ASIC电路组成,各ASIC电路又由若干个己生成的基本单元电路组成,则采用层次式的结构来设计这个系统,将会使工作量大大降低。对于这样的层次化设计(或称结构化设计),可以采用VHDL的结构化描述方式。首先将一个现成的设计实体定义为一个元件(即所谓的“元件说明”),然后说明此元件在当前设计实体中的连接关系(即所谓的“元件例化”),从而为当前设计实体引入了一个低一级的设计层次。元件说明出现在architecture和begin之间,其语法格式为:component 实体名 generic(类属表) ; port(端口名);end component;元件说明中的端口名必须和该元件所对应实体中的端口名保持一致,即port后括号中的信号名、信号排列顺序都要一致。元件例化语句出现在结构体的语句部分,其语法格式为:标号名:元件名 generic map(类属关联表)port map(端口关联表); 1参数映射语句(generic map) generic语句用于实现不同层次之间信息的传递,如位矢量长度、数据总线宽度、器件延时时间等参数的传递。如果generic参数说明为整数类型,则此语句可以被VHDL综合器所综合。 generic语句可以使器件模块化、通用化,使用generic语句和参数映射语句generic map可以调用通用模块建立新的电路结构。例11.4.7 参数传递应用举例。假设and2元件是一个带传输延迟时间参数的二输入与门电路,其VHDL描述如下:entity and2 is generic (delay:time := 10ns); port(a,b:in b

温馨提示

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

最新文档

评论

0/150

提交评论