收藏 分享(赏)

VHDL-入门.ppt

上传人:weiwoduzun 文档编号:5424943 上传时间:2019-03-01 格式:PPT 页数:276 大小:1.54MB
下载 相关 举报
VHDL-入门.ppt_第1页
第1页 / 共276页
VHDL-入门.ppt_第2页
第2页 / 共276页
VHDL-入门.ppt_第3页
第3页 / 共276页
VHDL-入门.ppt_第4页
第4页 / 共276页
VHDL-入门.ppt_第5页
第5页 / 共276页
点击查看更多>>
资源描述

1、第6章 VHDL 入门,6.1 VHDL的结构 6.2 VHDL的词法元素 6.3 VHDL的数据对象 6.4 VHDL的数据类型 6.5 VHDL的操作符 6.6 VHDL的语法基础,6.1 VHDL的结构 一个完整的VHDL程序由实体(ENTITY)、结构体(ARCHITECTURE)、配置(CONFIGURATION)、包(PACKAGE)和库(LIBRARY) 5个部分组成。实体用于定义所设计的系统的外部接口信号;结构体用于描述系统内部的结构和行为;配置用于从库中选取所需单元来组成系统设计的不同版本,对于比较简单只存在一个结构单元的设计,配置部分可以省略;包中存放各设计模块能共享的数据

2、类型、常数和子程序等;库存放已经编译的实体、结构体、包集合和配置。库、包、实体和结构体是一个硬件实体的VHDL描述中必不可少的部分。例6.1所示的就是一个最简单的与门的VHDL完整描述。,例6.1 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; -库和包调用语句 ENTITY and2 IS PORT( a:IN BIT; b:IN BIT; c:OUT BIT ); END ENTITY and2; -实体定义 ARCHITECTURE behav OF and2 IS BEGIN c=a and b; END ARCHITECTURE behav; -

3、结构体,6.1.1 实体 实体(ENTITY)是VHDL程序设计的基本单元,其表示的电路可以像微处理器那样复杂,也可以像单个逻辑门那样简单。实体定义部分用于定义实体的名称、输入/输出接口等实体与外部对象交互的信息。 实体定义是一个初级设计单元,可以单独编译并且可以被并入设计库,它给实体命名并给实体定义一个接口,接口信息用于与其他模块通信。实体定义描述了器件的外部视图,即从外部看到的器件的外貌,包括该器件的名称、端口。在实体定义部分也可以定义参数,并把参数从外部传入模块内部。,实体定义的最简表达式如下: ENTITY 实体名 IS GENERIC(类属参数说明); PORT(端口说明); END

4、 ENTITY 实体名; 或者 ENTITY 实体名 IS GENERIC(类属参数说明); PORT(端口说明); END 实体名;,以上所示的格式中,前者为IEEE VHDL93标准,后者为IEEE VHDL87标准,建议采用IEEE VHDL93标准的实体定义格式。 实体定义中“ENTITY”、“IS”、“GENERIC”、“PORT”和“END ENTITY”是定义实体的关键词,实体定义从“ENTITY 实体名 IS”开始,至“END ENTITY 实体名;”结束。“;”符号表示一句语句的结束,是不可缺少和省略的,否则在编译时会报错,导致编译失败。VHDL对字母不区分大小写,即“ENT

5、ITY”与“entity”是完全一样的。例6.2是一个简单实体定义的例子。,例6.2 ENTITY and2 is PORT( a:IN BIT; b:IN BIT; c:OUT BIT ); END ENTITY and2; 该例中“实体名”为“and2”。定义中无类属参数说明,“PORT();”为端口说明,定义了实体的输入/输出端口。 实体定义中各部分的意义及要求如下:,1实体名 实体名由英文字母和数字组合而成,实体的名称必须与描述该实体的.VHD文件的名称相同,它表示设计电路的器件名称。建议根据设计的电路的功能来命名实体。在定义实体名时,不能用数字作为第一个字符,例如“74ls00”就是

