可编程器件第3章硬件描述语言.ppt_第1页
可编程器件第3章硬件描述语言.ppt_第2页
可编程器件第3章硬件描述语言.ppt_第3页
可编程器件第3章硬件描述语言.ppt_第4页
可编程器件第3章硬件描述语言.ppt_第5页
已阅读5页,还剩181页未读 继续免费阅读

下载本文档

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

文档简介

VHDL语言,1,主要内容,VHDL的元素 VHDL语言程序的结构 VHDL的描述语句 VHDL语言的描述方式 深入掌握与应用VHDL语言,VHDL的元素,3,VHDL的元素,(1)VHDL语言的词法和标识符 (2)VHDL语言的对象 (3)VHDL语言的数据类型 (4)VHDL语言的运算符,VHDL语言的词法和标识符,5,词法和标识符,短标识符 VHDL-93接收了VHDL-87关于标识符的全部标准,VHDL-87标准中的标识符称为短标识符,VHDL-93标准中的标识符称为扩展标识符。 短标识符的组成:英文字母、数字、下划线 短标识符的开始:必须以英文字母开始 短标识符不敏感大小写 短标识符的最后一个字符不能是下划线 下划线不能连续出现 不能采用保留字作为短标识符,6,词法和标识符,扩展标识符 扩展标识符用反斜杠来界定,例如:data_bus 扩展标识符的两个反斜杠之间可以使用保留字。ENTITY 扩展标识符区分大小写 扩展标识符允许下划线连续使用 同名的扩展标识符和短标识符是不一样的。例如:data_bus和data_bus不一样,7,词法和标识符,注释 以“-”开始直到本行结束的一段文字 注释不会被编译 注释起到对程序说明和解释。程序应该包括充分的注释,8,词法和标识符,数字 VHDL语言中数字的表示方法:十进制/二进制/十六进制/整数/实数 相邻两个数字之间插入下划线、在数字之前添加若干个0对数字无影响,但任何位置插入空格会改变数字。例如: 123_456等价与123456 001234等价与1234 123 456不表示123456,9,词法和标识符,字符和字符串 字符是用单引号括起来的ASCII码,VHDL敏感字符的大小写。例如:A与a是不同的。 字符串是用双引号括起来的字符序列。 字符和字符串不能混为一谈。”a”和a是不同的。,10,词法和标识符,位串 位串是用双引号括起来的数字序列,并在数字序列前加上一个基数说明符。例如: B”00111111” 表示二进制数,只有二进制数才能将基数说明符省略。 X”3F”表示十六进制数。,VHDL语言的对象,12,VHDL语言的对象,在VHDL语言中,凡可被赋予一个值的客体就是数据对象 常量:规定的常数 信号:对应物理设计中的硬件连线 变量:局部数据的暂时缓存 文件:作为参数向子函数传递 对象的说明格式 对象类型 标志符表:类型标识:表达式; 例:CONSTANT WIDTH : INTEGER := 8;,13,常量,常量 常量(Constant)是指在设计实体中不会发生改变的值 常量的物理意义:通常代表硬件电路中的电源或地线。常量说明的一般格式: CONSTANT 常量名 : 数据类型 := 表达式; 例如:CONSTANT pi :REAL := 3.14; CONSTANT VCC :REAL := 3.3; 常量说明的位置:程序包、实体说明、结构体的说明部分、进程语句的说明部分。不同的说明部分具有不同的作用范围。 常常赋予的值与类型要一致,否则出错。 例如:CONSTANT VCC :REAL := ”0101”; -这是错误的,14,常量的作用范围,常量的作用范围与其定义的区域有关 在程序包中说明的常量,可以由所含的任何实体、结构体所引用 在实体中说明的常量,只能被该实体的结构体所引用 在结构体中说明的常量,只能被该结构体内部的语句所引用 在进程说明的常量,只能在本进程中进行引用,15,常量的应用,模拟ROM 定义一个常量型ARRAY 给每一个元素赋值,16,VHDL语言的对象,信号(Signal) 信号是内部硬件连线的抽象表示,没有方向说明。 信号的物理意义:它表示硬件电路中的一条硬件连线。 信号说明的一般格式: SIGNAL 信号名,信号名:数据类型 :=表达式; 当对信号进行初始赋值时,赋值符号为“:=”,但是当在程序中进行信号赋值时,采用的赋值符号为“=”。 例如:SIGNAL address_bus:std_logic_vector(7 DOWNTO 0); SIGNAL reset:std_logic:=1;,17,VHDL语言的对象,信号(Signal) 当对信号进行初始赋值时,赋值符号为“:=”,但是当在程序中进行信号赋值时,采用的赋值符号为“=”。 例如:SIGNAL address_bus:std_logic_vector(7 DOWNTO 0); SIGNAL reset:std_logic:=1; 说明信号量时可以赋初值,也可以不赋初值。 不赋初值时,信号默认取数据类型的最左边的值或最小值。 例如address_bus,没有赋初值时,其初始值为“UUUUUUUU”,18,VHDL语言的对象,信号(Signal) 信号说明的位置:程序包、实体说明、结构体说明部分 信号可以作为结构体中各进程之间通信的手段 信号的赋值被称为带入,它可以附加延时。例如: s1 = s2 after 10ns; 信号的带入是不是立即发生的,19,信号的作用范围,在程序包中说明的信号,可以由所含的任何实体、结构体所引用 在实体中说明的信号,只能在本设计的实体中使用 在结构体中说明的信号,只能被该结构体内部的语句所引用,20,信号的应用,不同设计单元之间的通信手段 层次化设计中层次联系的媒介 解决设计难题的重要帮手!,21,VHDL语言的对象,变量(Variable) 用于对暂时的数据进行局部的存储,是一个局部变量。 变量的物理意义:主要用于局部数据的暂时存储,是一种载体。 变量说明的一般格式: VARIABLE 变量名: 数据类型 约束条件:=表达式 例如:VARIABLE cnt: integer :=0; VARIABLE cnt: integer RANGE 1 TO 100:=1;,22,VHDL语言的对象,变量(Variable) 变量的说明位置:进程语句、函数语句、子程序语句 变量不能用于硬件连线和存储元件 在系统综合时,变量用于计算,作为索引载体和数据的暂存 进程中的变量的作用范围只在进程内,若要将变量作用于进程外,则必须将该变量赋给一个相同类型的信号。 变量的赋值不能附加延时。,23,信号和变量的区别,信号赋值是有延时的,而变量的赋值没有延时 信号除当前值外,还有历史信息等其他信息;变量只有当前信息 进程只对信号敏感,不对变量敏感 信号可以是多个进程的全局信号,变量只能在一个进程范围内。 信号是硬件连线的抽象描述,变量无实际的对应关系,通常用于计算 变量的值可以传给信号,但信号不能传给变量 信号的代入符号(=)和变量的赋值符号(:=)不同。,24,信号和变量的区别,两者的操作过程不同: SIGNAL A,B,C,D:STD_LOGIC; PROCESS(A,B,C,D) BEGIN D = A; X = B + D; D = C; Y = B + D; END PROCESS 结果:X=B+C; Y=B+C;,PROCESS(A,B,C) VARIABLE: D: STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN D := A; X = B + D; D := C; Y = B + D; END PROCESS 结果:X=B+A; Y=B+C;,25,VHDL语言的对象,文件 文件是一种传输大量数据的载体 文件说明的格式如下所示: FILE 文件名,文件名 : 文件类型 is 方向 路径; FILE用来声明一个文件; 文件类型用来指明文件是什么形式的文件; 方向是一个可选项,它用来表明文件是输入文件还是输出文件,分别用保留字“IN”和“OUT”来表示; 路径表达式的作用是指明文件的实际存储位置。 文件类型通常需要事先定义 例:P59,VHDL语言的数据类型,27,VHDL语言的数据类型,VHDL语言要求为各种常量、变量、信号指定明确的数据类型 一个对象只能具有一种数据类型; 对某对象进行操作的类型必须与该对象的数据类型相匹配; 具有不同数据类型的对象之间不能直接进行赋值操作。,28,VHDL语言的数据类型,标准定义的数据类型,29,VHDL语言的数据类型,常用的标准数据类型 BIT/BIT_VECTOR 布尔量:是一个二值枚举类型,它和位类型不同,没有数值的含义,不能进行算术运算,只能进行关系运算。 整型 范围与补码表示不同 实现时用二进制来表示,但不能看作位矢量,即不能对整型进行逻辑运算 时间:物理类型的一种;一个完整的时间数据应该包括数值和单位两个部分;预定义的时间类型给出了7个时间单位:ps、ns、us、ms、sec、min、hr。时间类型常常用于仿真,而不用于逻辑综合,30,VHDL语言的数据类型,用户定义的数据类型 用户定义数据类型的书写格式为: TYPE 数据类型名 ,数据类型名,数据类型定义; 用户可以定义的数据类型有: 枚举类型(Enumeraterd) 整数类型(Integer) 实数(Real)、浮点(Floating)类型 数组(Array)类型 存取(Access)类型 文件(Files)类型 记录(Record)类型 时间(Time)类型,31,用户定义的数据类型举例,Type 数据类型名 is (元素,元素,); Type color is(blue, green, yellow, red); (2) Type 数据类型名 is 数据类型定义 范围; Type signal_level is range -10.00 to +10.00; (3) Type 数据类型名 is array 范围 of 原数据类型; Type word is array(31 downto 0) of BIT; Type 数据类型名称 is Record 元素名称:数据类型名称; 元素名称:数据类型名称; End Record;,32,用户定义的数据类型,可枚举类型 TYPE 枚举数据类型名 IS (枚举元素,枚举元素,); 对于有限状态的编码用二进制表示时不直观,此时应该采用枚举类型。 例如:表示一周之内每天的状态,这时可以定义一个名字为week的可枚举类型,如下所示: TYPE week IS (monday,tuesday,wednesday,thursday,friday,saturday,sunday);,33,用户定义的数据类型,可枚举类型 可枚举数据类型存在着这样的顺序关系:最左边的值低于所有其它的值,最右边的值大于所有其它的值,每一个值均大于其左边数据值而低于其右边数据值。例如: SIGNAL today : week; Result = friday ELSE 0; 可枚举类型的应用 将微处理器的全部指令表示成一个可枚举类型 对有限状态机的全部状态描述成一个可枚举类型,34,用户定义的数据类型,数组类型 TYPE 数组类型名 IS ARRAY 约束范围 OF 数组元素类型; 示例:P64P65 数组的赋值 对整个数组进行一次赋值 按照下标对每一个数组元素进行赋值 数组的引用 引用整个数组 引用数组元素,35,用户定义的数据类型,子类型:基本类型的子集 SUBTYPE 子类型名 IS 基本数据类型名 范围限制; 基本类型与子类型 子类型的范围要小于或等于基本类型的范围 子类型和基本类型还允许在两种类型之间进行赋值,子类型总可以对基本类型赋值;基本类型向子类型赋值,要看基本类型对象的值是否在子类型范围之内,如果在范围之内,则可以进行赋值,否则不可以。 TYPE定义的类型是一种全新的类型,36,VHDL语言的数据类型,常用的数据类型 VHDL语言中经常使用的数据类型是可枚举类型STD_ULOGIC及其子类型STD_LOGIC。在IEEE 1164标准的“STD_LOGIC_1164”程序包中,可枚举类型STD_ULOGIC的定义格式如下: TYPE std_ulogic IS ( U, -初始态 X, -不定状态 0, -低电平 1, -高电平 Z, -高阻 W, -弱不定态 L, -弱低电平 H, -弱高电平 -);-可忽略值,37,VHDL语言的数据类型,数据类型STD_LOGIC是可枚举类型STD_ULOGIC的子类型,它的值与STD_ULOGIC的值相同,但它具有一个决断函数,称为resolved。 在IEEE 1164标准的“STD_LOGIC_1164”程序包中,数据类型STD_LOGIC的类型定义如下: SUBTYPE std_logic IS resolved std_ulogic; 此外,经常使用的矢量类型bit_vector、std_ulogic_vector、std_logic_vector,它们在IEEE 1076和IEEE 1164标准的程序包中定义。,38,VHDL语言的数据类型,数据类型的限定 有时候根据上下文能判断出某一数据的类型,例如: signal a: std_logic_vector(7 downto 0); a yy=”10111111”; ,39,数据类型转换,为了不同数据类型之间的运算,必须将它们转换成同一的数据类型。VHDL不同的程序包提供了转换函数。,40,数据类型转换举例,dataout = conv_std_logic_vector( conv_integer(datain)*fullout)/ff),8);,VHDL语言的运算符,42,VHDL语言的运算符,VHDL语言提供了四种基本运算操作 逻辑运算(Logic) 关系运算(Relational) 算术运算(Arithmetic) 连接运算(Concatenation)。,43,逻辑运算(Logic),not(取反)、and(与)、or(或)、nand(与非)、nor(或非)、xor(异或)、xnor(异或非) 一般情况下对于只有and、or、xor的情况下可以不加括号,其他情况下应该加括号,44,关系运算(Relational),=(等于)、=(不等于)、(大于)和=(大于等于) 操作结果为BOOLEAN型:TRUE或FALSE 特别当心“=”(小于等于)和“=”(信号赋值),45,算术运算(Arithmetic),*(指数)、abs(绝对值)、*(乘)、(除)、mod(求模)、rem(取余)、+(正号)、-(负号)、+(加)、-(减)、SLL(逻辑左移)、SRL(逻辑右移)、SLA(算术左移)、SRA(算术右移)、ROL(逻辑循环左移)、ROR(逻辑循环右移) 一般只有+(加)、-(减)、*(乘)能被综合为对应的逻辑电路,其他运算很难 不同的运算,其操作数的类型有不同的要求,具体请参考相关资料 移位操作符为二元运算符,左操作数必须为BIT或BOOLEAN型的一维数组,右操作数为整数,46,连接运算(Concatenation),并置运算符“,47,操作运算符,运算符的优先级,48,VHDL语言的词法,注释 注释在VHDL语言中是以两短横线“-”开始直到本行程序末尾的一段文字 数字 可以表示成十进制,也可以表示成二进制、八进制或十六进制;数字既可以是整数,也可以是实数 字符和字符串 位串就是用双引号括起来的数字序列 B”10111101” O”275” X”BD”,VHDL语言程序的结构,50,结构组成,一个完整的VHDL语言程序通常被称为实体。,51,结构组成,52,VHDL语言的基本设计单元,53,组成框架,从数字系统的角度理解,54,一个设计中通常包括的几个部分,(1)库(Library) (2) 程序包(Package) (3)实体说明(Entity Declaration) (4)结构体(Architecture Body) (5)配置(Configuration),55,库(Library),库(Library):用来存放已经编译过的实体说明、结构体、程序包和配置。 库中的各元素可以用做其他设计的资源 若要引用库中已编译好的单元,需在VHDL设计的程序开始说明引用的库。格式如下: LIBRARY ,56,库(Library),说明引用库后,还要说明要使用库中的哪一个设计单元,用USE语句。 USE ALL 程序包名就是实际设计要使用的库中的设计单元。 ALL表示使用程序包中的所有项目。,57,库(Library),专门存放预先编译好的程序包的地方 库对应着一个目录,在这个目录中有许多预编译好的程序包 用户自建的库即为设计文件所在的目录,默认为当前的工作库:WORK库。 库名与目录名的对应关系可在编译软件中指定 VHDL中的两个符合IEEE的标准库“STD”和“ieee”,58,标准库中的程序包,59,关于库的说明,STD库是默认的标准库,即默认是可见的,因此可以省去库的声明 IEEE库虽得到了IEEE的认可,却常常被认为是用户的库,因此使用时需要声明 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;,60,几种常见的库,STD库 IEEE库 WORK库 ASIC库 用户自定义的库,61,关于库的说明,Altera在Quartus II软件系统中还提供了LPM库: Megafunctions Primitives others,62,关于库的说明,LPM库:参数化的模块库 使用不同的端口 指定不同的参数 Library lpm; Use lpm.lpm_components.all,63,LPM库举例,LIBRARY ieee; USE ieee.std_logic_1164.all; LIBRARY lpm; USE lpm.lpm_components.all; ENTITY tst_mux IS PORT (a : in std_logic_2d (3 downto 0, 15 downto 0); sel : in std_logic_vector(1 downto 0); y : out std_logic_vector (15 downto 0); END tst_mux; ARCHITECTURE behavior OF tst_mux IS BEGIN u1: lpm_mux GENERIC MAP(lpm_width = 16, lpm_size = 4, lpm_widths = 2) PORT MAP (data = a, sel = sel, result = y); END behavior;,64,实体说明(Entity Declaration),描述一个设计的外貌,即定义对外的输入输出接口以及一些参数定义 格式如下: ENTITY 实体名 IS GENERIC ( 类属表 ); PORT ( 端口表 ); END ENTITY 实体名;,65,实体说明之 类属参数说明,为设计实体指定参数,如用来定义端口宽度、器件延时参数等 格式如下: GENERIC(CONSTANT参数名:数据类型:=静态表达式,); 例如:GENERIC(delay : time);表示参数名delay是时间类型的,在结构体中将delay初始化成不同的数值从而满足实际的需要。 例如:GENERIC(n : INTEGER ); 表示参数名n是整数类型的,66,类属参数说明实例,ENTITY ex1 IS GENERIC ( wlength : integer:= 8; alength : integer:= 3); PORT( clk : IN STD_LOGIC; data : OUT STD_LOGIC_VECTOR(wlength-1 downto 0); add : OUT STD_LOGIC_VECTOR(alength-1 downto 0); END ex1;,67,实体说明之 PORT(端口)说明,对一个设计实体界面的说明及对设计实体与外部电路的接口通道的说明,包括对每一接口的输入输出模式和数据类型的定义。 格式如下: PORT ( 端口名 : 端口模式 数据类型 ; 端口名 : 端口模式 数据类型 ) ; 端口名是设计者为实体的每一个对外通道所取的名字 端口模式用于定义端口上数据的流动方向和方式,68,端口模式,IN:IN定义的通道为单向只读模式,规定数据只能通过此端口被读入实体中。 OUT:OUT定义的通道为单向输出模式,规定数据只能通过此端口从实体向外流出,或者说可以将实体中的数据向此端口赋值。,69,端口模式,INOUT:定义端口为双向(输入输出) 即从端口的内部看,可以对此端口进行赋值,也可以通过此端口读入外部的数据信息 从端口的外部看,信号既可以从此端口流出,也可以向此端口输入信号,如RAM的数据端口,单片机的I/O口。在实际电路描述中,INOUT模式的正确使用还应该考虑其它因素。 建议少用INOUT模式 定义双向端口占用了更多的硬件资源 有些开发环境并不支持该模式 不要用该模式代替其它模式,70,端口模式,BUFFER:BUFFER的功能与INOUT类似,区别在于当需要输入数据时,只允许内部回读输出的信号,即允许反馈。如计数器的设计,可将计数器输出的计数信号回读,以作下一计数值的初值。与INOUT模式相比,BUFFER回读(输入)的信号不是由外部输入的,而是由内部产生,向外输出的信号。,71,端口模式,LINKAGE:方向未定(即任何方向均可连接使用),72,关于信号方向,IN,IN,IN,OUT,BUFFER,INOUT,OUT,73,数据类型,VHDL作为一种强类型语言,任何一种数据对象(信号、变量、常数)必须严格限定其取值范围,即对其传输或存储的数据类型作明确的界定。 常见的数据类型主要有STD_LOGIC(标准逻辑位)、STD_LOGIC_vector(标准逻辑位向量)、BIT(逻辑位)、BIT_VECTOR(位向量)。 BIT数据类型的信号规定的取值范围是逻辑位1和0。在VHDL中,逻辑位0和1的表达必须加单引号 ,否则VHDL综合器将0和1解释为整数数据类型INTEGER。,74,数据类型,BIT数据类型可以参与逻辑运算或算术运算,其结果仍是位的数据类型。VHDL综合器用一个二进制位表示BIT。 BIT数据类型定义在VHDL标准程序包STANDARD中,而程序包STANDARD包含于VHDL标准库STD中。这是系统默认的库。 STD_LOGIC(标准逻辑位)、STD_LOGIC_vector(标准逻辑位向量)数据类型的定义包含在IEEE库的包集合STD_LOGIC_1164中,因此需要用包集合的说明语句说明:USE STD_LOGIC_1164.ALL;,75,实体说明部分,实体说明部分放在端口说明部分的下面,主要作用是说明设计实体接口中的公共信息。 例如,可以用来定义结构体需要用到的新的数据类型、信号以及常量等。 实体说明部分有时候还会包括断言语句、过程调用语句和被动进程语句等并发语句。但是,这些语句不能包含信号赋值语句。,76,“实体说明”的几点说明,以VHD为后缀名的文件名要求与实体名一致。 端口定义的每一行以“;”结尾,但最后一行定义完后没有分号,分号在括号的外面。 以“-”开始到本行结束为注释行,77,“实体说明”举例,触发器的实体: ENTITY DFF1 IS PORT( CLK:IN STD_LOGIC; D:IN STD_LOGIC; Q:OUT STD_LOGIC ); END DFF1; -87标准,也可以写成ENDENTITY DFF1,这是93标准,78,“实体说明”举例,3-8译码器的实体: ENTITY decoder IS PORT( datain: IN STD_LOGIC_VECTOR(2 DOWNTO 0); g1,g2a,g2b: IN STD_LOGIC; y:OUT STD_LOGIC_vector(7 downto 0); END decoder;,79,“实体说明”举例,流水线加法器 ENTITY add_lp is GENERIC(WIDTH :integer:=15; WIDTH1:integer:=7; WIDTH2:integer:=8; ONE : integer:=1); PORT(x,y:IN STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0); sum: out STD_LOGIC_VECTOR(WIDTH-1 DOWNTO 0); clk:IN std_logic); END ENTITY add_lp;,80,结构体(Architecture Body),能被仿真的实体都包含有结构体 一个实体和其对应的结构体构成一个完整的VHDL设计,一个实体可以有多个结构体。 不同的结构体可以采用不同的描述方式 结构体的命名只要符合标识符的规定就可以。但是结构体一般采用行为/寄存器/结构描述方式,因此按照见名知义的要求,其名字一般为behave/rtl/structure。,81,结构体(Architecture Body),结构体一般包括声明区(Declarations)和并发语句区两个部分组成。 声明区用于声明该结构体内使用的类型、常数、元件、子程序等。 并发语句区用来描述结构体的行为和连接关系。并发语句的类型主要有块语句、进程语句、信号赋值、子程序调用、元件例化语句。 结构体部分包含了VHDL的很多元素,掌握好它们是灵活应用VHDL的关键。,82,结构体的一般形式,ARCHITECTURE OF IS -声明区,声明结构体内所用的内部信号及数据类型 -若使用元件例化,则声明所用的元件 BEGIN -CONCURRENT SIGNAL ASSIGNMENTS; -PROCESS; -COMPONENT INSTANTIATIONS; END ;,83,Tips,实体和结构体分别是以“END ENTITY xxx;”和“END ARCHITECTURE xx;”语句结尾的,这是符合VHDL的IEEE STD 1076_1993版的语法要求的。 若根据VHDL87版本,IEEE STD 1076_1987的语法要求,这两条结尾语句只需写成“END;”和“END xx;”。但考虑到目前绝大多数常用的EDA工具中的VHDL综合器都兼容两种VHDL版本的语法规则,且许多最新的VHDL方面的资料,仍然使用VHDL87版本语言规则。,84,结构体举例十进制计数器,ARCHITECTURE BEHAVE OF COUNTER IS SIGNAL CNT STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS(CLK) BENGIN IF(RISING_EDGE(CLK) IF(CNT = ”1001”) THEN CNT = ”0000”; ELSE CNT = CNT + 1; END IF; END IF; END PROCESS; END BEHAVE;,85,结构体举例二选一电路,二选一电路mux21a的实体和结构体如下面的图所示。,86,结构体举例二选一电路,ENTITY mux21a IS PORT ( a, b : IN BIT; s : IN BIT; y : OUT BIT ); END ENTITY mux21a; ARCHITECTURE STRUCTURE OF mux21a IS SIGNAL d,e : BIT; BEGIN d = a AND (NOT S) ; e = b AND s ; y = d OR e ; END ARCHITECTURE STRUCTURE ;,87,程序包(Package),程序包定义了一组数据类型说明、常量说明、元件说明和子程序说明,以供其他多个设计引用。如同C语言中的头文件(*.H)。 通过引用程序包,使得程序包中的说明对引用的实体成为可见 程序包有事先定义好的,也有用户定义的。 引用程序包时,使用USE语句,放在设计的开始。 如 USE IEEE.STD_LOGIC_1164.ALL;,88,创建用户自己的程序包,1.程序包说明部分 PACKAGE logic IS TYPE three_level_logic IS (0,L,Z); CONSTANT unknown_value: three_level_logic :=0; FUNCTION invert(INPUT: three_level_logic) RETURN three_level_logic); END logic;,89,创建用户自己的程序包,2.程序包体部分 PACKAGE BODY logic IS -如下是函数invert的子程序体 FUNCTION invert(INPUT: three_level_logic) RETURN three_level_logic); BEGIN CASE input IS WHEN 0= RETURN 1; WHEN 1= RETURN 0; WHEN Z= RETURN Z; END CASE; END invert; END logic;,90,创建用户自己的程序包,3.使用程序包 用USE语句使得unknown_value和invert对实体说明成为可见: USE Logic.three_level_logic.unknown_value; USE Logic.three_level_logic.invert; 或者使用关键字ALL,使得程序包中的所有元素可见: USE Logic.ALL;,91,常见的程序包,(1)程序包standard (2)程序包textio (3)程序包std_logic_1164 (4)程序包numeric_std (5)程序包numeric_bit (6)std_logic_arith (7)std_logic_unsigned,92,配置(Configuration),描述层与层之间的连接关系以及实体与结构体之间的连接关系 格式如下: CONFIGURATION 配置名 OF 实体名 IS 语句说明(选配的结构体名) END 配置名,VHDL语言的描述语句,94,描述语句的种类,并发描述语句 并发语句用来描述各模型算法之间的连接关系 根据信号发生变化的顺序执行 顺序描述语句 语句按照出现的先后顺序依次执行 描述电路的行为关系,95,并发语句,实际的数字电路、数字系统中,许多操作是并发执行的; VHDL作为一种广泛使用的硬件描述语言,应该能够描述数字系统中的各种操作和行为; 为了描述数字系统中的这种并发操作,VHDL提供了并行语句; VHDL的结构体由一个或者多个并行语句构成; 并行语句的书写顺序不代表它们的执行顺序; 并行语句的执行顺序由它们的触发事件来决定。,96,并发描述语句,ARCHITECTURE 结构体名 OF 实体名 IS -说明语句 BEGIN -并发语句 END ARCHITECTURE 结构体名,97,并发描述语句,进程(Process)语句 并发信号代入(Concurrent Signal Assignment)语句 条件信号代入(Conditional Signal Assignment)语句 选择信号代入(Selective Signal Assignment)语句 并发过程调用(Concurrent)语句 块(Block)语句 Generate语句 Component语句,98,进程语句,VHDL中最重要、使用最频繁的结构体描述语句 进程与进程之间是并行关系; 进程内定义了一组连续执行的顺序语句; 结构体的进程模型:,99,进程语句,对一个数字系统进行系统建模时,通常将数字系统描述成一个并发执行的多个进程所构成的网络模型; 构成网络模型的各个进程的执行是并发的,而进程内部的各个语句则是顺序执行的; 各个进程之间通过信号或共享变量进行通信。,一个结构体可以有多个进程 进程之间是并发执行的 进程之间通过信号进行通信,100,进程(Process),进程(Process)语句的格式: 进程名:Process(信号1,信号2,) Begin -顺序执行语句; end process 进程名;,101,进程语句,敏感信号量表 敏感信号是指那些值发生改变后能够引起进程语句执行的信号。 可以是输入信号或是信号量 任意敏感信号发生改变,PROCESS就会执行一遍 进程的运行依赖于敏感表或WAIT参数的变化 隐含信号量表PROCESS后括号中的信号量表 显式敏感信号在PROCESS中的WAIT语句 一个进程中不能既有敏感表又有WAIT语句,102,进程(Process)示例,隐含敏感信号 p1:process(a,b) Begin and2= a and b; end process p1;,显式敏感信号 p1:process Begin and2= a and b; wait on a,b; end process p1;,103,Entity test1 is port (clk, d , reset : in bit; q : out bit); end test1;,architecture test1_body of test1 is Begin process (clk, d, reset) begin if (reset = 1) then q = 0; elsif (clk = 1) then q = d; end if; end process; end test1_body;,进程语句示例,104,进程语句示例,Entity test1 is port (clk, d , reset : in bit; q : out bit); end test1;,architecture test1_body of test1 is begin process (clk) begin if (reset = 1) then q = 0; elsif (clk = 1) then q = d; end if; end process; end test1_body;,105,进程内部的语句是顺序执行的,Process(sel,a,b) Begin f=a; If sel=1 then f=b; end if; End process;,Process(sel,a,b) Begin If sel=1 then f=b; end if; f=a; End process;,结果 f总是等于a,106,并发信号代入语句,处于结构体之中但在进程语句之外 格式: 赋值目标 = 表达式; “=”称为信号带入操作符 并发信号代入语句是靠事件来驱动的,因此对于并发信号代入语句来说,只有当赋值符号“=”右边的对象上有事件发生时才会执行该语句。,107,并发信号代入语句,例如 ARCHITECTURE DEPICT OF MYDES IS BEGIN SUM = A XOR B; CARRIER = A AND B; END,108,条件信号代入(Conditional Signal Assignment)语句,条件信号代入(Conditional Signal Assignment)语句的格式如下: 目的信号量= 表达式1 when 条件1 else 表达式2 when 条件2 else 表达式n-1 when 条件n-1 else 表达式n;,109,条件信号代入,Entity test1 is port (in1, in2, in3, in4 : in bit; sel1, sel2 : in bit; d : out bit); end test1; architecture test1_body of test1 is begin d = in1 when sel1 = 0 and sel2 = 0 else in2 when sel1 = 0 and sel2 = 1 else in3 when sel1 = 1 and sel2 = 0 else in4; end test1_body;,110,选择信号代入(Selective Signal Assignment)语句,With 表达式 select 目标信号量=表达式1 when 条件1, 表达式2 when 条件2, 表达式n when 条件n;,111,选择信号代入,Entity test1 is port (in1, in2, in3, in4 : in bit; sel : in integer; out1 : out bit); end test1; architecture test1_body of test1 is begin with sel select out1 = in1 when 0; in2 when 1; in3 when 2; in4 when 3; end test1_body;,112,Component语句,如果已经在VHDL语言某个模块中定义了逻辑电路后,就可以在其他的模块中调用该逻辑电路,将此称之为设计元件模块化。 调用工作库中不存在的元件的步骤 元件的创建 引用元件 元件说明 元件例化,113,元件的创建,创建就是完整的描述一个电路*.VHD 例如: LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY half_adder IS PORT( a,b : IN STD_LOGIC; sum : OUT STD_LOGIC; c : OUT STD_LOGIC); END ENTITY half_adder; ARCHITECTURE depict OF half_adder IS BEGIN sum = NOT (a XOR (NOT b); c = a AND b; END depict;,114,Component说明,Component语句的说明格式如下: COMPONENT GENERIC ; PORT ; END COMPONENT; 元件说明通常放在结构体的声明区(声明SIGNAL的地方) 声明的目的: 为了引用元件,115,元件例化,为了把引用的元件嵌入到高一层的结构体描述中,就必须把被引用的元件端口信号与结构体中的相应端口信号正确地连接起来元件例化 元件例化语句 GENERIC MAP(参数映射) PORT MAP(端口映射);,116,元件例化,PORT MAP语句中的端口信号对应方法有两种: (a)位置对应:在PORT MAP语句中说明的端口信号位置与被调用的元件中说明的端口信号位置之间一一对应 (b)名称对应:将被调用的元件中说明的端口信号名称赋予在PORT MAP语句中说明的各端口信号,117,port map,位置对应法 U1:u_and2 port map( din1, din2, dout); 名称对应法 U1: u_and2 port map (a = din1, b= din2, c= dout );,118,COMPONENT示例,P117 结构体中的元件声明 结构体中的元件例化 U1:half_adder PORT MAP(ain,bin,sout1,cout1); U2:half_adder PORT MAP(sout1,cin,sumout,cout2); U3:or_gate PORT MAP(a = cout1, b = cout2, c = cout);,119,顺序描述语句,顺序语句按照出现的顺序依次执行 出现的位置:进程或子结构内部 顺序语句: WAIT语句 变量赋值语句 信号代入语句 IF语句 Case语句 Loop语句 Next语句 Exit语句 断言语句 NULL语句,120,WAIT语句,可以显式地说明敏感信号(区别于进程隐式地说明敏感信号) WAIT语句可以以多条件的形式出现。其效果等同于各件的“或”,即只要有任何一个条件满足,就结束等待,转而执行WAIT语句下面的一条语句。 示例: WAIT ON clk , reset;,121,WAIT语句,122,变量赋值语句,变量只能在进程或子结构中使用,其作用域不能到进程或子结构之外。 变量赋值语句的格式为: 目标变量 := 表达式;,123,信号代入语句,信号代入语句出现在进程或子程序中时是作为顺序语句来使用 信号代入语句出现在进程外或BLOCK块内作为并发语句来使用 信号代入语句的格式为: 目的信号量 = 表达式;,124,“:=”与“=”的差别,操作对象的差别:变量/信号量 作用范围的差别: 进程/子结构内部 结构体内部、进程/子结构之间 作用时效的差别 变量一经赋值,则马上有效; 信号代入的执行和信号值的更新之间至少有 延迟,只有延迟过后信号才能得到新值,否则保持原值。 示例:P100,125,IF语句,If 条件 then 顺序语句; Else 顺序语句; End if;,If 条件 then 顺序语句; Elsif 条件 then 顺序语句; Elsif 条件 then 顺序语句; Else 顺序语句; End if;,If 条件 then 顺序语句; End if;,126,IF语句,IFTHEN语句经常用来描述具有控制端口的硬件电路以及对时钟的边沿判断。 IFTHENELSE语句经常用来描述具有两条不同功能分支的硬件电路,如二选一电路、三态门电路等。 IFTHENELSIFELSE语句经常用来描述具有多控制条件的硬件电路。由于顺序语句顺序执行的特点,其条件判断就形成了前后的优先级。,127,IF语句,单分支示例 电平敏感D锁存器 PROCESS( clk , d ) BEGIN IF (clk =1 ) THEN q = d; END IF; ENF PROCESS;,128,IF语句,双分支示例 二选一电路(P101) 多分支电路 优先编码器(P102) 似乎很简单,接着往下看,129,实例分析,假设,要描述一个与门电路: 有很多种描述方法。,130,方法1:直接信号赋值,在结构体内,很直观地直接进行赋值: Architecture behav of And2 is Begin y = a and b; End behav;,131,方法2:进程直接信号赋值,这种方法直接等效于方法1。 注意要将a和b都加入敏感信号表。 Architecture behav of And2 is Begin process( a, b ) begin y = a and b; end process; End behav;,132,方法3:进程if条件赋值,经过分析发现,只有a和b都为1的时候,y才会输出1,其它情况下y为0。所以描述如下: Architecture behav of And2 is

温馨提示

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

评论

0/150

提交评论