VHDL与数字电路设计全套PPT电子课件教案(完整版).ppt_第1页
VHDL与数字电路设计全套PPT电子课件教案(完整版).ppt_第2页
VHDL与数字电路设计全套PPT电子课件教案(完整版).ppt_第3页
VHDL与数字电路设计全套PPT电子课件教案(完整版).ppt_第4页
VHDL与数字电路设计全套PPT电子课件教案(完整版).ppt_第5页
已阅读5页,还剩217页未读 继续免费阅读

下载本文档

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

文档简介

vhdl与数字电路设计,第1章 概 述,vhdl是vhsic hardware description language(vhsic硬件 描述语言)的首字母缩写,而vhsic是very high speed integrated circuits(超高速集成电路)的首字母缩写。 vhdl语言可以看作是下面几种语言的集成; sequential language + concurrent language + net-list language + timing specification + waveform generation language vhdl,1987年12月正式成为ieee标准,这个版本是ieee std 1076- 1987。 1993年的新版本为ieee std 1076-1993,是87版本的扩展版本。 vhdl可以描述数字硬件器件模型。这种模型指定器件的外部 视图以及一个或多个内部视图。硬件的内部视图指定其功能或结构 ,而外部视图指定器件与其他模型的通信接口。图1-1说明了硬件器 件和相应的器件模型。 图1-1 器件与器件模型,数字 系统 系统,外部框架,内部框架,模型,器件,器件模型,器件到器件模型映射是一对多的,也就是说,硬件器件可以有 多个器件模型。图1-2说明有多个器件模型的硬件器件的vhdl框架 结构,每个器件模型代表一个实体。 图1-2 器件的vhdl框架结构 实体是实际器件的硬件抽象。每个实体采用一个模型,包括外 部框架结构和一个或多个内部框架结构。同时,一个器件可以用一 个或多个实体来描述。,器件,实体1,实体2,实体n,器件模型1,器件模型2,器件模型n,实际器件,vhdl框架,为了描述实体,vhdl提供了5种不同类型的结构,称为设计单 元: 实体声明(entity) 结构体(architecture) 配置(configuration) 程序包(package) 库(library) 实体由实体声明和至少一个结构体组成。 实体声明描述实体的外部视图,例如:输入和输出信号名称。 结构体包括实体的内部描述,例如:一系列相互连接的实体 结构的元件,或是一系列代表实体行为的并行或时序语句。图1-3 表示了一个实体和一种可能的模型。 配置声明用来生成实体配置。从跟实体有关的结构体中选出 一个结构体,与实体进行绑定。同时它也能将所选结构体中的元件 与其它实体进行绑定。一个实体可以有多个不同的配置。,图1-4表示了e1实体的配置。,数字系统的 硬件抽象,实体声明,实体,模型,结构体,图1-3 实体及其模型,实体e1,bx,cx,实体e2,实体e3,m1,图1-4 实体e1的配置,e1_a1,e1_a2,e1_a3,e2_a1,e2_a2,e3_a1,e3_a3,e3_a2,结构体e1_a2 、e1_a3和e2_a1中分别有元件bx 、cx和 m1,其它结构体是没有任何层次的纯行为模型。结构体e1_a3绑定 到实体e1,结构体e2_a1绑定到实体e2,结构体e3_a2绑定到实 体e3。还有另一种类型的绑定,即结构体e1_a3中的元件cx绑定 到实体e2,结构体e2_a1中的元件m1绑定到实体e3。 程序包声明集成了一系列相关的声明,包括类型声明、子 类型声明、子程序和元件的声明,这些声明可以被两个或多个设计 单元共享。一个程序包体包括程序包声明中声明的子程序的定义。 库单元可独立存在于一个设计文件中,它存储被编译后的硬 件描述(模型)的部分。 图1-5表示了硬件器件的器件模型的vhdl基本结构框图。,库、程序包,配置(configuration),实体(entity),结构体 (architecture),元件、进程或 其它并行结构,图1-5 vhdl基本结构示意图, 模型分析 vhdl语言描述的实体可以用分析器和仿真器来验证。分析器 和仿真器是vhdl系统的一部分。 验证过程的第一步就是分析。分析器读入包括一个或多个设计 单元的文件,并把它们编译成中间态的形式,存储到特定的设计库- 工作库(work)中。在编译过程中,分析器要验证语法,并进行静 态语义检查。 图1-6 编译过程,设计单元,vhdl 分析器,中间形式,work_lib,lib1,ieee,std,库,工作库work,vhdl设计文件,一个设计单元 -实体声明 -结构体 -配置声明 -程序包声明 -程序包体, 仿真 验证过程的第二步就是仿真。对于层次化实体的仿真,它的所 有底层元件必须是行为级描述。仿真可以在如下两种结构中进行: 实体声明和结构体对 配置 仿真之前需要做以下两步: 细化过程(elaboration phase):在这个过程中,实体的层 次结构被扩展,链接,库中的元件被绑定到实体,顶层实体被细化 成由许多行为级构成的网络。同时,需要为信号、变量和常量声明 分配存储空间,为变量和常数赋初值,如果有显式说明的文件,该 文件将会被打开。 初始化过程(initialization phase):计算所有显式声明信号的 驱动器和有效值,给隐含信号赋值,此时进程也开始运行直到被挂 起,仿真时间设为0ns。 仿真是由事件驱动的。当事件发生的时候,原本要赋给这个信,号的值就赋给这个信号。如果信号的取值发生变化,并且那个信号 出现在进程敏感信号列表中,进程将被运行直到挂起。当异常发生 时,仿真停止。当vhdl系统实现或vhdl语言定义的最大仿真时间 到达时,异常声明发生。,第2章 基本语言要素,vhdl基本语言要素是数据对象、数据类型、各类操作数和运 算操作符。 vhdl是一种强类型语言,这意味着只有当操作数和结果的类 型按照一组规则相匹配时,vhdl语言中的操作和赋值才是合法 的。 2.1 标识符 标识符的用法规定了vhdl书写符号的一般规则。标识符可以 是常数、变量、信号、端口、子程序或参数的名字。 vhdl基本标识符的书写遵守如下规则: a. 有效字符: 英文字母(az, az) 、数字(09)和下划线 ( _ )。 b. 标识符必须以英文字母开头。,c. 标识符中的英文字母不分大小写。 d. 必须是单一下划线“ _ ” , 且其前后都必须有英文字母或数 字。 比如:drive_bus ram_address vhdl语言定义了一系列保留关键字,保留关键字在vhdl语言 中有特定的意义,不能当一般标识符使用; vhdl语言对空格不敏感; 每条vhdl语句以一个分号(;)结束; 注释前面要加两个连续的连字号,注释一直延续到一行末尾。 比如:- 这是实体声明 2.2 vhdl数据对象(data objects) 数据对象是指装载指定类型值的容器。对象可以是信号、变 量、常数和文件。一旦一个对象被声明为某一类型,那么在类型声 明所界定的范围内可以对对象进行运算或操作。,(1) 常数 (constant) 常数是一个恒定不变的值,如果作了数据类型和赋值定义,在 程序中就不能再改变。常数说明的一般格式如下: constant 常数名:数据类型 :=表达式; 常数的使用规则如下; 常数必须在程序包、实体、结构体、块、进程和子程序等设计 单元中对有关项目进行指定。 常数的使用范围取决于被定义的位置。定义在程序包中的常数 可由所在的任何实体和结构体中调用;定义在实体或进程内的常数 只能在该实体和进程中使用。 定义的常数数据类型必须与表达式的数据类型一致。 例如: constant vcc:real:=5.0; -定义某一个恒定电源 constant delay:time:=25 ns; -定义某个模块延迟时间 constant no_of_input:integer;- 没有给常数赋值,称为 - 延迟常数,只能出现在程序包声明里, - 而其常数值必须在程序包体里赋值。,(2) 变量 (variable) 变量类型的对象也能够用来存储某种指定类型一个数值。变量 是一个局部量,用于在进程和子程序结构中作局部的数据存储。变 量的赋值立即发生,不存在任何延时。其格式如下: variable 变量名: 数据类型 约束条件 := 表达式 变量的使用规则如下: a.变量不能用于在进程间传递数据。 b.变量不能用于硬件连线和存储元件。 c.仿真时,变量用于建模。 d.综合时,变量充当数据的暂存。 变量声明的例子如下; variable a: integer range 0 to 100:=10; variable b: bit_vector(10 downto 0); variable found,done: boolean; 如果没有给变量赋初值,那么其初值为默认值。默认值为,tleft,t是对象类型,left是该类型的预定的属性,它表示一 组属于t类型变量数组的最左值。在第二个语句中11个数组元素的 类型为位类型,其最左值为0,因此11个初值均为0,而在第三个 语句中的变量found和done的初值被赋为false。 (3) 信号 (signal) 信号是描述硬件系统的基本数据对象,是实体间动态数据交换 的手段。如硬件系统运行的并行性;信号传输过程中的惯性延迟特 性;多驱动源的总线行为等都能很好地描述。信号通常在程序包、 结构体和实体声明中使用,是全局量。 信号的定义格式: signal 信号名:数据类型 约束条件:=表达式; 信号的使用规则如下; “:=” 表示对信号直接赋初值,信号获得初值不产生延时。 “= 表示对信号代入赋值,这种方式允许产生延时。 仿真时,要保证信号在初始时能设定在指定值上。,综合时,信号应在实体和结构体中被清楚地描述。 下面是一些信号声明的例子; signal clock: bit; signal data_bus: bit_vector(0 to 7); signal gate_delay:time:=10 ns; signal init_p: std_logic_vector(7 downto 0) :=(0 = 1, others = u); 信号声明与变量声明某些地方相似,但有许多不同之处。 它们的主要区别如下; 信号的赋值过程与赋值语句分开处理,执行赋值语句不会使 信号立即赋给,必须在进程结束后才能成为当前值;而变量的赋值 语句一旦执行,其值立即被赋予变量。 在进程中,信号可以列入敏感表,而变量不能列入敏感表。 在仿真过程中,变量使用很少的存储器,而为了调度安排和 处理信号属性,信号需要存储更多的信息。,信号可能需要使用wait语句来为执行相同迭代做信号赋值 的同步处理;而变量不存在这个问题。 特别要注意:不是所有的对象都用对象声明来产生的,实体端 口的所有对象都是信号对象,但它是默认的,不需要用对象声明来 产生。 2.3 vhdl数据类型 (data types) vhdl是一种强类型语言,在运算关系与赋值关系中对操作数 的数据类型有严格要求。在数据对象的定义中,必不可少的就是为 定义的数据对象设定数据类型,并且每一个数据对象只能有一个数 据类型的值,该对象的赋值源是相同的数据类型。 vhdl提供了许多预定义的数据类型,各种预定义数据类型大 多数体现了硬件电路的不同特性。此外,用户还可以自定义数据类 型。这是vhdl语言的一大特色。,2.3.1 vhdl预定义类型 预定义数据类型是vhdl中最常用,最基本的数据类型。在使 用中它自动包含进vhdl的源文件,不必通过use语句显式调用。 (1) 布尔类型 (boolean) 在程序包standard中定义的源代码是: type boolean is (false,true); 布尔数据类型实质是一个枚举数据类型。如定义所示,其取值 只能为false(伪)和true(真)两者之一。综合器用一个二进制位表 示boolean型变量或信号。布尔量只能通过关系运算符获得,它 不属于数值因而不能用于运算。例如,x小于y时,在if语句中的关 系运算表达式(xy)的结果是布尔量true,反之为false。综合 器将其变为1或0信号值,对应于硬件系统中的一根线。 (2) 位类型 ( bit ) 在standard中定义的源代码是: type bit is ( 0, 1 );,位数据类型取值只能是 1 或 0,通常用来表示信号的不同状 态。位数据类型的数据对象可以参与逻辑运算,运算结果仍是位数 据类型。vhdl综合器用一个二进制位表示bit。 (3) 位矢量类型 (bit_vector) 在程序包standard中定义的源代码是: type bit_vector is array (natural range ) of bit; 位矢量是基于位数据类型的数组,使用位矢量必须注明位宽。,例如: signal b: bit_vector (6 downto 0); 信号b被定义为一个具有7位位宽的矢量,它的最左位是b(6),最右位是b(0)。 (4) 字符类型 ( character ) 字符类型要用单引号来表示,包括英文字母(a z, a z) 、数字 (0 9) 、空格及一些特殊字符。字符类型区分英文字母大小写。如a不同于a。 注意:在vhdl程序设计中标识符一般不分大小写,但用了单引号的字符则区分大小写。,(5) 整数类型 (integer) 整数类型的数包括负整数、零和正整数。整数类型和算术整数 相似,可以使用预定义的运算操作符,如加、减、乘、除等进行算 术运算。但不能用于逻辑运算。在程序包中指定了整数的取值范围 是-(2 +1) (2 +1)。 vhdl仿真器通常将integer类型作为有符号数处理,而综合 器将它作为无符号数处理。在使用整数时,vhdl综合器要求用 range子句为所定义的数限定范围,然后根据所限定的范围来决 定表示此信号或变量的二进制数的位数。 例如: signal a: integer range 0 to 7; 规定整数a的取值范围是0 7共8个值,可用3位二进制数来表 示,因此a将被综合成由3条信号线构成的信号。 (6) 自然数和正整数类型 (natural和positive) 自然数和正整数都是整数的子集。自然数是零和正整数;而正 整数包括大于零的整数,是自然数的子集。,31,31,(7) 浮点类型 (real) 类似于数学上的浮点数。其取值范围为: -1.010 +1.010 。 (8) 字符串类型 (string) 字符串数据类型是用双引号引起来的字符串数组,一般用于程 序的提示和结果说明。字符串类型区分英文字母大小写。字符串文 字的例子如下: “this is a test” “state “”read “” entered!” -序列中的两个双引号符号代表一个双引号符号 (9) 时间类型 (time) 在vhdl中,时间数据类型是唯一的预定义物理类型。完整的 时间类型包括整数和物理量单位,整数和单位之间至少留一个空 格,如33 ms、10 ns。 (10) 错误等级 (severity level) 其定义为: type severity level is (note, warning,38,38,error,failure); 错误等级又叫错误类型。在vhdl仿真器中,常用来指示设计 系统的工作状态。共有四种等级:note(注意) 、warning(警告) 、 error(出错)和failure(失败)。 在仿真过程中,输出这四种值可向开发者提示系统当前的工作 情况。 2.3.2 ieee标准数据类型 在ieee库程序包std_logic_1164中,定义了两个非常重要 的数据类型,即标准逻辑位和标准逻辑矢量。在程序中使用此数据 类型前,需加入语句: library ieee; use ieee.std_logic_1164.all; (1) 标准逻辑位类型 (std_ulogic) 在程序包std_logic_1164中定义的类型std_ulogic为枚 举类型,其定义如下:,type std_ulogic is ( u, - 未初始化 x - 强信号冲突(未知) 0 - 逻辑0(强0) 1 - 逻辑1(强1) z - 高阻态 w - 弱信号冲突(不定) l - 弱信号0 h - 弱信号1 _ - 忽略(无效) ); 在仿真和综合中,std_ulogic值非常重要,它可以使设计者 精确地模拟一些未知和高阻态的线路情况。对于综合器,高阻态和 忽略态可用于三态的描述。但就综合而言,std_logic型数据能 够在数字器件中实现的只有4种值,即0、1、_和z。当然,这并不 等于表明其余的5种值不需要。所有9种值对于vhdl行为仿真都有 重要意义。,(2)标准逻辑矢量类型 (std_logic_vector) std_logic_vector是定义在std_logic_1164程序包中 的标准一维数组,数组中的每一个元素的数据类型都是上述定义的 标准逻辑位std_logic。其数据类型定义如下: type std_logic_vector is array (natural range ) of std_logic; 在使用中,向标准逻辑矢量std_logic_vector数据类型的 数据对象赋值的方式与普通的一维数组array是一样的,即必须严格 考虑位矢的宽度。同位宽和同数据类型的矢量间才能进行赋值。 描述总线信号,使用std_logic_vector是最方便的,但要 注意总线中的每一根信号线都必须定义为相同的逻辑位数据类型 std_logic。 2.3.3 其它予定义标准数据类型 synnopsys公司程序包 std_logic_arith中:, 无符号型(unsigned) 定义如下: type unsigned is array(natural range )of std_logic; unsigned(“1000”)= 8 最左位为最高位: variable var : unsigned(0 to 10); -var(0) 是最高位 signal sig : unsigned(5 downto 0); -sig(5)是最高位 有符号型(signed) 定义如下: type signed is array(natural range )of std_logic; 最高位为符号位,综合器认作补码。 signed(“0101”)= 5, signed(“1011”)= -5 variable var :signed(0 to 10); - var(0)是符号位。 小整型(small_int):0 to 1,2.3.4 用户自定义数据类型 (1) 自定义数据类型方式 vhdl允许用户自己定义新的数据类型,其定义数据类型是用 type类型定义语句和subtype子类型定义语句实现的。 type语句用法 type语句语法结构如下: type 数据类型名 is 数据类型定义 of 基本数据类型;或 type 数据类型名 is 数据类型定义; 数据类型名由设计者自取;数据类型定义部分描述所定义的数 据类型的表达方式和表达内容;关键词of后的基本数据类型是指数 据类型定义中元素的基本数据类型,一般都是取预定义数据类型如 bit、std_logic等。 例如: type byte is array (0 to 7) of std_logic; type colour is (red.green,yellow,blue);, subtype语句用法 subtype子类型是type所定义的原数据类型(基类型)的一个子集, 它满足基本数据类型所有约束条件。 subtype语句格式如下: subtype 子类型名 is 基本数据类型 range 约束范围; 子类型定义中的基本数据类型必须是预定义类型或在前面已通 过type定义的类型。例如; subtype a is integer range 0 to 7; 利用子类型定义数据对象,可以使程序提高可读性并更易处理, 其实质是有利于提高综合的优化效率。 ( 2 ) 用户自定义数据类型 用户自定义数据类型有很多种,如枚举类型、整数和浮点类型、 数组类型和记录类型等。 枚举类型 (enumeration type) 枚举类型是一种特殊的数据类型,即把类型中的各个元素都列,举出来。这些元素包括标识符和字符文字。这种数据类型非常直观 方便,提高了程序的可读性。 其声明格式为; type 数据类型名 is (元素 ) ; 在vhdl中,位、布尔变量及字符等许多常用的数据类型都是 在程序包中已定义的枚举型数据类型。如bit的取值0和1是一种文 字,不能进行常规的数学运算,因而与普通的0和1不同。在综合过 程中,对此类枚举数据,都将转化成二进制代码。 例如: type pcstate is (idle, busy, write, read, backoff); signal a, b : pcstate; type logic is (1, z, u, 0); signal s : logic; signal s1 : logic range z to u; -隐含子类型声明 type micro_op is (load, store, add, sub, mul, div);,subtype arith_op is micro_op range add to div; variable ic : micro_op := store; -store是初值 variable alu : arith_op; 枚举类型的值称为枚举文字。在综合过程中, 枚举类型的枚举 文字的编码是自动默认的,即将最左边的枚举文字编码为0,后面 的依次加1,并把它转换成二进制代码。 例如,上面声明的pcstate枚举类型的值共有5种,所以其默 认二进制编码值为: idle := “000”; busy := “001”; write := “010”; read := “011”; backoff := “100”; 整数类型和浮点类型(integerreal type) 整数和浮点数类型在标准的程序包中已经有预定义。由于它们 的取值定义范围太大,综合器无法进行综合。因此,定义这两种数据 类型的数据对象必须由用户根据实际需要重新定义,并限定其取值 范围,从而提高芯片资源的利用率。,在实际应用中,vhdl仿真器通常将整数和浮点类型作为有符 号数处理,vhdl综合器对整数和浮点数的编码方法是;对用户定 义的数据类型和子类型中的正数编码为二进制原码;对负数编码为 二进制补码。 编码的位数只取决于用户定义的数值的最大值。在综 合中,对浮点数先转换成相应大小的整数。因此在使用整数时, vhdl综合器要求使用数值限定关键词range对整数的使用范围作明 确的限制。 例如: type index is range 0 to 15 ; type num1 is range -100 to 100 ; index和num都是隐含的整数类型。采用上面类型的两个数据 对象声明如下; constant mux_addres : index := 5 ; signal data_1 : num1 ; 在仿真中,按类型定义决定其二进制位矢量的宽度,即index,用5位位矢量表示(其中1位符号位,4位数据位);num1用8位位矢 量表示(其中1位符号位,7位数据位)。 物理类型 物理类型的值是物理量(比如时间、长度、电压或电流)的度量 单位。这种类型的值是基本单位的整数乘积。 物理类型的声明例子如下; type current is range 0 to 1e9 units na; - (基本单位) 毫微安 ua = 1000 na; - 微安 ma = 1000 ua; - 毫安 amp = 1000 ma; - 安培 end units; subtype f_current is current range10 ua to 5 ma 物理类型的数值称为物理文字。物理文字用整数和浮点数,或,字符加单位名称表示。tyme是唯一预定义的物理类型。 数组类型(array type) 数组是同类元素的集合。数组可以是一维或多维的。虽然 vhdl仿真器支持多维数组,但综合器只支持一维数组。 vhdl允许定义限定性和非限定性两种不同类型的数组,它们 的区别是:限定性数组下标的取值范围在数组定义时就确定了,而 非限定性数组下标的取值范围需在以后确定。 限定性数组的定义格式为: type 数组名 is array (数组范围) of 数据类型; 非限定性数组的定义格式为: type 数组名 is array (range类型名称 range ) of 数据类型; 其中数组名是定义的数组类型的名称;数组范围指出数组元素 的定义数量和排序方式;range类型名称是下标范围的数据类型, 其中符号“”是下标范围的待定符号(被称为“盒”),用时再填入 具体的数组范围;数据类型是数组中各元素的数据类型。,例如: 限定性数组(约束数组)声明的例子如下: type data_word is array (7 downto 0) of bit; - “01001011” 非限定性数组(无约束数组)声明的例子如下: type std_logic_vector is array (natural range ) of std_logic; 存取类型(access) 存取类型的数据是动态指向其他类型对象的指针。 存取类型定义格式如下: type 存取类型名称 is access 类型名称 例如: type line is access string; - line是指向字符串的指针 variable buf : line; - access type 这些予定义提供了从一行中读写数据的操作。 文件类型(files),文件类型的对象代表主机环境中的文件。它提供了一种vhdl 设计同主机环境相互通信的机制。 文件类型定义格式如下: type 文件类型名称 is file of 类型名称 类型名称是文件中包含的数据的类型,例如: type vectors is file of bit_vector; 类型为vectors的文件中的数据为bit_vector类型。 程序包textio中予定义了text文件类型。这种文件类型表示 具有变长度文本字符串的文件。 type text is file of string; - text是一个可变长度的字符串文件 例如: file infile : text is in “c:/vhdl/data.txt“ ; - program file 目前存取类型和文件类型只用于仿真。 记录类型(record type) 记录类型的对象由相同或不同类型的元素组成。记录类型适于,描写通信或总线的协议。记录类型可用于仿真,不能用于综合。 记录类型定义格式如下; type 记录类型名 is record 元素名:元素数据类型; 元素名:元素数据类型; end record 记录类型名; 例如: type pci_bus is record addr :std_logic_vector(31 downto 0); data :std_logic_vector(31 downto 0); end record; signal decord1,decord2 :pci_bus; pci_device = decord1.addr; pci_device1ram = decord2.data;,2.3.5 类型转换 vhdl语言定义了非常严格的类型转换,也就是说,需要对不 同类型的值进行明确的转换。紧密相关的类型之间的转换是允许 的。它们包括整型和实型之间以及它们的数组之间。这些数组的维 数相同、索引类型紧密相关且元素类型相同。 vhdl类型转换,除了那些vhdl语言预先定义过的,都可以通 过用户自定义函数进行。 类型标记法 variable i :integer; variable r :real; i := integer (r); r := real (i); type signed is array (natural range ) of bit; type bit_vector is array (integer range ) of bit; signal fcr : signed (0 to 7); signal ema : bit_vector (0 to 7);,使用类型转换: fcr - std_logic_vector conv_integer(a); - signned,unsigned - integer 在std_logic_unsigned程序包中: conv_integer(a) ; - std_logic_vector - integer 2.4 vhdl运算操作符(operators) vhdl语言中预定义的运算操作符可以分为以下6类: 1. 逻辑操作符 2. 关系操作符 3. 移位操作符 4. 加操作符,5. 乘操作符 6. 杂项操作符 在vhdl程序设计中,不同类型的数据对象对应不同类型的运 算符,运算符和操作数类型必须匹配。 vhdl操作符列表,(1:最高优先级),说明:, 逻辑操作符 and和or操作符各自可以连着使用,但不同的操作符之间不能 连着使用。 nand和nor操作符各自也不可以连着使用。若要连着使 用,可用圆括号。例如: a and b and c 是合法的。 a and b or c 是非法的,可用圆括号 (a and b) or c 。 a nor b nor c 是非法的,可用圆括号 (a nor b) nor c。 当关系操作符的操作数是数组的时候,从左到右每一次取 一个元素作比较。例如: bit_vector(0,1,1)bit_vector(1,0,1) 为true。 type mvl is (u,0,1,z)。那么, mvl(u)mvl(z) 为true。 如果移位操作符的右操作数是负整数,那么进行相反方向,的操作,即左移和循环左移分别变成右移和循环右移,反之亦然。 移位操作符的例子: 假设所有左边操作数都是 bit_vector类型: “1001010” sll 2 is “0101000” - 填入bitleft,即0。 “1001010” srl 3 is “0001001” - 填入0。 “1001010” sla 2 is “0101000” - 填入最右边位0。 “1001010” sra 3 is “1111001” - 填入最左边位1。 “1001010” rol 2 is “0101010” - 循环左移。 “1001010” ror 3 is “0101001” - 循环右移。 “1001010” ror -4 is “0101001” - 执行rol 4操作。 “1001010” srl -5 is “1000000” - 执行sll 5操作。 “1001010” sla -2 is “1110010” - 执行sra 2操作。 “1001010” sra -4 is “0100000” - 执行sla 4操作。 “1001010” rol -1 is “0100101” - 执行 ror 1操作。 “1001010” sll -5 is “0000010” - 执行srl 5操作。,&操作符的操作数可以是一维数组,也可以是元素类型,其 结果永远是数组类型。例如: 0&1 结果为 “01”。 a rem b = a - (a/b)*b rem操作的结果与第一个操作数的符号相同。 a mod b = a b*n - n是整数 mod运算的结果与第二个操作数的符号相同。 举例:,2.5 属性(attribute) 一个属性是与vhdl描述中某些名称相关联的一个值、函数、 类型、范围、信号或常数。这些名称可以是实体名称、结构体名 称、标号或信号。 vhdl语言中有五种预定义的属性: 1. 值属性(value attribute): 返回一个常数值。 2. 函数属性(function attribute): 调用函数并返回值。 3. 信号属性(signal attribute): 产生相同类型的信号。 4. 类型属性(type attribute): 返回类型名称。 5. 范围属性(range attribute): 返回一个范围。 现在以下面的各种声明为例,用表格说明五种预定义的属性。 type aufsteigend is 0 to 255; subtype fallend is aufsteigend range 255 downto 0; type farben is (rot, gruen, gelb, blau); signal data: std_logic_vector(7 downto 0);,signal clk: std_logic;,整型、枚举及其子类型的属性,数组的值属性,函数类属性,物理和枚举类型的属性函数,数组的属性函数,函数类属性(续),信号-任务的属性函数,注意:正确理解value和active之间的差异是很重要的。当新 的值赋给信号时,就是active,即使新值和旧值相同。只有在新 值不同于旧值时,才是value。,数据类型类属性,信号类属性,数据区间类属性,第3章 vhdl基本设计单元,3.1 vhdl基本设计单元组成 vhdl是一种用来对数字系统建模的硬件描述语言。这里将数 字系统的硬件抽象称为实体。 为了描述实体,vhdl提供了五种不同类型的设计单元。 1. 实体(entity) 在vhdl中,实体是对数字系统的硬件抽象。实体声明(entity declaration)定义实体名和接口端口。端口是实体与其外部环境的 其他模块进行通信的信号。一个设计可包含多个实体。 实体声明的语法如下: entity 实体名 is 类属参数说明 端口说明 end 实体名;, 端口说明 端口说明是设计实体与外部接口的描述,是对外引脚信号的名 称、数据类型和输入输出方向的描述。其语法如下: port( 端口名称,端口名称:端口模式 端口类型 ;端口名称,端口名称:端口模式 端口类型 ); 端口名是赋予每个外部引脚的名称,用英文字母或英文字母加 数字命名。端口模式可以是:in(输入)、out(输出)、inout( 输入输出型,既可读也可赋值)、bufer(既可读也可输出)。 一个与非门的的实体声明: entity nand is port (a,b :in bit; - 两个输入a和b z :out bit); - 一个输出z end nand;, 类属参数说明 一个类属声明了一个模式为in的常数对象,并且可以在实体声 明和与之对应的结构体中使用。 类属参数说明必须放在端口说明之前。在实体内部,类属参数 是一个常数值,可以对类属参数设置一个缺省值。 声明语法如下: generic( 常数名称:类型 : = 值 ;常数名称:类型 : = 值 ); 其中,常数名称是类属常量的命名;类型是事先定义好的数据 类型。例如: entity mux is generic (m :time : = 1 ns); port(d0,d1,sel :in bit; q :out bit); end mux;,2. 结构体 实体声明描述模块的对外属性,结构体就完成模块的具体实现 或内部具体描述,描述设计实体的输入与输出的关系。 由于结构体是对设计实体功能的具体描述,因此,在先编译了 实体声明后才能对结构体进行编译。 结构体的语法如下: architecture 结构体名称 of 实体名称 is 块声明语句 begin 并行处理语句 end 结构体名称 ; 结构体名称是对结构体的命名;of 后面紧跟的实体名称,表明 该结构体所对应的设计实体;块声明语句用来对结构体内部所使用 的信号、常数、数据类型、子程序、元件等进行定义;并行处理语 句具体描述结构体的行为及其连接关系。,例子:一位半加器的vhdl描述 entity half_adder is port(a,b :in bit; sum,carry :out bit); end half_adder; architecture behavioral of half_adder is begin sum = a xor b; carry = a and b; end behavioral;,x1,a1,sum,a,b,carry,图3-3 半加器的逻辑电路图,一个vhdl实体只能有一个与之相关的结构体。如果存在多个 结构体,必须通过配置确定与实体相关的唯一的一个结构体。一个 设计实体和某一特定的结构体合起来共同定义一个单元,结构体和 实体的绑定关系称为配置。 3. 配置(configuration) 配置声明用于从若干个结构体中选择一种结构体,并将代表该 结构体的元件绑定(binding)到设计库中实体-结构体对或配置所代 表的实体上。 配置声明的语法如下: configuration 配置名 of 实体名 is 配置声明语句部分 块配置部分 end 配置名; 配置名为配置的名称,配置声明语句为use语句。 块配置语法如下: for 结构体名/块标记,use语句 for 组件名称 use 实体名/类属映射/端口映射 块配置声明 end for; 实体half_adder的一种配制声明如下: library cmos_lib,my_lib; configuration ha_binding of half_adder is for ha_structure for x1: xor2 use entity cmos_lib.xor_gate(dataflow); end for; for a1: and2 use configuration my_lib.and_config; end for;,end for; end ha_binding; 第一句为library子句,该子句使cmos_lib和my_lib库名称对 于配制声明可见。 第二句定义了实体half_adder的配制,该配制的名称为 ha_binding。 第三句为此配制选择了结构体ha_structure。 由于此结构体包括两个元件实例,因此需要两个元件绑定。 for x1: end for语句将元件实例x1绑定到cmos_lib设计 库中的实体-结构体对所代表的实体上,该实体-结构对:xor_gate 实体声明和dataflow结构体。 for a1: end for语句将元件实例a1绑定到设计库my_lib 的配制声明定义的实体配制上,该配制声明的名称为and_config。,最简单的默认结构为: configuration 配置名 of 实体名 is for 选配结构体名 end for; end 配置名; 例如: entity abc is port(); end abc; architecture a of abc is begin end a; architecture b of abc is, begin end b; configuration rtl_conf1 of abc is for a end for; end rtl_conf1; configuration rtl_conf2 of abc is for b end for; end rtl_conf2; 配置rtl_conf1连接实体和a结构体,配置rtl_conf2连接实 体和b结构体。,4. 程序包(package) 程序包是一个设计单元,包含有可用于其他设计单元的一系列 声明。在一个设计实体中定义的数据类型、常数声明、子程序和数 据对象等对于其他设计实体是不可见的。为了使已定义的数据类 型、常数声明及子程序等能够被更多的 vhdl设计实体方便地访问 和共享,vhdl提供了程序包机制。 一个程序包由程序包声明和程序包体两部分组成。程序包的定 义语句结构如下; package 程序包名 is 程序包声明 end package 程序包名; package body 程序包名 is 程序包体 end package body 程序包名;,在程序包结构中,程序包声明是主设计单元,可以独立地编译 和使用, 程序包声明至多可以有一个程序包体,而且程序包体不是 必需的。在一个程序包中,程序包声明的程序包名与程序包体的程 序包名是同一个名字。 程序包的例子如下: library ieee.; -库使用声明 use ieee.std_logic_1164.all; -库程序包使用声明 package bag is -程序包声明开始 constant num1:real:=3.14 -定义常数num1 constant num2:intege; -定义常数num2 function fun (a,b,c: real) return real; -定义函数fun component com is -定义元件com generic (t1,t2:time:=3 ns); -类属声明 port (in1,in2: in std_logic); -端口声明 end component com; end package bag; -程序包声明结束,package body bag is -程序包体开始 constant num2:intege:=5; function fun (a,b,c: real) return real is begin return (a+b+c)/3.0; end

温馨提示

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

评论

0/150

提交评论