6、不允许的,在编译时系统会报错,导致编译失败。实体名中也不允许有中文字符。,2类属参数说明 类属参数说明和端口说明是实体定义部分的第一个描述对象,说明设计实体和其外部环境通信的对象、通信的格式约定和通信通道的大小。类属参数说明为设计实体与外部环境通信的静态信息提供通道,用来规定端口的大小、实体中子元件的数目、实体的定时特性等。类属参数说明必须放在端口说明之前,一般书写格式如下: GENERIC (CONSTANT参数名称:IN子类型标识 :=静态表达式,); 其中: 内的内容是可以省略的;参数名称由英文字母和数字组合而成,其第一个字符必须是英文字母。,例6.3所示为应用类属参数说明语句的一个位宽

7、为“datawidth”的二输入与门实体定义。 例6.3 ENTITY bus_and IS GENERIC (datawidth:INTEGER:=8); PORT ( bus_a:IN BIT_VECTOR(datawidth-1 DOWNTO 0); bus_b:IN BIT_VECTOR(datawidth-1 DOWNTO 0); bus_c:OUT BIT_VECTOR(datawidth-1 DOWNTO 0) ); END ENTITY bus_and;,实例中的“GENERIC (datawidth:INTEGER:=8);”定义了一个整数型的类属参数“datawidth”,

8、并给该参数赋初值“8”。在后续的定义中,字符“datawidth”就代表整数“8”。 3端口说明 端口是设计实体与外部环境的动态通信通道,是对实体与外部接口的描述。端口由端口说明(即端口表)描述。端口表中每个端口定义由端口名、端口模式和数据类型3部分组成。端口名是该端口的标识符;端口模式说明信号通过该端口的流动方向;数据类型说明流过该端口的数据的类型。端口表的格式如下:,PORT( SIGNAL端口名:模式端口模式 数据类型 := 静态表达式,); 因为关键字PORT后必须是信号类,故可略去关键字“SIGNAL”。 (1) 端口名。端口名是赋予每个外部引脚的名称,通常用一个或几个英文字母,或用

9、英文字母加数字来命名。名称满足VHDL标志符的要求即可,一般情况下,名称的含义最好与惯例一致,例如用以“D”开头的端口名表示数据,用以“A”开头的端口名表示地址。 (2) 端口模式。端口模式用来说明数据和信号通过该端口的方向。VHDL提供了如下端口模式:,IN定义端口通道为单向只读模式,规定数据只能由该端口流入实体中,在实体内部结构的描述中只能读取该端口中的值。 OUT定义端口通道为单向输出模式,规定数据只能由该端口从实体内部向外输出,在实体内部结构的描述中只能向该端口赋值。 INOUT定义端口通道为输入/输出双向模式,既可输入数据,又可输出数据,在实体内部结构的描述中既能读取该端口的值,又能

10、向该端口赋值;从实体外部看,既可以向该端口输入数据,又可以读取该端口的输出数据。在使用这种端口类型时,还有很多需要考虑的因素。,BUFFER类似于INOUT的双向端口,但此类端口只能有一个源,即只能有一个数据源向该端口写数据,当实体内部向该端口输出数据后,如果实体接着读取该端口的数据,则读取的数据就是刚才输出的数据。 (3) 数据类型。VHDL作为一种强类型语言,任何一种数据对象(信号、变量、常数)必须严格限定其取值范围,即对其传输或存储的数据的类型作明确的界定。这对于大规模电路描述的排错是十分有益的。VHDL中提供了10种数据类型。IEEE 170693标准规定的数据类型包括布尔型(BOOL

11、EAN)、位型(BIT)、位矢量型(BIT_VECTOR)和整数型(INTEGER)等。,当用户使用了IEEE库中的标准程序包后,可以使用预先定义的标准逻辑位“STD_LOGIC”数据类型和标准逻辑矢量“STD_LOGIC_VECTOR”数据类型等。 位型数据规定的取值范围是逻辑位“1”和“0”。在VHDL中,表示逻辑位“0”和“1”的表达必须加单引号,否则VHDL综合器会将未加单引号的0和1解释为整数数据类型(INTEGER)。 位型数据可以参与逻辑运算或算术运算,其结果仍是位型数据。VHDL综合器用一个二进制位表示位型。将例6.1中的端口信号a、b、s和y的数据类型都定义为BIT,即表示a

