首页 vhdl语言简介

vhdl语言简介

举报
开通vip

vhdl语言简介vhdl语言简介 第二章 VHDL语言简介 2(1 VHDL语言的优点和设计特点 2(1(1 VHDL语言的优点 传统的硬件电路设计方法是采用自下而上的设计方法,即根据系统对硬件的要求,详细编制技术规格书,并画出系统控制流图;然后根据技术规格书和系统控制流图,对系统的功能进行细化,合理地划分功能模块,并画出系统的功能框图;接着就进行各功能模块的细化和电路设计;各功能模块电路设计、调试完成后,将各功能模块的硬件电路连接起来再进行系统的调试,最后完成整个系统的硬件设计。采用传统方法设计数字系统,特别是当电路系统...

vhdl语言简介
vhdl语言简介 第二章 VHDL语言简介 2(1 VHDL语言的优点和 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 特点 2(1(1 VHDL语言的优点 传统的硬件电路设计 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 是采用自下而上的设计方法,即根据系统对硬件的要求,详细编制技术规格书,并画出系统控制流图;然后根据技术规格书和系统控制流图,对系统的功能进行细化,合理地划分功能模块,并画出系统的功能框图;接着就进行各功能模块的细化和电路设计;各功能模块电路设计、调试完成后,将各功能模块的硬件电路连接起来再进行系统的调试,最后完成整个系统的硬件设计。采用传统方法设计数字系统,特别是当电路系统非常庞大时,设计者必须具备较好的设计经验,而且繁杂多样的原理图的阅读和修改也给设计者带来诸多的不便。为了提高开发的效率,增加已有开发成果的可继承性以及缩短开发周期,各ASIC研制和生产厂家相继开发了具有自己特色的电路硬件描述语言(Hardware Description Language,简称HDL)。但这些硬件描述语言差异很大,各自只能在自己的特定设计环境中使用,这给设计者之间的相互交流带来了极大的困难。因此,开发一种强大的、标准化的硬件描述语言作为可相互交流的设计环境已势在必行。于是,美国于1981年提出了一种新的、标准化的HDL,称之为VHSIC(Very High Speed Integrated Circuit) Hardware Description Language,简称VHDL。这是一种用形式化方法来描述数字电路和设计数字逻辑系统的语言。设计者可以利用这种语言来描述自己的设计思想,然后利用电子设计自动化工具进行仿真,再自动综合到门级电路,最后用PLD实现其功能。 综合起来讲,VHDL语言具有如下优点: 1( 覆盖面广,描述能力强,是一个多层次的硬件描述语言。在VHDL语言中,设计的原始描述可 以非常简练,经过层层加强后,最终可成为直接付诸生产的电路或版图参数描述。 2( 具有良好的可读性,即容易被计算机接受,也容易被读者理解。 3( 使用期长,不会因工艺变化而使描述过时。因为VHDL的硬件描述与工艺无关,当工艺改变 时,只需修改相应程序中的属性参数即可。 4( 支持大规模设计的分解和已有设计的再利用。一个大规模的设计不可能由一个人独立完成,必 须由多人共同承担,VHDL为设计的分解和设计的再利用提供了有力的支持。 2(1(2 利用VHDL语言设计数字系统的特点 当电路系统采用VHDL语言设计其硬件时,与传统的电路设计方法相比较,具有如下的特点: 一( 采用自上而下的设计方法。 即从系统总体要求出发,自上而下地逐步将设计的内容细化,最后完成系统硬件的整体设计。在设计的过程中,对系统自上而下分成三个层次进行设计: 第一层次是行为描述。所谓行为描述,实质上就是对整个系统的数学模型的描述。一般来说,对系统进行行为描述的目的是试图在系统设计的初始阶段,通过对系统行为描述的仿真来发现设计中存在的问题。在行为描述阶段,并不真正考虑其实际的操作和算法用何种方法来实现,而是考虑系统的结构及其工作的过程是否能到达系统设计的要求。 第二层次是RTL方式描述。这一层次称为寄存器传输描述(又称数据流描述)。如前所述,用行为方式描述的系统结构的程序,其抽象程度高,是很难直接映射到具体逻辑元件结构的。要想得到硬件的具体实现,必须将行为方式描述的VHDL语言程序改写为RTL方式描述的VHDL语言程序。也就是说,系统采用RTL方式描述,才能导出系统的逻辑表达式,才能进行逻辑综合。 第三层次是逻辑综合。即利用逻辑综合工具,将RTL方式描述的程序转换成用基本逻辑元件表示的文件(门级网络表)。此时,如果需要,可将逻辑综合的结果以逻辑原理图的方式输出。此后可对综合的结果在门电路级上进行仿真,并检查其时序关系。 应用逻辑综合工具产生的门级网络表,将其转换成PLD的编程码点,即可利用PLD实现硬件电路的设计。 由自上而下的设计过程可知,从总体行为设计开始到最终的逻辑综合,每一步都要进行仿真检查,这样有利于尽早发现设计中存在的问题,从而可以大大缩短系统的设计周期。 二( 系统可大量采用PLD芯片。 由于目前众多制造PLD芯片的厂家,其工具软件均支持VHDL语言的编程。所以利用VHDL语言设计数字系统时,可以根据硬件电路的设计需要,自行利用PLD设计自用的ASIC芯片,而无须受通用元器件的限制。 三(采用系统早期仿真。 从自上而下的设计过程中可以看到,在系统设计过程中要进行三级仿真,即行为层次仿真、RTL层次仿真和门级层次仿真。这三级仿真贯穿系统设计的全过程,从而可以在系统设计的早期发现设计中存在的问题,大大缩短系统设计的周期,节约大量的人力和物力。 四(降低了硬件电路设计难度。 在传统的设计方法中,往往要求设计者在设计电路之前写出该电路的逻辑表达式或真值表(或时序电路的状态表)。这一工作是相当困难和繁杂的,特别是当系统比较复杂时更是如此。而利用VHDL语言设计硬件电路时,就可以使设计者免除编写逻辑表达式或真值表之苦,从而大大降低了设计的难度,也缩短了设计的周期。 五(主要设计文件是用VHDL语言编写的源程序。 与传统的电路原理图相比,使用VHDL源程序有许多好处:其一是资料量小,便于保存。其二是可继承性好。当设计其他硬件电路时,可使用文件中的某些库、进程和过程等描述某些局部硬件电路的程序。其三是阅读方便。阅读程序比阅读电路原理图要更容易一些,阅读者很容易在程序中看出某一电路的工做原理和逻辑关系。而要从电路原理图中推知其工作原理则需要较多的硬件知识和经验。 2(2 VHDL设计概览 本节仅讲述几个VHDL的实例,通过比较PLD的VHDL设计方法与传统的电路设计方法,使读者从总体上初步理解VHDL。 [例2-1] 用VHDL语言设计二选一数据选择器。 二选一数据选择器的器件图如下: A, B为输入端 A S为选择信号输入端 B Y Y为输出端 S 若S=0则Y=A;若S=1则Y=B 图2-1 二选一数据选择器器件图 二选一数据选择器的VHDL程序如下: LIBRARY IEEE; 打开库和程序包 USE IEEE.STD_LOGIC_1164.ALL; ENTITY mux21 IS PORT( A,B : IN STD_LOGIC; 21mux的外部说明, S : IN STD_LOGIC; PORT相当于器件的 Y : OUT STD_LOGIC); 引脚 END mux21; ARCHITECTURE one OF 21mux IS BEGIN 21mux的内部工作逻 Y<=A WHEN S=?0? ELSE 辑 B WHEN S=?1?; END one; 在上述的程序中: , LIBRARY(库)是经编译后的数据的集合,用来存放程序包定义、实体定义、构造体定义和 配置定义,使设计者可以共享已经编译过的设计结果。其中IEEE库是最常用的,而 STD_LOGIC是它的标准程序包,其中定义了一些常用的数据类型和子程序 , ENTITY(实体)语句类似于原理图中的一个部件符号,是一个初级设计单元。在实体中,我 们可以定义设计单元的输入输出引脚和器件的参数。上述程序中的实体语句描述了mux21的 接口信息。其中,PORT(端口)则说明了mux21的外部引脚 , ARCHITECTURE(构造体)语句描述一个设计的结构或行为,把一个设计的输入和输出 之间的关系建立起来。上述程序中的构造体语句描述了mux21内部的工作原理,在电路上 相当于器件的内部电路 [例2-2] 用VHDL设计8位三态锁存器 以通用的三态锁存器74373为例,其器件图如2-1所示。其中D1,D2,D3,D4,D5,D6,D7,D8为输入信号,Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8为输出信号。它的逻辑关系为: 若ONE=1,则Q1„Q8输出为高阻态;若ONE=0,则Q1„Q8输出为保存在锁存器中的信号值。 若G=1,D1„D8输入的信号被锁存入74373中;若G=0,D1„D8保持原先锁入的信号值。 图2-1 SN74LS373器件图 图2-2 SN74LS373的内部工作原理图 下面使用VHDL语言,采用传统的自下而上的方法设计74373。 首先设计锁存器(Latch),将实现Latch的VHDL程序保存在文件latch.vhd中。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY Latch IS PORT ( D: IN STD_LOGIC; 对应于原理图中的 ENA : IN STD_LOGIC; 器件符号LATCH Q : OUT STD_LOGIC ); END Latch; ARCHITECTURE one OF Latch IS SIGNAL sig_save : STD_LOGIC; 声明一个内部信号,BEGIN 用来保存输入信号 PROCESS ( D,ENA ) BEGIN IF ENA = ?1? THEN Sig_save <= D; END IF; Latch的内部电路 Q <= sig_save; 行为描述 END PROCESS; END one; SN74LS373的VHDL语言设计程序如下: SN74373器LIBRARY IEEE; 件接口说明 USE IEEE.STD_LOGIC_II64.ALL; ENTITY SN74373 IS PORT ( D : IN STD_LOGIC_VECTOR( 8 DOWNTO 1); OEN, G : IN STD_LOGIC; Q : OUT STD_LOGIC_VECTOR( 8 DOWNTO 1 ) ); END SN74373; ARCHITECTURE one OF SN74373 IS 在例化 COMPONENT Latch Latch之前 PORT ( D, ENA : IN STD_LOGIC; 必须声明 Q : OUT STD_LOGIC); END COMPONENT; SIGNAL sig_mid : STD_LOGIC_VECTOR(8 DOWNTO 1); BEGIN GeLatch : FOR iNum IN 1 TO 8 GENERATE 用FOR语 Latchx : Latch PORT MAP( D(iNum), G, sig_mid(iNum) ); 句循环例化 END GENERATE; Q <= sig_mid WHEN OEN = „0? ELSE “ZZZZZZZZ”; 构造体 END one; one ARCHITECTURE two OF SN74373 IS SIGNAL sigvec_save : STD_LOGIC_VECTOR( 8 DOWNTO 1); BEGIN PROCESS ( D, OEN, G) BEGIN IF OEN = „0? THEN Q <= sigvec_save; ELSE Q <= “ZZZZZZZZ”; END IF; 构造体two IF G = „1? THEN Sigvec_save <= D; END IF; END PROCESS; END two; SN74LS373设计程序的解析如下: , 在电路设计中,不同的电路可以实现相同的逻辑,因而同一种逻辑器件可以用多种 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 来 实现,这在VHDL中相当于一个实体(ENTITY)可以对应多个构造体 (ARCHITECTURE),而每个构造体对应一种实现方案。在例化这个器件的时候,需要 通过CONFIGURATION(配置)语句指定一个构造体,即要指定一种实现的方案。否 则,VHDL综合器会自动选择最新编译的构造体。 , COMPONENT(器件)语句对将要例化的器件进行接口声明,它对应一个已经设计好的 实体。VHDL综合器根据COMPONENT指定的器件名和接口信息来装配器件。本例中 COMPONENT语句说明的器件Latch必须与前面设计的实体Latch完全对应。在构造体 one中未用COMPONENT语句声明之前,VHDL编译器和综合器根本不知道有一个已经 设计好的Latch器件存在。 , GENERATE(生成)语句用来生成多个相同的结构。生成语句有两种使用方式:FOR和 IF,其中生成方案FOR用于描述重复模式;生成方案IF通常用语描述一个结构中的例外 情形,比如在边界处发生的特殊情况。本例中使用FOR形式,其中GeLatch是 GENERATE语句的标号,iNum是变量,iNum从1到8共循环了8次。 , “Latchx:Latch PORT MAP(D(iNum),G,sig_mid(iNum))”是一条例化语句。 所谓例化,在电路设计中相当于取了一个元件符号放在电路原理图中,即往电路中装配元 器件。本例中,安装后的元件标号是Latchx,安装的器件的名字是Latch,它的引脚D连 在信号线D(iNum)上,引脚ENA连在信号线G上,引脚Q连在信号线sig_mid(iNum) 上。iNum的值从1到8,借助于FOR„GENERATE循环生成语句,器件Latch从从1 到8共例化了8次,即安装了8个Latch,这8个Latch分别连在信号线D(1)-D(8) 和sig_mid(1)- sig_mid(8)上。 , 构造体two与构造体one描述了相同的逻辑,只是描述的方式不同。在VHDL中,有三 种基本的建模方法,即三种描述方式:行为描述、数据流描述和结构描述。行为描述的实 质就是对整个系统的数学模型的描述,抽象度很高;数据流描述方式,也称寄存器传输 (RTL)描述方式,通过数据流描述,可以导出系统的逻辑表达式,从而进行逻辑综合; 结构描述则是在多层次的设计中,高层次的设计模块调用低层次的设计模块,或者直接用 门电路单元来构成一个复杂的逻辑电路的描述方法。构造体one采用的是结构描述方式 和数据流描述方式(也称寄存器传输(RTL)描述方式),而构造体two则采用了行为描 述方式,它应用进程(PROCESS)语句,借助VHDL的并行处理思想,描述了输入和输 出信号之间转换的行为。 , PROCESS(进程)语句是行为描述方式中最基本的单位,每条并行语句都可等价为一个 进程。一个器件的行为是由一个或多个并行运行的进程实现的。本例中,语句 PROCESS(D,OEN,G)中的(D,OEN,G)称为敏感信号表,即当D、OEN和G 中的任何一个信号发生变化时,都将引起本进程的执行。因此,如果一个结构体中只有一 个进程(也没有其他并行语句)时,则所有的输入信号通常都要列入敏感信号表中,否则 信号可能被VHDL模拟器所忽略。 读者可把上例中的结构体one 与图2-2的原理图描述进行对比,从中可以找到VHDL描 述与传统设计方法的联系。 2( 3 VHDL语言的基本结构 一个完整的VHDL语言程序通常包含实体(Entity)、构造体(Architecture)、配置(Configuration)、程序包(Package)和库(Library)5个部分。前4个部分是可分别编译的源设计单元。实体用于描述所设计的系统的外接口信号;构造体用于描述系统内部的结构和行为;程序包存放各种设计模块都能共享的数据类型、常数和子程序等;配置用于从库中选取所需单元来组成系统设计的不同版本;库存放已经编译的实体、构造体、程序包和配置。库可由用户生成或由ASIC芯片制造商提供,以便于在设计中为大家所共享。 2(3(1 实体(ENTITY) 在VHDL中,实体类似于原理图中的一个部件符号,它可以代表整个系统、1块电路板、一个芯片或一个门电路,是一个初级设计单元。在实体中,我们可以定义设计单元的输入输出引脚和器件的参数,其具体的格式如下: ENTITY 实体名 IS [ 类属参数说明;] [ 端口说明;] END 实体名; 1) 类属参数说明 类属参数说明为设计实体和其外部环境的静态信息提供通道,特别是用来规定端口的大小、实体中子元件的数目、实体的定时特性等等。 2) 端口说明 端口说明为设计实体和其外部环境的动态通信提供通道,是对基本设计实体与外部接口的描述,即对外部引脚信号的名称、数据类型、和输入输出方向的描述。其一般格式如下: PORT(端口名 :方向 数据类型; ? ? 端口名 :方向 数据类型); 端口名是赋予每个外部引脚的名称;端口方向用来定义外部引脚的信号方向是输入 还是输出;数据类型说明流过该端口的数据类型。 IEEE1076标准包中定义了以下常用的端口模式: IN 输入,只可以读 OUT 输出,只可以写 BUFFER 输出(构造体内部可再使用) INOUT 双向,可以读或写 3) 数据类型 VHDL语言中的数据类型有多种,但在数字电路的设计中经常用到的只有两种,即BIT和BIT_VECTOR(分别等同于STD_LOGIC和STD_LOGIC_VECTOR)。当端口被说明为BIT时,该端口的信号取值只能是二进制数“1”和“0”,即位逻辑数据类型;而当端口被说明为BIT_VECTOR时,该端口的信号是一组二进制的位值,即多位二进制数。 [ 例2-3 ] 2输入端与非门的实体描述示例 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY nand IS PORT(a : IN STD_LOGIC ; b : IN STD_LOGIC; c : OUT STD_LOGIC); END nand; 2(3(2 结构体(ARCHITECTURE) 结构体描述一个设计的结构或行为,把一个设计的输入和输出之间的关系建立起来。一个设计实体可以有多个结构体,每个结构体对应着实体不同的实现方案,各个结构的地位是同等的。 结构体对其基本设计单元的输入输出关系可以用三种方式进行描述,即行为描述、寄存器传输描述和结构描述。不同的描述方式,只是体现在描述语句的不同上,而结构体的结构是完全一样的。 结构体分为两部分:结构说明部分和结构语句部分,其具体的描述格式为: ARCHITECTURE 结构体名 OF 实体名 IS --说明语句 BEGIN --并行语句 END 结构体名; 1) 说明语句 说明语句用于对结构体内部使用的信号、常数、数据类型和函数进行定义。例如: ARCHITECTURE behav OF mux IS SIGNAL nel :STD_LOGIC; ? BEGIN ? END behav; 信号定义和端口说明一样,应有信号名和数据类型的说明。因它是内部连接用的信号,故不需有方向的说明。 [ 例2-4 ] 全加器的完整描述示例 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY adder IS 实体描述 PORT( cnp : IN STD_LOGIC; a,b : IN STD_LOGIC; cn : OUT STD_LOGIC s : OUT STD_LOGIC ); END adder; ARCHITECTURE one OF adder IS SIGNAL n1,n2,n3:STD_LOGIC; BEGIN n1 <= a XOR b; n2 <= a AND b; 结构体描述 n3 <= n2 AND cnp; S <= cnp XOR n1; cn <= n1 OR n2; END one; 上述程序所对应的电路原理图如下: 2(3(3 程序包、库及配置 库和程序包是VHDL的设计共享资源,一些共用的、经过验证的模块放在程序包中,实现代码重用。一个或多个程序包可以预编译到一个库中,使用起来更为方便。 1( 库(LIBRARY) 库是经编译后的数据的集合,用来存放程序包定义、实体定义、结构体定义和配置定义,使设计者可以共享已经编译过的设计结果。在VHDL语言中,库的说明总是放自在设计单元的最前面: LIBRARY 库名; 这样一来,在设计单元内的语句就可以使用库中的数据。VHDL语言允许存在多个不同的库,但各个库之间是彼此独立的,不能互相嵌套。 常用的库如下: (1)STD库 逻辑名为STD的库为所有设计单元隐含定义,即“LIBRARY STD”子句隐含存在于任意设计单元之前,而无须显式写出。 STD库包含预定义程序包STANDARD与TEXTIO。 (2)WORK库 逻辑名为WORK的库为所有设计单元隐含定义,用户不必显示写出“LIBRARY WORK”。同时设计者所描述的VHDL语句不须作任何说明,都将存放在WORK库中。 (3)IEEE库 最常用的库是IEEE。IEEE库中包含IEEE标准的程序包,包括STD_LOGIC_1164、NUMERIC_BIT、 NUMERIC_STD以及其他一些程序包。其中STD_LOGIC_1164是最主要的程序包,大部分可用于可编程逻辑器件的程序包都以这个程序包为基础。 (4)用户定义库 用户为自身设计需要所开发的共用程序包和实体等,也可汇集在一起定义成一个库,这就是用户库,在使用时同样需要说明库名。 2( 程序包(PACKAGE) 程序包说明象C语言中的include语句一样,用来罗列VHDL语言中所要用到的常数定义、数据类型、函数定义等,是一个可编译的设计单元,也是库结构中的一个层次。要使用程序包时可用USE语句说明,例如: USE IEEE.STD_LOGIC_1164.ALL; 程序包由标题和包体两部分组成,其结构如下: PACKAGE 程序包名 IS --- 说明语句 标题部分 END 程序包名 PACKAGE BODY 程序包名 IS --- 说明语句 包体部分 END BODY; 标题是主设计单元,它可以独立编译并插入设计库中。包体是次级设计单元,它可以在其对应的标题编译并插入设计库之后,再独立进行编译并也插入设计库中。 包体并不总是需要的。但在程序包中若包含有子程序说明时则必须用对应的包体。这种情况下,子程序体不能出现在标题中,而必须放在包体中。若程序包只包含类型说明,则包体是不需要的。 常用的程序包如下: (1)STANDARD程序包 STANDARD程序包预先在STD库中编译,此程序包中定义了若干类型、子类型和函数。IEEE1076标准规定,在所有VHDL程序的开头隐含有下面的语句: LIBRARY WORK.STD; USE STD.STANDARD.ALL; 因此不需要在程序中使用上面的语句。 (2)STD_LOGIC_1164程序包 STD_LOGIC_1164预先编译在IEEE库中,是IEEE的标准程序包,其中定义了一些常用的数据和子程序。 此程序包定义的数据类型STD_LOGIC、STD_LOGIC_VECTOR以及一些逻辑运算符都是最常用的,许多EDA厂商的程序包都以它为基础。 (3)STD_LOGIC_UNSIGNED程序包 STD_LOGIC_UNSIGNED程序包预先编译在IEEE库中,是Synopsys公司的程序包。此程序包重载了可用于INTEGER、STD_LOGIC和STD_LOGIC_VECTOR三种数据类型混合运算的运算符,并定义了一个由STD_LOGIC_VECTOR型到INTEGER型的转换函数。 (4)STD_LOGIC_SIGNED程序包 STD_LOGIC_SIGNED程序包与STD_LOGIC_UNSIGNED程序包类似,只是STD_LOGIC_SIGNED中定义的运算符考虑到了符号,是有符号的运算。 2(3(4 配置(CONFIGUARTION) 配置语句一般用来描述层与层之间的连接关系以及实体与结构之间的连接关系。在分层次的设计中,配置可以用来把特定的设计实体关联到元件实例(COMPONET),或把特定的结构(ARCHITECTURE)关联到一个实体。当一个实体存在多个结构时,可以通过配置语句为其指定一个结构,若省略配置语句,则VHDL编译器将自动为实体选一个最新编译的结构。 配置的语句格式如下: CONFIGURATION 配置名 OF 实体名 IS [语句说明] END 配置名; 若用配置语句指定结构体,配置语句放在结构体之后进行说明。例如,某一个实体adder,存在2个结构体one和two与之对应,则用配置语句进行指定时可利用如下描述: configure TT of adder is for one end for; end configure TT; 2(4 VHDL语言的数据类型和运算操作符 2(4(1 VHDL语言的对象 VHDL语言中可以赋值的对象有3种:信号(Signal)、变量(Variable)、常数(Constant)。在数字电路设计中,这3种对象通常都具有一定的物理意义。例如,信号对应地代表电路设计中的某一条硬件连线;常数对应地代表数字电路中的电源和地等。当然,变量对应关系不太直接,通常只代表暂存某些值的载体。3类对象的含义和说明场合如表2-1所示。 表2-1 VHDL语言3种对象的含义和说明场合 对象类别 含 义 说 明 场 合 Architecture, package, entity 信 号 信号说明全局量 Process, function, procedure 变 量 变量说明局部量 常 数 常数说明全局量 上面两种场合下,均可存在 2(4(2 VHDL语言的数据类型 1(数据类型的种类 在VHDL语言中,信号、变量、常数都是需要指定数据类型的,VHDL提供的数据类型可归纳如下: 整数 实数 标量类型 枚举 物理 复合类型 数组 寻址类型 数据类型 记录 子类型 文件类型 在上述数据类型中,有标准的,也有用户自己定义的。当用户自己定义时,其具体的格式如下: TYPE 数据类型名 数据类型的定义; 下面对常用的几种数据类型作一些说明。 , 整型(INTEGER) VHDL中的整型与数学中的整形定义相似,可以使用加、减、乘、除等运算符。整数的最小范围从-2147483647到+2147483647,即32位有符号的二进制数。 , 实数(REAL) 实数即浮点数,有正有负,书写时一定要有小数点。实数的最小范围从-1.0E+38到+1.0E+38。 , 记录(RECORD) 记录是异构复合类型,也就是说,记录中的元素可以是不同的类型。记录类型的格式如下: TYPE 记录名 IS RECORD ---记录中元素的类型说明; END RECORD 一个具体的实例如下: TYPE month_name(Jan, Feb, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); TYPE date IS RECORD day : integer range 0 to 31; month : month_name; year : Integer range 0 to 3000; END RECORD; , 数组(ARRAY) 数组用于定义同一类型值的集合。数组可以是一维的(有一个下标),也可以是多维的(有多个下标)。此外,数组还可分为限定性数组和非限定想数组,限定性数组下标的取值范围在该数组类型定义时就被确定;而非限定性数组下标的取值范围随后才确定。其具体格式如下: TYPE 数据类型名 IS ARRAY 范围 OF 原数据类型; 举例如下: TYPE word IS ARRAY (1 TO 8) OF STD_LOGIC; “STD_LOGIC_VECTOR”也属于数组,因它在程序包“STD_LOGIC_1164”中被定义成数组。 , 子类型 所谓子类型是用户对定义的数据类型作一些范围限制而形成的一种新的数据类型。子类型定义的一般格式为: SUBTYPE 子类型名 IS 数据类型名 [范围]; 子类型可以是对其父类型施加限制条件,也可以是简单地对其父类型重新起个名字,而没有增加任何新的意义。 2( 数据类型的转换 在VHDL语言中,数据类型的定义是相当严格的,不同类型数据是不能进行运算和直接赋值的。为了实现正确的运算和赋值操作,必须将数据进行类型转换。数据类型的转换是由转换函数完成的,VHDL的标准程序包提供了一些常用的转换函数,如: , FUNCTION TO_bit (s : std_ulogicl; xmap : BIT :=?0?) RETURN BIT; , FUNCTION TO_bit_vector ( s : std_logic_vector; xmap : BIT :=?0? ) RETURN BIT_VECTOR; 等函数。 2(4(3 VHDL语言的运算操作符 如同别的程序设计语言一样,VHDL中的表达式是由运算符将基本元素连接起来的式子。VHDL的运算符可分为4组: 算数运算符、关系运算符、逻辑运算符和其他运算符以及它们的优先级别如下表所示: 表2-2 VHDL的运算符及优先级别 优先级顺序 运算符类型 运 算 符 功 能 AND 与 低 逻 OR 或 辑 NAND 与非 运 NOR 或非 算 XOR 异或 符 XNOR 异或非 = 等于 /= 不等于 < 小于 > 大于 <= 小于等于 >= 大于等于 + 加 关 ― 减 系 & 连接 运 + 正 算 ― 负 符 * 乘 / 除 MOD 求模 REM 取余 * * 指数 ABS 取绝对值 高 NOT 取反 通常,在一个表达式中有两个以上的算符时,需要使用括号将这些操作分组。如果一串操作的算符相同,且是AND、OR、XOR这三个算符中的一种,则不需要使用括号,如果一串操作中的算符不同或有除这三种算符之外的算符,则必须使用括号。如: a AND b AND c AND d (a OR b) NAND c 关系运算符=、/=、<、<=和>=的两边类型必须相同,因为只有相同的数据类型才能比较,其比较的结果为BOOLEAN型。 正(+)负(-)号和加减号的意义与一般算术运算相同。连接运算符用于一维数组,“&”符号右边的内容连接之后形成一个新的数组,也可以在数组后面连接一个新的元素,或将两个单元素连接形成数组。连接操作常用于字符串。 乘除运算符用于整形、浮点数与物理类型。取模、取余只能用于整数类型。 取绝对值运算用于任何数值类型。乘方运算的左边可以是整数或浮点数,但右边必须为整数,且只有在左边为浮点时,其右边才可以为负数。 2(4(4 VHDL语言的主要描述语句 在用VHDL语言描述系统的硬件行为时,按语句执行的顺序可分为顺序语句和并行语句。顺序语句主要用来实现模型的算法部分;而并行语句则基本上用来表示黑盒的连接关系。黑盒中所包含的内容可以是算法描述或一些相互连接的黑盒。 一( 顺序语句 VHDL提供了一系列丰富的顺序语句,用来定义进程、过程或函数的行为。所谓“顺序”,意味着完全按照程序中出现的顺序执行各条语句,而且还意味着在结构层次中前面语句的执行结果可能直接影响后面语句的结果。顺序语句包括: , WAIT语句 , 变量赋值语句 , 信号赋值语句 , IF语句 , CASE语句 , LOOP语句 , NEXT语句 , EXIT语句 , RETURN语句 , NULL语句 , 过程调用语句 , 断言语句 , REPORT语句 下面逐个介绍其中常用的一些语句: 1. 等待(WAIT)语句 进程在运行中总是处于两种状态之一:执行或挂起。当进程执行到WAIT语句时,就将被挂起来,并设置好再执行的条件。WAIT语句可以设置四种不同的条件:无限等待、时间到、条件满足以及敏感信号量变化。这几类条件可以混用。 语句格式如下: (1)WAIT; (2)WAIT ON 信号; (3)WAIT UNTIL 条件表达式; (4)WAIT FOR 时间表达式; 第1种格式为无限等待,通常不用; 第2种当指定的信号发生变化时,进程结束挂起状态,继续执行; 第3种当条件表达式的值为TRUE时,进程才被启动; 第4种当等待的时间到时,进程结束挂起状态。 ,( 断言(ASSERT)语句 ASSERT语句主要用于程序仿真、调试中的人-机对话,它可以给出一串文字作为警告和错误信息。ASSERT语句的格式如下: ASSERT 条件 [REPORT 输出信息] [SEVERITY级别] 当执行ASSERT语句时,会对条件进行判断。如果条件为“真”,则执行下一条语句;若条件为“假”,则输出错误信息和错误严重程度的级别。 3(信号赋值语句 信号赋值语句的格式如下: 信号量 <= 信号量表达式 如: a<= b AFTER 5 ns; 信号赋值语句指定延迟类型,并在后面指定延迟时间。但VHDL综合器忽略延迟特性。 4(变量赋值语句 在VHDL中,变量的说明和赋值限定在进程、函数和过程中。变量赋值符号为“:= ”,同时,符号“ := ”也可用来给变量、信号、常量和文件等对象赋初值。其书写格式为: 变量:= 表达式; 例如: a := 2; d := d+e; 5( IF语句 IF语句的一般格式如下: IF 条件 THEN 顺序处理语句; {ELSIF 条件 THEN 顺序处理语句; ? ELSIF 条件 THEN 顺序处理语句;} ELSE 顺序处理语句; END IF; 花扩号内的嵌套语句可有可无,视具体情况而定。在IF语句中,当所设置的条件满足时,则 执行该条件后面的顺序处理语句;若所有的条件均不满足时,则执行ELSE和END IF之间的顺序 处理语句。 [例2-5] 四选一电路的条件描述语句: IF(sel=“00”) THEN y<=input(0); ELSIF(sel=”01”) THEN y<=input(1); ELSIF(sel=”10”) THEN y<=input(2); ELSE y<=input(3); END IF; 6( CASE语句 CASE语句用来描述总线或编码、译码的行为,从许多不同语句的序列中选择其中之一执行。 虽然IF语句也有类似的功能,但CASE语句的可读性比IF语句要强得多,程序的阅读者很容易找 出条件和动作的对应关系。 CASE语句的一般格式如下: CASE 表达式 IS WHEN 表达式值 ,, 顺序语句; WHEN OTHERS ,, 顺序语句; END CASE; 当CASE和IS之间的表达式满足指定的值时,程序将执行后面所跟的顺序语句。例如: TYPE enum IS (pick_a, pick_b, pick_c, pick_d); SIGNAL value:enum; SIGNAL a, b, c, d, z:BIT; CASE value IS WHEN pick_a => z<= a; WHEN pick_b => z<= b; WHEN pick_c => z<= c; WHEN pick_d => z<= d; END CASE; 7. LOOP语句 LOOP语句与其他高级语言中的循环语句一样,使程序能进行有 规则 编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf 的循环,循环的次数受迭 代算法的控制。一般格式有两种: (1) FOR循环变量 [标号]:FOR 循环变量 IN 离散范围 LOOP 顺序语句; END LOOP [标号]; 例如: VARIABLE a, b :BIT_VECTOR( 1 TO 3 ); FOR i IN 1 TO 3 LOOP a(i)<= b(i); END LOOP; 上面循环语句的等价语句如下: A(1)<= B(1); A(2)<= B(2); A(3)<= B(3); (2) WHILE条件循环 这种LOOP语句的书写格式如下: [标号]:WHILE 条件 LOOP 顺序语句; END [标号]; 当条件为真时,则进行循环;当条件为假时,则结束循环。 8. NEXT 语句 在LOOP语句中,NEXT语句用来跳出本次循环。其语句格式为: NEXT [标号] [WHEN 条件]; 当NEXT语句执行时将停止本次迭代,转入下一次新的迭代。NEXT后面的标号表明下次迭代 的起始位置,而WHEN条件则表明NEXT语句执行的条件。如果NEXT后面既无标号而无WHEN 条件说明,则执行到该语句接立即无条件地跳出本次循环,从LOOP语句的起始位置进入下次循 环。 例如: SIGNAL a,b,copy_enable:BIT_VECTOR( 1 TO 3 ); ... a<= “ 00000000”; ... ——b被赋了一个值,如“11010011” ... FOR i IN 1 TO 8 LOOP NEXT WHEN copy_enableE(i) =?0?; a(i)<= b(i); END LOOP; 9. EXIT 语句 EXIT语句也是LOOP语句中使用的循环控制语句,与NEXT不同的是,执行EXIT语句将结 束循环状态,从而结束LOOP语句的正常执行。其格式如下: EXIT [标号] [WHEN 条件]; 若EXIT后面的标号和WHEN条件缺省,则程序执行到该语句时就无条件从LOOP语句中跳 出,结束循环状态。若WHEN中的条件为“假”,则循环正常继续。 例如: SIGNAL a,b: BIT_VECTOR(1 DOWNTO 0); SIGNAL a_less_than_b: BOOLEAN; ... a_less_than_b <= FALSE; FOR i IN 1 DOWNTO 0 LOOP IF (a(i) =?1? AND b(i) =?0?) THEN a_less_than_b <= FALSE; EXIT; ELSIF(a(i) =?0? AND B(i) =?1?) THEN a_less_than_b <= TRUE; EXIT; ELSE NULL; ——继续比较 END IF; END LOOP; 10(NULL语句 NULL语句表示没有动作发生。NULL语句一般用在CASE语句中以便能够覆盖所有可能的条件。 二( 并行语句 由于硬件语言所描述的实际系统,其许多操作是并行的,所以在对系统进行仿真时,系统中的元件应该是并行工作的。并行语句就是用来描述这种行为的。并行描述可以是结构性的也可以是行为性的。而且,并行语句的书写次序并不代表其执行的顺序,信号在并行语句之间的传递,就犹如连线在电路原理图中元件之间的连接。主要的并行语句有以下几种: , 块(BLOCK)语句 , 进程(PROCESS)语句 , 生成(GENERATE)语句 , 器件(COMPONENT)和器件例化(COMPONENT_INSTANT)语句 (1) 块(BLOCK)语句 块(BLOCK)可以看作是结构体中的子模块。BLOCK语句把许多并行语句包装在一起形成一个子模块,常用于结构体的结构化描述。块语句的格式如下: 标号:BLOCK 块头 { 说明部分 } BEGIN { 并行语句 } END BLOCK 标号; 块头主要用于信号的映射及参数的定义,通常通过GENETIC语句、GENETIC_MAP语句、PORT和PORT_MAP语句来实现。 说明部分与结构体中的说明是一样的,主要对该块所要用到的对象加以说明。 (2)进程(PROCESS)语句 VHDL模型的最基本的表示方法是并行执行的进程语句,它定义了单独一组在整个模拟期间连续执行的顺序语句。一个进程可以被看作一个无限循环,在模拟期间,当进程的最后一个语句执行完毕之后,又从该进程的第一个语句开始执行。在进程中的顺序语句执行期间,若敏感信号量未变化或未遇到WAIT语句,模拟时钟是不会前进的。 在一个结构中的所有进程可以同时并行执行,它们之间通过信号或共享变量进行通信。这种表示方法允许以很高的抽象级别建立模型,并允许模型之间存在复杂的信号流。 进程语句的格式如下: [进程标号:] PROCESS (敏感信号表) [IS] [ 说明区 ] BEGIN 顺序语句 END PROCESS [进程标号]; 上述格式中,中扩号内的内容可有可无,视具体情况而定。进程语句的说明区中可以说明数据类型、子程序和变量。在此说明区内说明的变量,只有在此进程内才可以对其进行存取。 如果进程语句中含有敏感信号表,则等价于该进程语句内的最后一个语句是一个隐含的WAIT语句,其形式如下: WAIT ON 敏感信号表; 一旦敏感信号发生变化,就可以再次启动进程。必须注意的是,含有敏感信号表的进程语句中不允许再显式出现WAIT语句。 [ 例2-6 ] 由时序逻辑电路构成的模10计数器 ENTITY counter IS PORT( clear: IN BIT; clock: IN BIT; count: BUFFER INTEGER RANGE 0 TO 9); END counter; ARCHITECTURE example OF counter IS BEGIN PROCESS BEGIN WAIT UNTIL (clock?event and clock=?1?); IF(clear =‘1’ OR count >= 9) THEN count <= 0; ELSE count <= count+1; END IF; END PROCESS; END example; 上面例子展示了将计数器用时序逻辑进程来实现。在每一个01的时钟边沿,如果clear为‘1’或count为9时,count被置为零;否则,count增加1。通常,综合器采用4个D触发器及附加电路来实现本例。 (3)生成(Generate)语句 生成语句给设计中的循环部分或条件部分的建立提供了一种方法。生成语句有如下量种格式: , 标号:FOR 变量 IN 不连续区间 GENERATE 并行处理语句 END GENERATE [标号]; , 标号:IF 条件 GENERATE 并行处理语句 END GENERATE [标号]; 生成方案FOR用于描述重复模式;生成方案IF通常用于描述一个结构中的例外情形,例如在边界处发生的特殊情况。 FOR ...GENERATE 和FOR...LOOP的语句不同,在FOR ...GENERATE语句中所列举的是并行处理语句。因此,内部语句不是按书写顺序执行的,而是并行执行的,这样的语句中就不能使用EXIT语句和NEXT语句。 IF ...GENERATE语句在条件为“真”时执行内部的语句,语句同样是并行处理的。与IF语句不同的是该语句没有ELSE项。 该语句的典型应用场合是生成存储器阵列和寄存器阵列等,还可以用于地址状态编译机。 例如: SIGNAL a,b:BIT_VECTOR( 3 DOWN TO 0 ); SIGNAL c :BIT_VECTOR( 7 DOWN TO 0 ); SIGNAL x :BIT; ... GEN_LABEL : FOR i IN 3 DOWNTO 0 GENERATE c( 2 * i + 1) < = a(i) NOR x; c( 2 * i ) < = b(i) NOR x; END GENERATE GEN_LABEL; (3) 元件(COMPONENT)和元件例化(COMPONENT_INSTANT)语句 COMPONENT语句一般在ARCHITECTURE、PACKAGE及BLOCK的说明部分中使用,主要用来指定本结构体中所调用的元件是哪一个现成的逻辑描述模块。COMPONENT语句的基本格式如下: COMPONENT 元件名 GENERIC说明; --参数说明 PORT说明; --端口说明 END COMPONENT; 在上述格式中,GENTRIC通常用于该元件的可变参数的代入或赋值;PORT则说明该元件的输入输出端口的信号规定。 COMPONENT_INSTANT语句是结构化描述中不可缺少的基本语句,它将现成元件的端口信号映射成高层次设计电路中的信号。COMPONENT_INSTANT语句的书写格式为: 标号名:元件名 PORT MAP(信号,„) 标号名在该结构体的说明中应该是唯一的,下一层元件的端口信号和实际信号的连接通过PORT MAP的映射关系来实现。映射的方法有两种:位置映射和名称映射。所谓位置映射,是指在下一层元件端口说明中的信号书写顺序位置和PORT MAP( )中指定的实际信号书写顺序位置一一对应;所谓名称映射是将已经存于库中的现成模块的各端口名称,赋予设计中模块的信号名。 例如: COMPONENT and2 PORT(a,b:IN BIT; c: OUT BIT); END COMPONENT; ... SIGNAL x,y,z: BIT; ... u1:and2 PORT MAP(x,y,z); ,,位置映射 u2:and2 PORT MAP(a=>x,c =>z,b =>y); ,,名称映射 u3:and2 PORT MAP(x,y,c =>z ) ,,混合形式 VHDL语言是一门比较复杂的硬件设计语言,除了本章所述的有关内容外,它还包含许多别的东西,鉴于篇幅有限,在此不再一一罗列,有兴趣者可自行参考有关VHDL语言方面的书籍和资料。 习题: 1. 判断下面的操作是否正确,若不正确,请修正: (1) op1和op2的数据类型是BIT,result是整数,做VHDL程序加法 result<=op1+op2; (2) 模块1的输出a是无符号数,实体2的输入b是实数,能否将两实体如下图相连, 实 实 体 体 1 2 2. 端口BUFFER和INOUT有何不同, 3. 一个VHDL设计程序是否必须有一个结构体,结构体的目的是什么,一个设计可以有多 个结构体吗, 4. 用VHDL语言写出下面符号的实体(ENTITY)描述。其中符号的左边是输入端,右边是 输出端: (1) (2) 5. 下面是一个简单的VHDL描述,请画出其实体(ENTITY)所对应的原理图符号和构造体 (ARCHITECTURE)所对应的电路原理图: ENTITY nand IS PORT( a:IN STD_LOGIC; b:IN STD_LOGIC; c:IN STD_LOGIC; q1:OUT STD_LOGIC; q2:OUT STD_LOGIC); END nand; ARCHITECTURE one OF nand IS BEGIN q1 <= NOT(a AND b); q2 <= NOT(c AND b); END one; 6(由下面的电路原理图,写出相应的VHDL设计程序(内部信号名由自己定义)。 7( 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 下面的VHDL程序,说明电路功能,并绘出电路原理图: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY cnt4b IS PORT( clk: IN STD_LOGIC; clr: IN STD_LOGIC; din: IN INTEGER RANGE 0 TO 15; load: IN STD_LOGIC; dout: OUT INTEGER RANGE 0 TO 15); END cnt4b; ARCHITECTURE one OF cnt4b IS SIGNAL qq: INTEGER RANGE 0 TO 15; BEGIN PROCESS(clk, clr, din, load) BEGIN IF(clr=?1?) THEN qq<=0; ELSIF(clk?event AND clk=?1?) THEN IF(load=?1?) THEN qq<=din; ELSE qq<=qq+1; END IF; END IF; dout<=qq; END PROCESS; END one; 8(利用VHDL语言设计一BCD码显示译码器(显示发光管是共阴极的)。 9( 一8位移位寄存器的器件图如下,并且在时钟的上升沿到来时 (1) 若clear信号有效,则寄存器被复位清零; (2) 若shift_right有效,则寄存器右移一位; (3) 若clear和shift_right均无效,则寄存器并行加载输入的数据date; date clk 8位移位寄存器 clear 右移输入端dir shift- right qout
本文档为【vhdl语言简介】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_686908
暂无简介~
格式:doc
大小:143KB
软件:Word
页数:39
分类:生活休闲
上传时间:2017-10-27
浏览量:13