资源描述
,第二级,第三级,第四级,第五级,第七章,硬件描述语言简介,第七章 硬件描述语言简介,7.1,VHDL,语言简介,7.2,Verilog,HDL,语言简介,7.1,VHDL,语言简介,7.1.1,VHDL,概述,1.,VHDL,的发展史,VHDL,是美国国防部在20世纪70年代末80年代初提出的,VHSIC(Very High Speed Integrated Circuit),计划的产物,1981年提出了一种新的硬件描述语言,称为,VHSIC Hardware,Description Language,也就是我们熟知的,VHDL。,2.采用,VHDL,语言的硬件电路设计方法,VHDL,设计数字系统一般采用自上而下(,Top Down),的分层设计方法。所谓自上而下的设计方法,就是从系统总体出发,自上而下地逐步将设计内容细化,最后完成系统硬件的整体设计。,(1)第一层行为描述,就是对整个系统的数学模型进行描述。,(2)第二层,RTL,方式描述,即寄存器传输描述,也称为数据流描述。,(3)第三层逻辑综合,就是利用逻辑综合工具,将,RTL,方式描述的程序转换成用基本元件表示的文件(门级网表)。,3.采用,VHDL,语言设计硬件电路的优点,与其它,HDL,语言相比,,VHDL,语言具有以下优点:,(1)设计技术齐全,方法灵活,支持广泛。,(2)系统硬件描述能力强,能支持硬件的设计、验证、综合和测试,是一种多层次的硬件描述语言。,(3),VHDL,语言编程可以与工艺无关。,(4),VHDL,语言标准、规范,易于共享和重复利用。,4.,VHDL,语言的词法规则、标识符及保留字,在编写,VHDL,语言程序时,必须遵循,VHDL,语言的词法规则。,VHDL,语言中有一些保留字,这些保留字不能用作信号名或实体名。,1)词法规则,(1)注释。为了提高,VHDL,语言源程序的可读性,在,VHDL,中可以写入注释。,(2)数字。数字型文字可以有多种表示方式:可以是十进制数,也可以表示为以二进制,、八进制或十六进制等为基的数;可以是整数,也可以是含有小数点的浮点数。,(3)字符和字符串。字符是用单引号引起来的,ASCII,字符,可以是数值,也可以是符号或字母,如0,,E,A,等。,(4)下标名和段名。,下标名用于指示数组型变量或信号的某一元素。下标段名则表示数组型变量或信号的某一段元素。,2)标识符,标识符是最常用的操作符,可以是常数、变量、信号、子程序或参数的名字。,VHDL93,对,VHDL87,版本的标识符语法规则进行了扩展,通常称,VHDL87,版本标识符为短标识符,,VHDL93,版本标识符为扩展标识符。,(1)短标识符。,(2)扩展标识符。,(3),VHDL,语言的保留字。,7.1.2,VHDL,语言程序的基本结构,一个完整的,VHDL,语言程序通常包含实体(,Entity)、,构造体(,Architecture)、,配置(,Configuration)、,包集合(,Package),和库(,Library),五部分。,1.,VHDL,语言设计的基本单元及其构成,VHDL,语言设计的基本设计单元(,Design Entity),是,VHDL,中最基本的硬件抽象概念(,abstrac,tion),,它表示一个具有确定的输入输出并完成确定功能的硬件设计部分。,1)实体说明,实体说明定义了一个给定的设计单元及该设计单元与周围的接口,它具有如下结构:,ENTITY,实体名,IS,类属参数说明,端口说明,END,实体名;,(1)类属参数说明。,类属参数说明是实体说明中的可选项,必须放在端口说明之前,用于指定参数。,其书写格式为,GENERIC CONSTANT,名字表:,IN,子类型标志:=静态表达式,;,(2)端口说明。,端口说明是对基本设计实体与外部接口的描述,也可以说是对外部引脚信号的名称、数据类型和输入输出方向的描述,其一般书写格式为,PORT(,端口名,端口名:方向 数据类型;,端口名,端口名:方向 数据类型);,端口名是赋予每个外部引脚的名称,通常用一个或几个英文字母或者用英文字母加数字来命名,如,D0,CLK;,端口方向用来定义外部引脚的信号方向是输入还是输出,表示方向的说明符及含义如表 7-1 所示;,在,VHDL,中有许多数据类型,但逻辑电路设计中最常用的数据类型为,STD-LOGIC,和,STD-LOGIC-VECTOR。,表7-1 端口方向说明,2)构造体,构造体是一个基本设计单元的实体,它确定基本设计单元的输入输出关系,即它定义了设计单元的具体功能。,构造体可用3种方式来描述基本设计单元的输入输出关系,即行为描述、寄存器传输描,述和结构描述。,由于构造体是对实体功能的具体描述,因此它一定要跟在实体的后面。一个构造体的书写格式如下:,ARCHITECTURE,构造体名,OF,实体名,IS,定义语句 内部信号,常数,数据类型,函数等的定义,BEGIN,并行处理语句,END,构造体名;,(1)构造体名称的命名。,构造体的名称可以由设计者自由命名。,(2)定义语句。,定义语句是构造体的说明部分,位于,ARCHITECTURE,和,BEGIN,之间,用于对构造体内所用的信号、常数、数据类型和函数进行定义。,(3)并行处理语句。,并行处理语句是构造体的语句部分,位于,BEGIN,和,END,之间,这些语句具体描述构造体,的行为及连接关系。,下面仍以异步复位的,D,触发器为例来说明构造体的描述方法:,ARCHITECTURE,behav,OF,dff,-,async,-,rst,IS,BENIN,PROCESS(CLK,RESET),BEGIN,IF(RESET=0)then,Q=0;,ELSIF(CLKEVENT AND CLK=1)THEN,Q=D;,ENDIF;,END PROCESS;,END,behav,;,2.,VHDL,语言构造体的子结构描述,在规模较大的电路设计中,全部电路都用惟一的一个模块来描述是非常不方便的。为此,电路,设计者通常将整个电路分成若干个相对独立的模块来描述。,1),BLOCK,语句结构描述,(1),BLOCK,语句的结构。采用,BLOCK,语句描述局部电路的书写格式如下:,块结构名:,BLOCK,BEGIN,(,并发语句),END BLOCK,块结构名;,(2),BLOCK,块和子电路原理图的关系。构造体可以由多个,BLOCK,块组成,每一个,BLOCK,块对应一个子电路。如:,ARCHITECTURE,BLOCK1:BLOCK,BLOCK2:,BLOCK3:,(3),BLOCK,中语句的并发性。,BLOCK,中的语句是并行执行的,与书写顺序无关。,(4)卫式,BLOCK,语句(,Guarded BLOCK)。,卫式,BLOCK,语句的书写格式为:,块结构名:,BLOCK,卫式布尔表达式,BEGIN,(,并发语句),END BLOCK,块结构名;,2),PROCESS(,进程)语句结构描述,(1),PROCESS,语句的结构。采用,PROCESS,语句描述电路结构的书写格式如下:,进程名:,PROCESS(,信号1,信号2,),BEGIN,(,顺序执行语句),END PROCESS;,该语句中,进程名可省略。,(2),PROCESS,语句中的顺序性。,PROCESS,结构中的语句是按顺序一条一条向下执行的。,(3)进程(,PROCESS),的启动。在进程语句中总是带有1个或几个信号量,这些信号量是进程的输入信号,在书写时跟在“,PROCESS”,后面的括号里,在,VHDL,语言中也称其为敏感量。这些信号无论哪一个发生变化都将启动该,PROCESS,语句。,(4)进程(,PROCESS),的同步描述。当构造体中包含多个进程时,进程中的信号变化会使几个进程同步工作。,3)子程序语句结构描述,在,VHDL,语言中子程序有两种类型:过程(,Procedure),和函数(,Function)。,(1),过程(,Procedure),语句。,过程语句的书写格式如下:,PROCEDURE,过程名(参数1;参数2;),IS,定义语句 (变量等的定义),BEGIN,顺序处理语句 (过程的语句),END,过程名;,过程结构中的语句是按顺序执行的。,()函数(,Function),语句。,函数语句的书写格式如下:,FUNCTION,函数名(参数1;参数2;),RETURN,数据类型名,IS,定义语句 (变量等的定义),BEGIN,顺序处理语句,RETURN,返回变量名;,END,函数名;,3.包、库及配置,1)库,库是经编译后的数据的集合,它存放包集合的定义、实体定义、构造体定义和配置定义。,在,VHDL,语言中,通过库的说明语句实现库的调用。库说明语句总是放在设计单元的最前面,这样,在设计实体内的语句就可以使用库中的数据和文件。,库分为5种:,IEEE,库,STD,库,ASIC,矢量库,用户定义的库和,WORK,库。,库在使用前都要先说明,一般采用如下格式:,LIBRARY,库名;,USE LIBRARY-NAME.package-name.ITEM.name;,2)包集合,包集合(,Package),说明像,C,语言中的,include,语句,为使已定义的常数、数据类型、元件调用说明以及子程序能够被更多的,VHDL,设计实体方便地访问和共享,可以将它们收集在一个,包集合中。多个包集合可以并入一个,VHDL,库中,使之适用于更一般的访问和调用范围。,包集合由两部分组成:包集合头(,Header),和包集合体(,Package Body)。,包集合的一般书写格式如下:,PACKAGE,包集合名,IS,说明语句,END,包集合名;,PACKAGE BODY,包集合名,IS,说明语句,END BODY;,要使用包集合必须用,USE,语句说明:,USE IEEE.STD-LOGIC-1164.ALL,常用的预定义包集合有下面3种:,(1),STD-LOGIC-1164,包集合。,这是,IEEE,库中最常用的包集合,是,IEEE,的标准包集合。,(2),STD-LOGIC-ARITH,包集合。,STD-LOGIC-ARITH,预先编译在,IEEE,库中,是,SYNOPSYS,公司的包集合,它在,STD-LOGIC-1164,包集合的基础上扩展了3个数据类型:,UNSIGNED、SIGNED,和,SMALL-INT,,并为其定义了相应的算术运算符和转换函数。,(3),STD-LOGIC-UNSIGNED,和,STD-LOGIC-SIGNED,包集合。这也是,SYNOPSYS,公司的包集合,都预先编译在,IEEE,库中。,3)配置,配置语句描述层与层之间的连接关系以及实体与构造体之间的连接关系。,配置语句的书写格式如下:,CONFIGURATION,配置名,OF,实体名,IS,说明语句,END,配置名;,7.1.3,VHDL,语言的数据类型及运算操作符,和其它高级语言一样,,VHDL,语言具有多种数据类型和运算操作符,其中有一些是,VHDL,语言独有的数据类型和运算操作符。,1.,VHDL,语言的客体及其分类,VHDL,语言中,凡是可以赋予一个值的对象就称为客体(,Object)。,客体主要包括以下三种:信号(,Signal)、,变量(,Variable),和常数(,Constant)。,在,VHDL93,中,文件也是对象。,VHDL,语言中的变量和常量与计算机高级语言中的变量和常量类似,但是信号则体现了硬件描述语言的特点,。,1)常数,常数说明就是对某一常数赋予一个固定值。其格式为,CONSTANT,常数名:数据类型:=表达式;,例如:,CONSTANT VCC:REAL:=5.0;,常数是一个恒定不变的量,一旦被赋值就不能再改变。另外,,VHDL,要求所定义的常量数,据类型必须与表达式的数据类型一致。,2)变量,变量只能在进程和子程序中使用,是一个局部量,不能将信息带出所定义的当前设计单元。,与信号不同,变量的赋值是理想化数据传输,其赋值是立即生效的,不存在任何延迟。变量定义语句的格式为,VARIABLE,变量名:数据类型 约束条件:=初始值;,3)信号,信号是电路内部硬件连接的抽象。它可以作为设计实体中的并行语句模块间交换信息的通道。信号定义语句的格式为,SIGNAL,信号名:数据类型 约束条件:=表达式;,4)信号与变量的区别,信号和变量是,VHDL,中的重要客体,它们之间的主要区别有:,(1)信号赋值至少有,延时,而变量赋值没有延时。,(2)信号除当前值外有许多相关信息,如历史信息,而变量只有当前值。,(3)进程对信号敏感而不对变量敏感。,(4)信号可以是多个进程的全局信号。,2.,VHDL,语言的数据类型,在对,VHDL,的客体进行定义时,都要指定其数据类型。为此,,VHDL,语言提供了多种标准的数据类型,并且允许用户自定义数据类型。,1)标准的数据类型,标准的数据类型共有10种。,(1)整数(,INTERGER)。,整数与数学中的整数定义相同,可以使用预定义的运算操作符,如“+”、“-”、,“*”、“/”等进行算术运算。,(2)自然数(,NATURAL),和正整数(,POSITIVE)。,这两类数据是整数的子类,自然数类数据只能取0和正整数,而正整数类数据只能取正整数。,(3)实数(,REAL)。,在进行算法研究或实验时,常采用实数作为对硬件方案的抽象手段。,(4)位(,BIT)。,位数据类型也属于枚举型,取值只能是“1”和“0”。,(5)位矢量(,BIT-VECTOR)。,位矢量是使用双引号括起来的一组位数据,如“1011”。,(6)布尔量。,定义布尔量的源代码为,TYPE BOOLEAN IS(FALSE,TRUE);,布尔量不能进行算术运算,可进行关系运算。,(7)字符(,CHARACTER)。,字符类型通常用单引号括起来,如,X。,字符类型区分大小写,如,A,与,a,是不同的。,(8)字符串。,字符串是由双引号括起来的一个字符系列,也称为字符串数组。它常用于程序的提示和说明。,(9)时间。,时间是,VHDL,中惟一的预定义物理量。,(10)错误等级。,在,VHDL,仿真器中,错误等级类型数据用来表征系统的状态,它共有4种:,NOTE(,注意),,WARNING(,警告),,ERROR(,出错),,FAILURE(,失败)。在系统仿真过程中可以用这4种状态来提示系统当前的工作情况。,2)用户自定义数据类型,可以由用户定义的数据类型有:,枚举类型、整数类型、数组类型、存取类型、文件类型、时间类型、实数类型。,用户用,TYPE,语句定义自己的数据类型。,TYPE,语句的格式为,TYPE,数据类型名,IS,数据类型定义,OF,基本数据类型;,3),IEEE,预定义标准,(1)标准化数据类型。,IEEE93,增加了多值逻辑包,STD-LOGIC-1164,,使得“,STD-LOGIC”,数据具有9种不同的值。其定义如下:,TYPE STD-LOGIC IS(,U,-,初始值,X,-,不定,0,-0,1,-1,Z,-,高阻,W,-,弱信号不定,L,-,弱信号0,H,-,弱信号1,-不可能情况,);,“,STD-LOGIC”,和“,STD-LOGIC-VECTOR”,是,IEEE,新制定的标准化数据类型,将它们归属到用户定义的数据类型中。当使用该类型数据时,应加上库说明语句和使用包集合说明语句:,LIBRARY IEEE;,USE IEEE.STD-LOGIC-1164.ALL;,(2)其它预定义标准数据类型。,VHDL,综合工具配带的扩展程序包中定义了一些有用的数据类型,如无符号数据类型,UNSIGNED、,有符号数据类型,SIGNED、,小整形,SMALL-INT。,在包集合,STD-LOGIC-ARITH,中定义了有符号数据类型和无符号数据类型。,4)数据类型转换,在,VHDL,语言中,不同数据类型的对象之间是不能进行运算和直接代入的。为了实现正确的,代入操作,必须将要代入的数据进行类型转换。,类型转换可用转换函数实现,转换函数通常,由,VHDL,语言的包集合提供。,例如,在,STD-LOGIC-1164、STD-LOGIC-ARITH、STD-LOGIC-UNSIGNED,包集合中就提供了如表 7-2所示的数据类型转换函数。,表 7-2 数据类型转换表,3.,VHDL,语言的运算操作符,与其它程序设计语言相似,,VHDL,语言中的表达式也是由运算符将基本元素连接起来形成的。,VHDL,的运算符可分为4种:算术运算符、关系运算符、逻辑运算符和并置运算(,Concatenation),符。表 7-3 给出了,VHDL,的操作符及优先次序。,表 7-3 操作符的优先级,1)算术运算符,VHDL,语言有10种算术运算符,分别是:+,-,*,/,,MOD,REM,+(,正),-(负),*,*,,ABS。,2),逻辑运算符,VHDL,语言有6种逻辑运算符,分别为:,AND,OR,NAND,NOR,XOR,和,NOT,。,3),关系运算符,VHDL,语言有6种关系运算符,分别是:=,/=,=。,4)并置运算符,并置运算符“&”用于位的连接。例如,将4个位用并置运算符连接起来就可以构成一个具有4位长度的位矢量。,下面以加法器为例说明并置运算符的用法:,LIBRARY IEEE;,USE IEEE.STD-LOGIC-1164.ALL;,USE IEEE.STD-LOGIC-ARITH.ALL;,USE IEEE.STD-LOGIC-UNSIGNED.ALL;,ENTITY addition IS,PORT (A,B:IN STD-LOGIC-VECTOR,(3 DOWNTO 0);,Q1:OUT STD-LOGIC-VECTOR(4 DOWNTO 0);END addition;,ARCHITECTURE,behav,OF addition IS,BEGIN,PROCESS (A,B),BEGIN,Q1 BB1,B=BB2,Y=BB3);,下面以4,bit,伪随机序列产生器为例来说明结构描述的使用。其电路如图 7-1 所示。,图 7-1 4,bit,伪随机序列产生器,该伪随机序列产生器的,VHDL,语言结构描述如下:,LIBRARY A40MX;,USE A40MX.ALL;,LIBRARY IEEE;,USE IEEE.STD-LOGIC-1164.ALL;,USE IEEE.STD-LOGIC-ARITH.ALL;,ENTITY TEST IS,PROT (QOUT:OUT STD-LOGIC;,CLKIN,CLRIN:IN STD-LOGIC);,END TEST;,ARCHITECTURE STRUCTUAL OF TEST IS,COMPONENT DFCIB,PORT (D:IN STD-LOGIC;,CLK:IN STD-LOGIC;,CLR:IN STD-LOGIC;,Q :OUT STD-LOGIC);,END COMPONENT;,COMPONENT XNOR2,PRORT(A:IN STD-LOGIC;,B:IN STD-LOGIC;,Y:OUT STD-LOGIC);,END COMPONENT;,SIGNAL Q1:STD-LOGIC;,SIGNAL Q2:STD-LOGIC;,SIGNAL Q3:STD-LOGIC;,SIGNAL Q4:STD-LOGIC;,SIGNAL Y1:STD-LOGIC;,BENIG,QOUT=Q4;,U1:DFC1B PORT MAP (Y1,CLKIN,CLRIN,Q1);,U2:DFC1B PORT MAP (Q1,CLKIN,CLRIN,Q2);,U3:DFC1B PORT MAP (Q2,CLKIN,CLRIN,Q3);,U4:DFC1B PORT MAP (Q3,CLKIN,CLRIN,Q4);,U5:XNOR2 PORT MAP (Q3,Q4,Y1);,END STRUCTURE;,7.1.5,VHDL,语言的主要描述语句,在,VHDL,语言中,按描述语句的执行顺序对其分类,可将,VHDL,语句分为顺序执行语句和并发语句。并发语句在结构体中的执行顺序是同时并发执行的,其执行顺序与书写次序无关,而顺序执行语句的执行顺序是按照语句的书写次序执行的。,1.顺序(,Sequential),描述语句,顺序语句是指完全按照程序书写的顺序执行的语句,并且在结构层次中前面语句的执行结果,会直接影响后面各语句的执行结果。,VHDL,顺序语句主要包括,WAIT,语句、信号代入语句、变量赋值语句、,IF,语句、,CASE,语句、,LOOP,语句、,NEXT,语句、,EXIT,语句、,RETURN,语句、过程调用语句、断言语,句以及,NULL,语句。,空(,NULL),语句表示只占位置的一种空处理操作。它的惟一功能就是使程序执行下一个语句。,NULL,常用于,CASE,语句中,利用,NULL,来表示所余的不用条件下的操作行为,以满足,CASE,语句对条件值全部列举的要求。,1),WAIT,语句,WAIT,语句在进程中起到与敏感信号一样重要的作用,敏感信号触发进程的执行,,WAIT,语句同步进程的执行,同步条件由,WAIT,语句指明。进程在仿真运行中处于执行或挂起两种状态之一。当进程执行到,WAIT,语句时,就将被挂起并设置好再次执行的条件。,WAIT,语句可以设置4,种不同的条件:无限等待,时间到,条件满足以及敏感信号变化。它们的书写格式如下:,WAIT,无限等待;,WAIT ON,敏感信号量变化;,WAIT UNTIL,条件满足;,WAIT FOR,时间到。,通常只有,WAIT UNTIL,格式的等待语句可以被,VHDL,综合器综合。,WAIT UNTIL,语句的书写格式为,WAIT UNTIL,表达式;,WAIT UNTIL,语句后面跟的是布尔表达式,在布尔表达式中隐式地建立一个敏感信号量表,当表中的任何一个信号量发生变化时,就立即对表达式进行一次评测,如果表达式结果为真,则进程脱离挂起状态,继续执行下面语句。,WAIT UNTIL,语句有以下三种表达方式:,WAIT UNTIL,信号=,VALUE;,WAIT UNTIL,信号,EVENT AND,信号=,VALUE;,WAIT UNTIL NOT,信号,STABLE AND,信号=,VALUE;,进程中使用,WAIT,语句应满足以下两个条件:,(1)进程中不能既有敏感量表又有,WAIT,语句。,(2),WAIT,语句要么是进程的第一个语句,要么是进程的最后一个语句。,下面以,D,触发器为例来说明,WAIT,语句的用法:,ENTITY,dff,IS,PORT (D,CLK,RESET:IN STD-LOGIC;,Q:OUT STD-LOGIC);,END,dff,;,ARCHITECTURE wait-statement OF,dff,IS,BEGIN,PROCESS ,注意进程无敏感量表,BEGIN,进程在此等待直至条件满足,WAIT UNTIL rising-edge(CLK);,Q=D;,END PROCESS;,END wait-statement;,2)信号代入语句,信号代入语句的书写格式为,目的信号量=信号表达式;,注意:=两边的信号量的类型和位长度应该一致。,3)变量赋值语句,变量赋值语句的书写格式为,目的变量:=表达式;,该语句表明,目的变量的值将由表达式的新值替代,但两者的类型必须相同。,书写变量赋值语句应注意以下几点:,(1),VHDL,中变量赋值限定在进程、函数和过程等顺序区域内。,(2)变量赋值无时间特性。,(3)变量具有局部性。,4),IF,语句,IF,语句根据指定的条件来确定执行哪些语句,按其书写格式,通常可分为三种类型。,(1)门闩控制语句。门闩控制语句的书写格式为,IF,条件,THEN,顺序处理语句;,END IF;,其中,条件为布尔量,即“真”或“假”。当条件为“真”时,执行顺序处理语句;否则,执行,IF,的后继语句。,(2)二选择控制语句。,当,IF,语句用作二选择控制时的书写格式为,IF,条件,THEN,顺序处理语句;,ELSE,顺序处理语句;,END IF;,(3)多选择控制的,IF,语句。,多选择控制的,IF,语句又称为,IF,语句的嵌套,其书写格式为,IF,条件,THEN,顺序处理语句;,ELSIF,条件,THEN,顺序处理语句;,ELSIF,条件,THEN,顺序处理语句;,ELSE,顺序处理语句;,END IF;,下面以4,bit,计数器为例说明,IF,语句的用法:,LIBRARY IEEE;,USE IEEE.STD-LOGIC-1164.ALL;,USE IEEE.STD-LOGIC-UNSIGNED.ALL;,ENTITY counter4 IS,PORT (CLK,RESETN,LOAD,ENABLE:IN,STD-LOGIC;,CNT-IN:IN STD-LOGIC-VECTOR(3 DOWNTO 0);,COUNT:OUT STD-LOGIC-VECTOR(3 DOWNTO 0);,END counter4;,ARCHITECTURE,rtl,OF counter4 IS,SIGNAL TEMP-COUNT:STD-LOGIC-VECTOR(3 DOWNTO 0);,BEGIN,COUN-PROC:PROCESS (CLK,RESETN),BEGIN,IF (ZK(RESETN=0)THEN,TEMP-COUNT 0);,ELSIF RISING-EDGE(CLK)THEN,IF (LOAD=1)THEN,TEMP-COUNT=CNT-IN;,ELSIF (ENABLE=1)THEN,TEMP-CONT=TEMP-COUNT+1;,END IF;,END IF;,END PROCESS;,COUNT 顺序处理语句;,END CASE;,上述,CASE,语句中的条件表达式可选如下4种不同的表示形式:,WHEN,值=顺序处理语句;-某个值,WHEN,值|值|值|值=顺序处理语句 -多个值“或”,WHEN,值,TO,值=顺序处理语句;-取值范围,WHEN OTHERS=,顺序处理语句;-其它所有值,当,CASE,和,IS,之间的表达式的值满足指定的条件表达式的值时,程序将执行由符号=所指的顺序处理语句。,下面以4选1多路选择器为例说明,CASE,语句的用法。,4:1,Multiplexor,Using A Case Statement,LIBRARY IEEE;,USE IEEE.STD-LOGIC-1164.ALL;,ENTITY,mux,IS,PORT (C,D,E,F:IN STD-LOGIC;,S :IN STD-LOGIC-VECTOR(1,DOWNTO 0);,MUXOUT:OUT STD-LOGIC);,END,mux,;,ARCHITECTURE my-,mux,OF,mux,IS,BGEGIN,PROCESS (S,C,D,E,F),BEGIN,CASE S IS,WHEN 00=MUXOUT MUXOUT MUXOUT MUXOUT=F;,END CASE;,END PROCESS;,END my-,mux,;,6),LOOP,语句,LOOP,语句就是循环语句,它可以使包含的一组顺序语句被循环执行,其执行次数受迭代算法控制。,(1)单个,LOOP,语句。,单个,LOOP,语句的书写格式为,标号:,LOOP,顺序语句,END LOOP,标号;,(2),FOR LOOP,语句。,FOR LOOP,语句的书写格式为,标号:,FOR,循环变量,IN,离散范围,LOOP,顺序语句,END LOOP,标号;,FOR,后面的循环变量是一个属于,LOOP,语句的局部的临时变量,无须事先定义,即它由,LOOP,语句自动定义,只能作为赋值源,不能被赋值。因此,在,LOOP,语句范围内不能使用其它,与此循环变量同名的标识符。,下面以8,bit,奇偶校验电路为例说明,FOR LOOP,语句的用法:,LIBRARY IEEE;,USE IEEE.std-logic-1164.ALL;,ENTITY parity-check IS,PORT (a:in std-logic-vector(7,DOWNTO 0);,y:out std-logic);,END parity-check;,ARCHITECTURE WHILE-LOOP OF parity-check IS,BEGIN,PROCESS(a),variable,tmp,:std-logic;,BEGIN,tmp,:=0;,for I in 0 to 7 loop,tmp,:=,tmp,XOR a(i);,END LOOP;,y=,tmp,;,END PROCESS;,END,rtl,;,(3),WHILE LOOP,语句。,WHILE LOOP,语句的书写格式为,标号:,WHILE,条件,LOOP,顺序处理语句,END LOOP,标号;,在该,LOOP,语句中,没有给出循环次数的范围,而是给出了循环执行顺序语句的条件;没有自动递增循环变量的功能,所以必须在顺序处理语句中增加一条循环次数计算语句,用于循环控制。循环控制条件为布尔表达式,当条件为“真”时,则进行循环;如果条件为“假”,则结束循环。8,bit,奇偶校验电路也可采用,WHILE LOOP,语句实现:,ARCHITECTURE,rtl,OF parity-check IS,BEGIN,PROCESS (a),variable,tmp,:std-logic;,BEGIN,tmp,:=0;,i:=0;,WHILE(i8)LOOP,tmp,:=,tmp,XOR a(i);,i=i+1;,END LOOP;,y=,tmp,;,END PROCESS;,END,rtl,;,2.并发(,Concurrent),描述语句,并发语句最能体现,VHDL,作为硬件描述语言的特色。,VHDL,语言中并发语句有:,PROCESS,进程语句,CONCURRENT SIGNAL ASSIGNMENT,并发信号代入语句,CONDITIONAL SIGNAL ASSIGNMENT,条件信号代入语句,SELECTIVE SIGNAL ASSIGNMENT,选择信号代入语句,CONCURRENT PROCEDURE CALL,并发过程调用语句,BLOCK,块语句,1)进程语句,进程语句是最主要的并发语句,也是最能体现硬件描述语言特点的一条语句。在一个构造体中,多个进程语句可同时并发运行。,进程语句归纳起来主要有以下几个要点:,(1)它可以与其它进程并发运行,并可存取实体或构造体中定义的信号。,(2)进程语句是并发语句,而进程结构中的语句是顺序语句,是按顺序一条一条执行的。,(3)进程的启动可用敏感量或在进程中包含,WAIT,语句。,(4)进程之间的通信是通过信号传递来实现的。,2)并发信号代入语句,信号代入语句用在并发执行场合就是并发信号代入语句。,3)条件信号代入语句,条件代入语句可根据不同条件将不同的表达式代入信号量,其书写格式为,目的信号量 =表达式1,WHEN,条件1,ELSE,表达式2,WHEN,条件2,ELSE,表达式3,WHEN,条件3,ELSE,表达式,n;,下面以比较相等的比较器为例来说明条件信号代入语句的用法:,LIBRARY IEEE;,USE IEEE.std-logic-1164.ALL;,ENTITY equality IS,PORT (A:in STD-LOGIC-VECTOR(3,downto,0);,B:in STD-LOGIC-VECTOR(3,downto,0);,Q1:out STD-LOGIC;,Q2:out STD-LOGIC,);,END equality;,ARCHITECTURE equality-arch OF equality IS,BEGIN,Q1=1 WHEN A=B ELSE 0;equality,Q2=1 WHEN A/=B ELSE 0;inequality,END equality-arch;,4)选择信号代入语句,选择信号代入语句类似于,CASE,语句,它对表达式进行测试,当表达式取值不同时,将使不同的值代入目的信号量。选择信号代入语句的书写格式为,WITH,表达式,SELECT,目的信号量=表达式1,WHEN,条件1,表达式2,WHEN,条件2,表达式,n WHEN,条件,n,下面以2选1电路为例说明该语句的用法:,LIBRARY IEEE;,USE IEEE.std-logic-1164.all;,ENTITY,mux,IS,PORT (output-signal:out std-logic;,a,b,sel,:in std-logic);,END,mux,;,ARCHITECTURE with-select-when OF,mux,IS,BEGIN,with,sel,select,output-signal,Yout,Yout,Yout,Yout,Yout,Yout,Yout,Yout,Yout,=00000000;,END CASE;,END IF;,END PROCESS;,END decode-arch;,2.时序逻辑电路的设计,时序逻辑电路就是具有记忆(或内部状态)的电路,即时序逻辑电路的输出不但与当前的输入状态有关,而且与以前的输入状态有关。时序电路的内部状态元件可以由边沿敏感的,触发器或由电平敏感的锁存器实现,但大多数时序电路采用触发器来实现。,时序电路又可分为同步时序电路和异步时序电路两种,大部分时序电路为同步时序电路,所以下面就介绍同步时序电路的设计。,1)时钟信号的描述,用,VHDL,语言设计计数器电路时,必须确定计数器是在时钟信号的哪个边沿计数的,因此必须,对时钟信号的边沿进行描述。,描述时钟信号边沿有两种方法,即用信号的属性函数,signalEVENT,或者标准逻辑包提供的,rising-edge,和,falling-edge,函数来描述,如时钟信号,A,CLK,的上升沿可用下面两种方法来描述:,ACLKEVENT AND ACLK=1,或,rising-edge(ACLK),时钟的下降沿可用下面两种方法来描述:,ACLKEVENT AND ACLK=0,或,falling-edge(ACLK),2)复位信号的描述,时序电路的初始状态由复位信号来设置,根据复位操作是否与时钟信号有关可把复位信号分为同步复位和异步复位两种。,在,VHDL,中描述异步复位信号可通过以下方式来实现:首先在进程的敏感量中加入复位信号,;然后利用,IF,语句描述复位条件。,描述同步复位操作是通过在以时钟信号作为敏感信号的进程中,利用,IF,语句描述复位信号来实现的。下面以同步复位的,D,触发器来说明同步复位的实现方法:,LIBRARY IEEE;,USE IEEE.std-logic-1164.ALL;,ENTITY,dff,-sync-,rst,IS,PORT (data,clk,reset:in std-logic;,q:out std-logic);,END,dff,-sync-,rst,;,ARCHITECTURE,behav,OF,dff,-sync-,rst,IS,BEGIN,PROCESS (,clk,)BEGIN,IF (,clk,event and,clk,=1)THEN,IF (reset=0)THEN,q=0;,ELSE q=data;,END IF;,END IF;,END PROCESS;,END,behav,;,3)同步计数器的设计,同步计数器是在时钟脉冲控制下各触发器同时发生变化的计数器,在时序电路设计中应用最为广泛。下面以异步复位、同步预置的,N bit,同步计数器为例说明同步计数器的设计方法:,LIBRARY IEEE;,USE IEEE.std-logic-1164.ALL;,USE IEEE.std-l
展开阅读全文