12、、b、s和y的取值范围,或者说数据范围被限定在逻辑位“1”和“0”之间。,6.1.2 结构体 结构体是次级设计单元,在其对应的初级设计单元实体说明被编译并被并入设计库之后,它就可以单独地被编译,并且被并入该设计库之中。结构体描述一个设计的结构或行为,把一个设计的输入与输出之间的关系建立起来。一个设计实体可以有多个结构体,分别代表该器件的不同实现方案。按照结构体对结构描述的层次来分,VHDL对结构体的描述有以下3种层次。 (1) 行为级描述:又称算法级描述,即采用进程语句顺序描述设计实体的行为,这是最高层次的描述方法。,(2) 数据流级描述:又称寄存器级描述,即采用进程语句顺序描述数据流在控制流

13、作用下被加工、处理和存储的全过程。这种描述方式与采用原理图输入方式进行电路设计处于同一个层次。 (3) 结构描述:又称门级描述,即采用并行处理语句,使用最基本的逻辑门单元描述设计实体内的结构组织和元件互联关系。 这3种描述方法通常也不是界限分明的,可以在一个结构体中既有行为级描述,又有数据流级的描述。初学者常使用行为描述方法对实体结构功能进行描述,然后由系统自动生成低级的硬件配置文件。,结构体由结构体名称、信号定义语句、结构和功能描述语句构成,一般有如下两种格式。 格式1: ARCHITECTURE 结构体名 OF 实体名 IS 说明语句 BEGIN 结构描述语句 END ARCHITECTU

14、RE 结构体名; 格式2: ARCHITECTURE 结构体名 OF 实体名 IS,说明语句 BEGIN 结构描述语句 END 结构体名; 这两种描述分别对应于IEEE VHDL93标准和IEEE VHDL87标准,建议按照IEEE VHDL93标准规定的格式描述结构体。 “ARCHITECTURE”、“OF”、“IS”、“BEGIN”和“END ARCHITECTURE”是结构体描述中的关键词。例6.4所示为一个多路选择器的完整VHDL描述。,例6.4 ENTITY mux2 IS PORT( a,b:IN BIT; s :IN BIT; y :OUT BIT ); END ENTITY m

15、ux2; ARCHITECTURE behav OF mux2 IS BEGIN y =a WHEN s= 0 ELSE b; END ARCHITECTURE behav;,1结构体名称 结构体的名称可自由设定,建议根据结构体中对实体描述的层次把结构体的名称命名为behav(行为级)、dataflow(数据流级)或者struc(门级)。这3个名称实际上是3种结构体描述方式的名称。当设计者采用某一种描述方式来描述结构体时,该结构体的结构名称就命名为那个名称。这样,阅读VHDL程序的人便能直接了解设计者采用的描述方式了。,命名方式如下: ARCHITECTURE behav OF mux2 IS

16、用结构体的行为命名; ARCHITECTURE dataflow OF mux IS用结构体的数据流命名; ARCHITECTURE struc OF mux IS用门级命名。,2说明语句 说明语句位于“ARCHITECTURE”和“BEGIN”关键词之间,用于对结构体内部所使用的信号常数、数据类型和函数进行定义。该定义的作用范围局限于其所在的结构体,一个实体中可能有几个结构体。实体定义中的端口表内定义的I/O端口为外部信号,而结构体定义的信号为内部信号。结构体内的信号定义与实体的端口说明类似,由信号名称和数据类型组成,但不需要定义信号模式,即不用说明信号的方向。 3结构描述语句 结构描述语句

17、用于描述实体内部的结构,这部分是结构体的主要部分。该部分由一个或多个并行的语句构成,其中的每个并行语句又由其他并行或顺序语句构成。,6.1.3 VHDL库 为了提高VHDL设计的效率,实现代码的重复利用,我们将一些有用的代码信息汇集在一起,形成一个VHDL库,以供后续设计者调用。这样也能使VHDL的设计遵循某些统一的语言标准或使其数据格式更加规范化。VHDL库中的内容包括程序包或者元件库程序包。所谓程序包,是指预先定义好的数据类型、子程序等设计单元的集合体;元件库程序包是指预先设计好的各种设计实体。通常,库中放置不同数量的程序包,而程序包中又可放置不同数量的子程序,子程序中又含有函数、过程、设

18、计实体(元件)等基础设计单元。,如果要在一项VHDL设计中用到某一预定的程序包,就必须在编译综合设计之前调用该程序包中的内容。在综合过程中,每当综合器在较高层次的VHDL源文件中遇到库语言,就将随库指定的源文件读入,并参与综合。因此,必须在设计实体的描述语句之前,用库语句和USE语句声明所使用的库。VHDL的库分为两类:一类是设计库,如在具体设计项目中设定的目录所对应的WORK库;另一类是资源库,即存放常规元件和标准模块的库。VHDL程序设计中常用的库有IEEE库、STD库和WORK库。,1IEEE库 IEEE库是VHDL设计中使用最普遍的库,它包含IEEE标准的程序包和其他一些支持 工业标准

19、的程序包。IEEE库中的标准程序包主要包括STD_LOGlC_1164、NUMERIC_BIT 和NUMERIC_STD等程序包。其中STD_LOGIC_1164是最重要和最常用的程序包,大部分基于数字系统设计的程序包都是以此程序包中设定的标准为基础的。 此外,还有一些程序包虽然不是IEEE标准,但由于其已成事实上的工业标准,因此也都并入了IEEE库。这些程序包中,最常用的是Synopsys公司的STD_LOGIC_ARITH、STD_ LOGIC_SIGNED和STD_LOGIC_UNSIGNED程序包。,一般的基于FPGA/CPLD的开发,IEEE库中的4个程序包STD_LOGIC_116

20、4、STD_LOGIC_ARITH、STD_LOGIC_ SIGNED和STD_LOGIC_UNSIGNED已足够使用。另外需要注意的是,在IEEE库中符合IEEE标准的程序包并非符合VHDL标准,如STD_LOGIC_1164程序包。因此,在使用VHDL设计实体的前面必须使用如下语句显式表达出要使用STD_LOGIC_ 1164程序包: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;,2STD库 STD库中收录了VHDL标准定义的两个标准程序包,即STANDARD(标准)程序包和TEXTIO(文件输入/输出)程序包。 由于STD库符合VHDL标准,因此只

21、要在VHDL应用环境中,即可随时调用这两个程序包中的所有内容,不必使用如下所示的库使用声明语句: LIBRARY STD; USE STD.STANDARD.ALL;,3WORK库 WORK库是由用户的设计构成的工作库,用于存放用户设计及自定义的一些设计单元和程序包,用户先期设计完成的成品、模块均自动存放在其中。WORK库自动满足VHDL标准。VHDL标准规定工作库总是可见的,在实际调用中,不必预先声明。基于VHDL所要求的WORK库的基本概念,在PC或工作站上利用VHDL进行项目设计时,不允许在根目录下进行,而必须设定一个目录,用于保存所有与此项目相关的设计文件,VHDL综合器将此目录默认为

22、WORK库。但必须注意,工作库并不是这个目录的目录名,而是一个逻辑名。综合器将指示器指向该目录的路径。,除以上这些常用的库之外,用户还可以在一个项目中自定义VHDL库,便于重复使用自己的设计成果,以及与其他人共享设计成果,减小设计工作量。 在VHDL语言中,库的说明语句总是放在实体单元前面。这样,在设计实体内的语句就可以使用库中的数据和文件。由此可见,库的作用在于使设计者可以共享已经编译过的设计成果。VHDL允许在一个设计实体中同时打开多个不同的库,但库之间必须是相互独立的。,对于必须以显式表达的库及其程序包的语言表达式,应放在每一项设计实体的最前面,成为这项设计的最高层次的设计单元。库语句一

23、般必须与USE语句同用。库语句关键词LIBRARY指明所使用的库名,USE语句指明库中的程序包。一旦说明了库和程序包,整个设计实体都可被访问或调用,但其作用范围仅限于所说明的设计实体。VHDL要求在每项含有多个设计实体的更大的系统中,每个设计实体都必须有自己完整的库说明语句和USE语句。USE语句的使用将使所说明的程序包对本设计实体部分或全部开放,即是可视的。,USE语句的使用有两种常用格式: USE库名.程序包名.项目名; USE库名.程序包名.ALL; 第一个语句的作用是向其所在设计实体开放指定库中的特定程序包内所选定的项目。 第二个语句的作用是向其所在设计实体开放指定库中的特定程序包内所

24、有的内容。 合法的USE语句的使用方法是将USE语句说明中所要开放的设计实体对象紧跟在USE语句之后, 如“USE IEEE.STD_LOGIC_1164.ALL;” 表明打开IEEE库中的STD_LOGIC_ 1164程序包,并使程序包中所有的公共资源对于本语句后面的VHDL设计实体程序全部开放,即该语句后的程序可任意使用程序包中的公共资源。,这里用到了关键词“ALL”,表示将使用程序包中的所有资源。又如: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.STD_ULOGIC; USE IEEE.STD_LOGIC_1164.RISING_EDGE; 该例中向当前

25、设计实体开放了STD_LOGIC_1164程序包中的RISING_EDGE函数,但由于此函数需要用到STD_ULOGIC数据,因此在上一条USE语句中开放了同一程序包中的这一数据类型。,6.1.4 VHDL程序包 为了使已定义的常数、数据类型、元件调用说明以及子程序能被更多其他的设计实体方便地访问和共享,使程序更加标准化,可以将它们收集在一个VHDL程序包中。多个程序包可以并入一个VHDL库中,使之适用于更一般的访问和调用。这一点对于大系统开发时多个或多组开发人员同步工作尤为重要。程序包主要由常数说明、VHDL数据类型说明、元件定义和子程序4种基本结构组成,一个程序包中至少应包含这些结构中的一

26、种。,(1) 常数说明:定义在程序包中需要用到的常数,类似于语言中的宏定义,这些常数常用于描述系统数据总线通道的宽度。 (2) VHDL数据类型说明:主要用于在整个设计中通用的数据类型,如通用的地址总线数据类型定义等。 (3) 元件定义:主要规定在VHDL设计中参与文件例化的文件接口界面。 (4) 子程序:并入程序包的子程序有利于在设计中对其进行调用。通常程序包中的内容应具有更大的适用面和良好的独立性,以供各种不同设计需求的调用,如STD_LOGIC_1164程序包定义的STD_LOGIC和STD_LOGIC_VECTOR型数据。一旦定义了一个程序包,各种独立的设计就能方便地调用。,定义程序包

27、的一般语句结构如下: PACKAGE 程序包名 IS -程序包首 程序包首说明部分 END 程序包名; PACKAGE BODY 程序包名 IS -程序包体 程序包体说明部分以及包体内容 END 程序包名; 程序包由说明部分(程序包首)和内容部分(程序包体)两部分组成。一个完整的程序包中,程序包首名与程序包体名是同一个名字。,程序包首的说明部分可收集多个不同的VHDL设计所需的公共信息,其中包括数据类型说明、信号说明、子程序说明及元件说明等。这些信息虽然也可以在每一个设计实体中进行逐一单独的定义和说明,但如果将这些经常用到并具有一般性的定义和说明放在程序包中供随时调用,显然可以提高设计的效率和

28、程序的可读性。 程序包结构中,程序包体不是必需的。如果只需要共享定义的常数、数据类型等的声明部分,则可以独立定义和使用程序包首。例6.5所示就是一个可独立使用的程序包首。,例6.5 PACKAGE myPACKAGE IS -程序包首,指定程序包名称 TYPE byte IS RANGE 0 TO 255; -定义数据类型byte SUBTYPE half_byte IS byte RANGE 0 TO 15; -定义子类型4位数据类型half_byte CONSTANT datawidth:half_byte:=8; -定义常数datawidth为8 SIGNAL address:byte;

29、 -定义信号address END myPACKAGE; -程序包首结束,例6.5定义了一个程序包首,其程序包名是“myPACKAGE”,在其中定义了一个新的数据类型“byte”和子类型“half_byte”,接着定义了一个“half_byte”类型的常数“datawidth”和一个“byte”类型的信号“address”,还定义了一个元件和函数。由于元件和函数必须有具体的内容,因此将这些内容安排在程序包体中。如果要使用这个程序包中的所有定义,则可利用USE语句按如下方式获得访问此程序包的方法:,LIBRARY WORK; USE WORK.myPACKAGE.ALL; ENTITY ARCH

30、ITHCYURE 由于WORK库是默认打开的,因此在使用中可省去“LIBRARY WORK;”语句,只要加入相应的USE语句即可。例6.6所示为在当前WORK库中定义程序包,并调用该程序包完成的3-8译码器VHDL描述的示例。,例6.6 PACKAGE mypak IS TYPE output8 IS BIT_VECTOR(0 TO 7); TYPE data IS RANGE 1 TO 8; END mypak; USE WORK.mypak.ALL; -省略WORK库的调用语句 ENTITY coder IS PORT (datain:IN data; signout:OUT output

31、8); END coder; ARCHITECTURE behav OF coder IS BEGIN,WITH datain SELECT signout= B“ 00000001“ ,WHEN 1, B“ 00000010“ ,WHEN 2, B“ 00000100“ ,WHEN 3, B“ 00001000“ ,WHEN 4, B“ 00010000“ ,WHEN 5, B“ 00100000“ , WHEN 6, B“ 01000000“ , WHEN 7, B“ 10000000“ , WHEN 8, B“ 00000000“ , WHEN OTHERS; END ARCHITECT

32、URE behav;,此例是一个可以直接综合的3-8译码器的VHDL描述。此例在程序包mypak中定义了两个新的数据类型“data”和“output8”。在3-8译码器coder的实体描述中即使用了这两个数据类型。 程序包体将包括在程序包首中已定义的子程序的子程序体中。程序包体说明部分的组成内容可以是USE语句(允许对其他程序包进行调用)、子程序定义、子程序体、数据类型说明、子类型说明和常数说明等。对于没有具体子程序说明的程序包体可以省去。,如例6.6所示,如果仅仅是定义数据类型或定义数据对象等内容,则程序包体是不必要的,程序包首可以独立地被使用;但在程序包中若有子程序说明时,则必须有对应的子

33、程序包体。这时,子程序体必须放在程序包体中。程序包常用来封装属于多个设计单元分享的信息。常用的预定义的程序包有STD_LOGIC_1164、STD_LOGIC_ARITH、STD_ LOGIC_ UNSIGNED和STD_LOGlC_SIGNED等。下面分别进行介绍。,1STD_LOGIC_1164程序包 STD_LOGIC_1164程序包是IEEE库中最常用的程序包,是IEEE的标准程序包。其中包含了一些数据类型、子类型和函数的定义,这些定义将VHDL扩展为一个能描述多值逻辑的硬件描述语言。STD_LOGIC_1164程序包中用得最多和最广的是定义了满足工业标准的两个数据类型STD_LOGI

34、C和STD_LOGIC_VECTOR。新定义的数据类型除具有“0”和“1”逻辑量以外,还有其他的逻辑量,如高阻态“z”、不定态“x”等,更能满足实际数字系统设计仿真的需求。,2STD_LOGIC_ARITH程序包 STD_LOGIC_ARITH预先编译在IEEE库中,此程序包在STD_LOGIC_1164程序包的基础上扩展了3个数据类型,即UNSIGNED、SIGNED和SMALL_INT,并为其定义了相关的算术运算符和转换函数。UNSIGNED数据类型不包含符号位,无法参与有符号的运算;SIGNED数据类型包含符号位,可以参与有符号的运算。,3STD_LOGIC_UNSIGNED和STD_L

35、OGlC_SIGNED程序包 STD_LOGIC_UNSIGNED和STD_LOGIC_SIGNED程序包是由Synopsys公司提供的,它们都预先编译在IEEE库中。这些程序包重载了可用于INTEGER型、STD_LOGIC型和STD_ LOGIC_VECTOR型混合运算的运算符,并定义了由STD_ LOGIC_VECTOR型到INTEGER型的转换函数。其中:STD_LOGIC_SIGNED中定义的运算符考虑到了符号,是有符号数的运算;STD_LOGIC_UNSIGNED程序包定义的运算符没有符号,为无符号运算。,6.1.5 配置 由于对同一种实体可以采用多种结构体描述,因此对拥有多种结构

36、体的实体,可以通过配置语句把特定的结构体关联到一个确定的实体。配置语句就是用来为较大的系统设计提供管理和工程组织的。通常在大而复杂的VHDL工程设计中,配置语句可以为实体指定或配属一个结构体,可以利用配置使仿真器为同一实体配置不同的结构体,以使设计者比较不同结构体之间的仿真差别,或者为例化的各元件实体配置指定的结构体,从而形成一个所希望的例化元件层次构成的设计实体。,配置是VHDL设计实体中的一个基本单元。在综合或仿真中,可以利用配置语句为确定整个设计提供许多有用信息。对以元件例化的层次方式构成的VHDL设计实体,可以将其中的配置语句理解成一个为设计实体选择合适元件结构的表单,以配置语句指定在

37、顶层设计中的某一元件与一特定结构体相衔接,或赋予特定属性。配置语句还能用于对元件的端口连接进行重新安排等。,配置语句的一般格式如下: CONFIGURATION 配置名 OF 实体名 IS FOR 选配结构体名 END FOR; END 配置名; 例6.7所示为拥有两个结构体的“1”计数器并对其进行配置的完整VHDL描述。,例6.7 ENTITY ones_cnt IS PORT (a:IN BIT_VECTOR(2 DOWNTO 0); c:OUT BIT_VECTOR(1 DOWNTO 0) ); ARCHITECTURE algorithmic OF ones_cnt IS BEGIN

38、PROCESS(a) VARIABLE num: INTERGER RANGE 0 TO 3; BEGIN NUM:=0;,FOR I IN 0 TO 2 LOOP IF A(I)= 1 THEN NUM:=NUM + 1; END IF END LOOP; CASE NUM IS WHEN 0 = C C C C =“ 11“ ; END CASE; END PROCESS;,END ARCHITECTURE algorithmic; -算法级描述 - ARCHITECTURE dataflow OF ones_cnt IS BEGIN c(1)=(a(1)AND a(0)OR(a(2)AN

39、D a(0)OR(a(2)AND a(1); c(0)=(a(2)AND NOTa(1)AND NOTa(0)OR(NOT a(2) AND NOT a(1)AND a(0)OR(a(2)AND a(1)AND a(0) OR (NOT a(2)AND a(1)AND NOT a(0); END ARCHITECTURE data_flow; -数据流级描述,- CONFIGURATION alg OF ones_cnt IS FOR algorithmic END FOR; END alg; -配置算法级结构体 - CONFIGURATION df OF ones_cnt IS FOR da

40、ta_flow END FOR; END df; -配置数据流结构体,6.2 VHDL的词法元素 词法元素指不可以拆分为其他更小元素的字符串,它是VHDL中的最小单位。VHDL设计文件可认为是由词法元素的序列和分隔符组成的。VHDL中的词法元素的类型有分界符、标识符、注释和字符文字。 这些词法元素是组成VHDL语句的基础。词法元素必须完全处于同一行中,下面分别进行介绍。,6.2.1 分界符 相邻的词法元素通过任意数量的分界符分开,在某些情况下,当两个词法元素连写会被当作一个词法元素时,两个词法元素之间必须加分隔符。常用空格来区分同一个语句中的两个词法元素,例如“ENTITY adder IS”

41、。在一个完整的语句末尾,必须用“ ; ”表示语句的结束。,6.2.2 标识符 标识符规则是VHDL中符号书写的一般规则,用以表示VHDL语句中的变量、块、进程等对象和关键词。基本的VHDL文件就是由标识符和分界符构成的。VHDL有两个标识符标准,分别是VHDL87标准和VHDL93标准。VHDL93标准的标识符是在VHDL87标准的标识符语法规则基础上扩展后形成的,因此又称VHDL93标准规定的标识符为扩展标识符,称VHDL87标准规定的标识符为短标识符。,1短标识符 VHDL中的短标识符是遵守以下规则的字符序列: (1) 短标识符由有效字符构成。 (2) 有效字符为大、小写英文字母(AZ,a

42、z)、数字(09)和下划线(_)。 (3) 短标识符必须以英文字母打头。 (4) 短标识符中的下划线前后必须都有英文字母或数字。 (5) 短标识符不区分大、小写。 字母大写与小写没有区别。在所有的语句中,字母大写、小写以及大小写混合都可以。为使程序易于阅读,建议VHDL的关键词大写,其他用户定义的对象名小写,规定所有关键词不能由用户声明为对象名。,VHDL87标准规定的关键词如下:,如下所示是合法的标识符: COUNT cout C_OUT BB2_5C VHSIC WT FFT Decoder A_B_C xyZ h333 STORE_NEXTITEM 如表6.1所示是不合法的标识符及其错误

43、原因。 表6.1 非法的标识符及其错误原因,2扩展标识符 扩展标识符具有以下特性: (1) 扩展标识符两端由反斜杠确定。例如,“valid”、“_ABC”等都是合法的扩展标识符。 (2) 扩展标识符中间允许包含图形符号和空格符。例如,“&My Name”、“$l0ms”、“*L 50ms”等都是合法的扩展标识符。 (3) 反斜杠之间的字符可以用保留字。例如,“1abel”、“PORT”和“enitiy”等都是合法的扩展标识符。,(4) 每两个反斜杠之间可以用数字打头。例如,“12mspulse”、“20_puls”和“50”都是合法的扩展标识符。 (5) 扩展标识符允许多个下划线相连。例如,“

44、A_B”、“my_projects”等都是合法的扩展标识符。 (6) 扩展标识符区分大小写。例如,“CLK”与“clk”分别表示两个不同的标识符。 (7) 扩展标识符与短标识符不同。例如,“CLK”与“CLK” 分别表示两个不同的标识符。,6.2.3 注释 注释是用分界符“-”开头,必须放在一行语句末的词法元素。它可以跟在一行之中的合法词法元素之后,也可以是该行唯一的词法元素。注释的内容不影响编译器和仿真程序,其目的是为了增加程序的可读性。注释中可包括所有特殊字符。表6.2所示的是注释的一些例子。 表6.2 注释语句示例,6.2.4 字符文字 字符文字用来指定用于标量对象初始化的常量值,包括单

45、个字符文字、字符串文字、位串文字和数字。 1单个字符文字 单个字符文字是仅包括一个字符的词法元素,其格式为在两个撇号之间插入一个字符。该字符可以是任何字符,包括空格和特殊符号。以下是单个字符文字的例子: A,B、!、1、0、 ,2字符串文字 字符串文字是在两个引号之间插入一串可显示字符而得到的词法元素。串中可以不包含任何字符。如果串中包含一个引号,则使用两个相连的引号表示。注意,该约定排除了将两个字符串文字写在同一行,而中间没有分隔符进行分隔的情况。一个字符串文字的长度指的是串中字符的个数(将双引号记为一个字符)。下面是一些例子: “ VHDL study “ 长度为10的字符串,包括一个空格

46、 “ “ 长度为0的字符串,不包括任何内容,“ A“ 长度为1的字符串,与A不同 “ “ “ 长度为1,包括一个引号 “ $,#,|“ 长度为5的字符串,包含特殊字符$、#和 | 字符串文字词法元素必须写在一行中,长度超过一行的串在前一行的末尾必须使用连接符“&”将两行连接起来。以下是一个连接示例: This is a long string literal that will not fit on one”& line which requires using the concatenation operator. “,3位串文字 位串文字用来表示数码矢量,它是由进制标志符和数字字符串组成的

47、词法元素。进制标志符及其对应的数字串如表6.3所示。 表6.3 位 串 文 字,位串文字中的数字串的数字必须和进位标志符相符。类似“D“012“”是非法的位串。无论采用何种进位标志符,VHDL的变异过程中总是将位串解释成一个二进制的位串。例如,“X“A“”的值即为“1010”。在任何情况下,位串文字只表示一个位矢量,VHDL仅将它看做是一个位串,其数字值的定义取决于用户对位串文字的定义。位串文字用于指定二进制寄存器的内容的初始状态。位串文字也可被直接指定为位串,而不使用任何进位标志符。位串文字中可添加下划线字符,以提高文字的可读性,下划线字符不会影响位串的值。位串文字的长度即位串中位的个数,与进位标志符无关。下划线不影响位串文字的长度。然而,在未指定字符文字的进位标志符时,不允许使用下划线。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报