《VHDL设计初步(EVITA版).ppt》由会员分享,可在线阅读,更多相关《VHDL设计初步(EVITA版).ppt(247页珍藏版)》请在金锄头文库上搜索。
1、VHDL 设计初步设计初步云南大学信息学院电子信息技术基础实验教学中心周克峰 谢戈 余江3声明信号 3.1外部信号与内部信号外部(external)信号把系统与外部环境连接起来,形成系统的接口(端口)。在 entity 中声明。内部(internal)信号对系统外部不可见,完全嵌入在系统内部,是内部结构的一部分,在内部电路之间提供信号。在 architecture 中声明。2entity . - 外部信号声明 .end entity .architecture . - 内部信号声明 .end architecture .33.2声明接口信号把系统与外部环境连接起来的信号,在VHDL中称为端口,
2、定义在系统 entity 部分的 port 子句中在 entity 内,每一个信号都定义为一个端口每一个信号都必须有一个唯一的信号名,以及一个类型port 还必须具有信号流方向的指示,即 mode43.3端口模式 mode5种:in、out、inout、buffer、linkagemode 应该明确声明,否则默认为 inVHDL中,每个端口都要指定一个适当的 mode语法:port_name : mode port_type所有端口用一个 port 子句,声明之间用分号(;)分隔。最后的一个没有分号。5entity . - 外部信号声明 port ( a, b, c : in Bit; DAT
3、A : in Bit_vector (0 to 7); RESULT : inout Bit_vector (0 to 7); z : in Bit; EXTBUS : out Bit_vector (4 downto 0);end entity .63.4内部信号声明与外部信号在 entity 中声明对应,内部信号在architecture 中描述必须在每个声明中使用 signal,与其它对象区分端口声明中 signal 不是必须的内部信号不需要 mode 声明7architecture . - 内部信号声明 signal x, y : Bit; signal INTBUS : Bit_ve
4、ctor (0 to 4); . end architecture .83.5内部信号的可见性信号的可见性(visibility)由声明的位置决定:1.package 中声明的,所有使用包的设计单元可见2.entity 中声明的,指定的 architecture 中可见3.architecture 中声明的,只对该结构可见4.结构内部的 block 中声明的,只对这个模块可见9Signal 104练习 1.一条 8 位的总线,用标准类型 byte 来表示。2.连接系统及其外部环境的信号定义为 port。3.总线宽度由定义中的位的顺序隐含地确定。4.对VHDL信号的前一个值进行检查是有可能的。5
5、.在向量中定义的位顺序并不重要。114练习(续一) 6.系统内部的信号在实体中声明为 generic,因为它们必须 generated(被产生)出来。7.内部信号声明包括对信号名、模式和类型的声明。8.信号可以定义为:信息的传输者。9.如果信号在包中声明,然后由一个实体使用,那么同样必须在这个实体的结构中使用 use 子句。10.电子设备(比如计算机)中唯一的信号就是电子信号。124练习(续二) 11.实体中声明的信号,对所有指派给该实体的结构可见。12.总线与向量是同一概念的两种不同叫法。13.向量中位顺序的左边界必须始终小于右边界。14.每个端口必须指定一个端口模式。15.系统的所有信号都
6、是在系统的实体中定义。13第 4 章系统接口规范1实体头部 1.1实体名称使用有意义的、最能表示系统用来做什么的、名词短语用大、小写字母混合书写15标识符命名规则:必须在一行内写完必须以字母开始只能由字母、数字和下划线(_)组成不能以下划线开始或结束,也不能并排标识符中不能有空格不区分大、小写字母保留字不能用作标识符(包括特定名称在内)可以使用扩展标识符(由“”包围)16实体名举例: Counter_4Bit Mux_4_To_1 ALU UART_Transmit Receiver171.2VHDL中的注释没有文档、资料的设计不是好设计!以两个连字符(-)开始,到本行行尾结束可位于任何位置,
7、但不能从标识符或保留字的中间开始1819201.3系统说明文档设计曾经是VHDL开发的主要原因之一语言本身不需要,源自习惯性,良好风格,广泛接受以注释的形式编写位于VHDL文件的开始处没有“标准”,但有几个基本要素21221.4结束实体entity 框架的最后一部分是实体的结束以 end 语句结束建议在 end 子句后加上:entity 和/或实体名以一个分号(;)结束本行!232端口子句2.1端口的含义定义:用于一个模块(如一个实体)与其外部环境之间进行动态通讯动态通讯的通道。VHDL语言参考手册24端口组成部分:用 port 子句来定义可选的关键字 signal后面跟着一个逗号(,)的端口
8、名端口模式(mode)端口的类型可选,对端口进行说明的注释可选,以“:=”符号为前导的端口初始值25从例中可见:模式和类型相同的多个端口,可以在一条端口语句中声明,端口名之间用逗号(,)分隔多个端口声明可在同一条端口语句中完成,之间用分号(;)分隔port 子句中最后一个端口声明的后面,没有分号!262.2端口模式由数据流通过端口的方向来指定。in只接收数据。信号可读,写非法。完全综合out只发送数据。信号可写,读非法。完全综合inout双向端口。信号可读、写。完全综合buffer类似于 inout。但只能写。能综合linkage双向端口。严格的读写约束,几乎不用。27282.3建立端口说明适
9、当的端口说明,与良好的端口描述一样重要。尤其是在系统层次化的描述中具有能对功能给出一些提示性的名称行末注释给出端口的一些其他信息29不好的实体举例30良好的实体举例313类属子句3.1什么是类属定义:用于将要从一个模块的外部环境传递静态信息静态信息到该模块内的通道。VHDL语言参考手册32类属为不同的参数提供常量值,就象从系统的外部看到的一样。1.类属声明必须放在系统实体内2.类属常用来说明一个常量值3.实际中,可以用于时序参数、循环计数器33343.2generic 子句类属在实体的 generic 子句中定义,位于实体的 port 子句之前类属子句由 generic 关键字和一个圆括号括起
10、来的类属列表组成与端口类似,类属列表中的各个类属项用分号(;)分隔35类属声明的组成:后面跟着一个逗号(,)的类属名类属的类型可选,以“:=”为前导的类属值。如果此时没给出,则必须在元件例化中给出可选,对类属进行说明的注释3637383.3类属的应用(举例)类属可用于VHDL代码中的任何需要静态值的地方,强烈建议用类属和常量代替代码中的“硬编码”。Size数组、总线之类复合对象的大小、循环计数器, 以及类似的应用Parameters电子设备描述中使用的任何时序参数,如:延迟、建立时间、保持时间、开关时间39类属应用举例:对象大小40类属应用举例2:循环计数器41类属应用举例3:时序参数423.
11、4练习 1.实体名可以出现在结束实体的子句的后面。2.一个端口必定要么是输入端口,要么是输出端口。3.类属代码在仿真期间可以做动态地改变。4.注释以双连字符号(-)开始和结束。5.端口是实体与外部环境之间的静态通讯连接。433.4练习(续一) 6.端口模式指定了通过该端口的数据流的方向。7.类属支持从实体外部环境输入静态值到实体中。8.VHDL是对大小写敏感的语言。9.类属可用于同一实体中的端口声明(比如:总线宽度)。10.在VHDL中没有标识符可以含有空格。443.4练习(续二) 11.对每个类属都必须指定一个适当的模式。12.实体可以用“end;”子句来结束。13.端口就是信号。14.在行
12、尾用注释对每个端口作出说明是VHDL语言标准要求的。15.VHDL允许定义端口的初始值。45第 5 章描述系统行为的VHDL概念1内容简介1.VHDL的基本数据类型2.改变输入(的)信号值的概念3.信号赋值4.常量472非逻辑型的数据类型2.1引言数字系统内部信息、数据的存储、传输、处理形式Bit、Bit_vector表示单个字符,8个二进制位表示存储器地址,至少20个二进制位(MB)48位阵列:按字节(byte)或字(word)地址译码器:十六进制0x000x3FF控制逻辑:存取时间10 ns(100 MHz)49标量(类)型(scalar)枚举(类)型(enumeration )物理(类)
13、型(physical)复合(类)型(complex)文件类型(file)存取类型(access)502.2标量类型总称,指的是:那些在任何时刻(瞬间)只具有单一数据值(single value)的数据类型所有的标量值都是有顺序的不是指定在一个范围之间,就是枚举列出51Boolean 类型类型FalseTrue与逻辑类型 Bit 是两个完全不同的类型False/True 不等于 0/1 52Character 类型ISO 8859-1(Latin-1)8位字符集192个字符0、+、A、5354Integer 类型 数值范围取决于具体实现(implementation) 必须涵盖: -214748
14、3647 to 2147483647 实际中,一般限定为完成类型的某个子集 -12、0、2147483646、-100、1655Real 类型(浮点类型,Floating Point)同样依赖于具体实现数据值用一个范围来定义(能实现的最小者)精度:能实现(十进制数)小数后6位0.0、1.000001、-1.0E556枚举枚举 类型用列表的方式把用到的数据值一一列出57582.3用户定义的枚举类型type FSMStates is (Idle,Fetch,Decode,Execute);59使用枚举需要注意:枚举类型声明中的值,必须“原模原样”一一列出,不能有省略号、双引号!602.4物理类型V
15、HDL中的特有,如:时间、间隔、电流、温度不仅给出对象的值,而且后面还有单位VHDL中只预定义了 time描述性极强,但却不可综合描述性极强,但却不可综合61622.5预定义数组复合类型之一必须由类型相同的元素组成的、有规则的一种结构VHDL预定义数组:Bit_vector(元素类型为Bit)String(元素类型为Charactor)63数组中元素的数量由数组的范围指定由左、右边界以及边界之间下标的方向表示无限范围,range type Real_Matrix_1 is array (POSITIVE range ) of REAL;有限范围, (1 to 10)type Real_Matr
16、ix_2 is array (1 to 10) of REAL;对数组元素使用下标方式引用64type My_DATA_BUS is array (7 downto 0) of Bit;Signal DataBus : My_DATA_BUS;Signal DataBus : Bit_vector (7 downto 0);65数组元素定义时,单个的用单引号,多个的用双引号662.6用户定义数组VHDL中,用户可以用任意的维数来声明一个数组。但是,超过三维的数组就变得不具可读性。二维数组的定义:signal name : array (d1, d2) of elemtype;- d1:维数1的
17、下标范围,d2:维数2的下标范围67数组典型应用表示存储器(“向量之向量”)682.7记录复合类型之一可以由类型不同的元素组成的、有规则的一种结构记录中的元素按名称引用(不按下标)record_name.element_name69703表达式与运算符3.1简介表达式用于对输入信号进行一定的变换以产生输出信号表达式是由运算符及相应数目的操作数组成的公式运算符要求类型匹配的操作数,否则非法系统行为描述可看作是表达式的有序集合713.2逻辑运算符and、or、nand、nor、xor、xnornot操作数:类型相同的 Bit、Bit_vector、Boolean结果:与操作数类型相同723.3数值
18、运算符+、-、*、/、mod、rem、*、abs操作数:类型相同的 Integer、Real(*:第二操作数必须是Integer)对 time 类型:+、- 两个数都要是 timetime值可“*”Integer或Real,或“/”Integer结果均是 time73747576773.4关系运算符=、/=、=操作数:相同类型的Boolean、Bit、Bit_vector、Character、Integer、Real、Time、String结果:总是 Boolean向量比较时的长度问题(左边第一位起)783.5移位运算符逻辑:SLL(左移)、SRL(右移)算术:SLA(左移)、SRA(右移)循
19、环:ROL(左移)、ROR(右移)操作数:一维数组(向量)、Bit、Boolean结果:与操作数相同SLL -n SRL n、ROR -n ROL n79803.6串联运算符(连接)&操作数:任意类型的一维数组、单个的值结果:与操作数相同,长度相加结果中的元素从左操作数开始,总长度与声明同81824直接信号赋值4.1信号赋值表达式目标信号 = 赋值表达式赋值符号总是从右边指向左边!83x = y = z;-a = b or c;-k = 1;-m = “0101”;-n = m & k;-844.2可延迟的赋值after子句可附加到所有信号赋值语句中赋值生效前必须经过一定的时间量85864.3
20、惯性延迟inertial delay默认的延迟模型,after子句自动设置模型特性:若输入连续变化的时间间隔小于延迟时间,则该输入变化将被忽略87888990914.4传输延迟transport加在信号值和after子句的前面模型特性:输入信号连续两次变化之间的时间间隔,不影响系统的响应92939495964.5两种模型比较惯性延迟不需要声明,传输延迟需要transport惯性延迟忽略比延迟短的脉冲,传输延迟传递所有变化两者都用after来定义延迟两者都可用于任何类型的信号9798991005常量5.1声明常量通常,在结构中声明constant关键字常量名常量的类型声明在“:=”符号之后指定的
21、常量值结束本行的分号(;)1011025.2常量的使用主要目的:代替“硬编码”使用方法:与类属相同复杂对象的大小,如:数组、总线控制循环计数器指定时序参数1031041055.3常量与类属比较两者都传递静态信息,但类属可以动态使用,常量则不行两者在多个结构的情况下,值改变的影响范围不同声明位置及形式不同:类属在实体中,可以使用列表;常量一般在结构中,每个常量一个声明(多个constant)可见性上不同(由声明的位置决定)1066练习1.整个向量的值要写在双引号中,而向量片段(slice)的值则要写在单引号中。2.信号赋值的符号根据设计人员的需要不是指向左边就是指向右边()。3.常量可以用在表达
22、式中。4.有限状态机的状态集合通常声明为一个枚举类型。5.数组的所有元素必须是相同的类型。1076练习(续一)6.一个实数乘以一个整数的乘法在VHDL中是允许的。7.若信号线上的脉冲比延迟时间宽,则惯性延迟模型与传输延迟模型都将正确地给出相同的结果。8.标量类型不是用范围来定义,就是用它们的元素枚举来定义。9.如果新值与旧值相等,那么常量就可以被赋以这个新值。10.Boolean值True等价于Bit值1。1086练习(续二)11.声明常量时,指定其值就足够了,因为它的类型由这个值隐含决定。12.如果物理类型是标准的time类型,则其值是可综合的。13.运算符始终为特定的类型而定义。14.惯性
23、延迟是VHDL中的默认延迟模式。15.逻辑运算符只能应用于单个的位。109第 6 章用过程来指定行为过程(process)是什么?它如何定义和执行?l过程的概念以及如何描述它的行为l过程执行与程序执行的区别lVHDL中第二个重要的对象变量(variable),及与信号的差别l改变过程执行顺序的方法条件、分支、循环1111过程简介1.1行为描述行为:把输入数据变换成输出结果的活动 行为描述:对输入数据如何变换成输出结果这一系统行为的描述 112所以,行为描述是指:为了得到预期的结果而必须被执行的一系列操作。 1131.2什么是过程?在为设计描述建立程序的同时,也给出了要一步一步完成、或者说要顺序
24、完成的一系列动作。 过程就是建立此类一系列顺序操作的形式方法(格式是非常有结构 ) 1141.3过程的结构name : process ( sensitivity list ) declarationsbegin sequential statementsend process name;115过程结构举例:MUX2TO1 : process ( A, B, SEL ) constant High : Bit := 1;begin Y = A; if (SEL = 1) then Y .; when choices_2 = .; . when others = .; end case; 149
25、case 语句的使用:条件是一个值为离散型的表达式(任意的枚举或整数类型),或者是一个一维数组 每个可选的动作分组由 when choices = 子句引导。其中的 choices 字段指出条件表达式的可能值,这些值可以是单个的值、值的范围或其它可能的事物。但是,它们之间不能互相重叠但是,它们之间不能互相重叠。 150ProgrGate : process (Mode,PrGIn1,PrGIn2) begin case Mode is when “000” = PrGOut PrGOut PrGOut PrGOut PrGOut PrGOut PrGOut = 0; end case; end
26、 process ProgrGate;1524.5条件循环只要开始处的条件为 true,循环就不断地反复执行 (在最后一条语句完成后跳转到循环开头 )while condition loop .; .; end loop;首先检测条件,若为 true 就执行循环内的语句;若为 false 就结束循环。(执行的控制权传递给紧跟其后的第一条语句。) 153举例:设计一个只要 level 信号为1就对CLK 的上升沿计数的计数器。1544.6使用计数器的循环有时,希望循环内的操作只重复给定的次数 。for 循环比 while 循环更方便。for counter in range loop .; .;
27、 end loop;155for 循环的使用:条件不是布尔条件,而是一个命名计数器(指定了计数范围)。只要当前值在计数范围内,循环就不断重复。每次循环迭代后,计数器自动赋值为指定范围内的下一个计数值。(不能人为改变计数器的值) 计数器不需要事先声明(在循环头部指定就相当于声明),在循环内部它被视作常量,可以用在赋值、下标或表达式中计数器的计数范围以枚举类型或子类型方式给出 1561574.7循环中断有时,希望在当前的循环中跳过一部分循环语句,直接进入这个循环的下一次迭代有时,即使循环条件为 true 也要求循环结束 next 语句 exit 语句 next when condition;exi
28、t when condition;1581595练习1.由于过程是一个无限循环,因此,过程开始处的一条 wait 语句与结束处的一条 wait 语句起着相同的作用。 2.条件语句必须用 endif 子句来结束。 3.while 循环中的布尔条件每次迭代开始时都要检测。 4.过程的执行在到达 end process 子句时停止。 5.带有敏感列表的过程可以不包含任何 wait 语句。 1605练习(续一)6.类型相同的信号与变量可以互相赋值。 7.case 语句头部的表达式可以是离散类型的。 8.过程是描述系统行为的顺序操作的规范。 9.Next 语句导致执行跳转到循环后面的下一条语句。 10.
29、过程的名字在关键字 process 的后面指明。 1615练习(续二)11.for 循环中的计数器是一个变量,必须在使用(它)的过程的开始处声明。 12.wait 语句为挂起过程指定了条件。 13.信号只有在过程挂起时才会被赋值。 14.条件语句中 then 或 else 子句内的多条语句必须用 begin.end 界定符加以限制。 15.信号和变量都可以用来保存过程内部的临时数据。 162第 7 章多重过程内容简介具有并发性的复杂系统描述:编写由并发执行过程组成的VHDL结构体并发信号赋值及其构成、功能和执行方法为什么过程中的信号赋值要在挂起时执行(驱动的概念)决断函数、多值逻辑、工业标准逻
30、辑类型(std_logic和std_logic_vector) 1641自然的同时性1.1世界无序1651.2系统的并发本质 166architecture Example of Microcomp isbegin CPU : process begin . end process CPU; Memory : process begin . end process Memory; I_O : process begin . end process I_O; Floppy : process begin . end process Floppy; HD : process begin . end
31、 process HD;end architecture Example;1671.3行为结构体的构造框架(模板) 与实体发生联系对结构体作说明,给出名字及其主体边界。其中也包括对内部各个对象所做的说明。 主体 具有并发结构完整地定义所有过程、并发赋值语句,它们均彼此独立地并发运行1681691.4结构体的执行信号改变时,凡是敏感列表中包括该信号的所所有有过程都被恢复被恢复过程中的语句顺序地执行 各个过程中语句执行彼此独立 170architecture Somearch of SomeEnt isbegin P1 : process (A,B) begin Somestatement; So
32、mestatement; Somestatement; Somestatement; end process P1; P2 : process (A,C) begin Somesatement; Somesatement; Somesatement; end process P2; P3 : process (B) begin Somesatement; Somesatement; end process P3;end architecture Somearch;1711721.5过程间的信息传递不辨识信号是由外部(外部环境)还是由内部(内部声明)产生可以由同一结构体内的其它过程产生用来激活的
33、信号 173architecture SomeArch of SomeEnt is Signal D,E : bit;begin P1 : process (A,B,C) begin Somestatement; Somestatement; D = someexpression; end process P1; P2 : process (A,C) begin Somestatement; Somestatement; Somestatement; E = someexpression; end process P2; P3 : process (B,D) begin Somestateme
34、nt; Somestatement; Somestatement; end process P3;end architecture SomeArch;1742简化的过程并发信号赋值 2.1过程简化允许用一个单行语句来定义单个赋值的过程,称为并发信号赋值(concurrent signal assignment)可以与过程一起同时出现在结构体内,而且与其它赋值语句并发执行,类似于过程一样 175architecture SomeArch of SomeEnt issignal Int1,Int2 : bit;begin Gate1 : process (A,B) begin Int1 = A o
35、r B; end process Gate1; Gate2 : process (C,D) begin Int2 = C or D; end process Gate2;Gate3 : process (Int1,Int2)begin Out = Int1 and Int2;end process Gate3;end architecture SomeArch;176architecture SomeArch of SomeEnt issignal Int1,Int2 : bit;begin Int1 = A or B; Int2 = C or D; Out = Int1 and Int2;e
36、nd architecture SomeArch;1772.2并发信号赋值的激活并发信号赋值语句右侧任意一个信号发生改变都将激活该语句的执行并发信号赋值也可以用 after 语句来推迟,所使用的延迟模型不惯性延迟就是传输延迟 178architecture Gates of Mux2to1 is signal AOK,BOK,NS : bit;begin AOK = A and S after 1 ns; BOK = B and NS after 1 ns; NS = not S after 1 ns; Z = AOK or BOK after 1 ns;end architecture Ga
37、tes;1792.3条件信号赋值能够在结构体中使用 与条件语句在功能上是等价的条件信号赋值语句只能对信号赋值,而条件语句可用于任意类型的顺序语句当条件满足时用指定值对信号赋值,如果条件不满足(即else)则对信号赋其它的值 180architecture Conditional of Mux2to1 isbegin z = A when s = 1 else B;end architecture Conditional;architecture CondinProc of Mux2to1 isbegin Mux : process (A,B,S) begin if S = 1 then Z =
38、 A; else Z PrGOut PrGOut PrGOut PrGOut PrGOut PrGOut PrGOut = 0; end case; end process ProgrGate;end architecture CaseBased;183architecture SelBased of ProgrammableGate isbegin with Mode select PrGOut = PrGIn1 and PrGIn2 when “000”, PrGIn1 or PrGIn2 when “001”, PrGIn1 nand PrGIn2 when “010”, PrGIn1
39、nor PrGIn2 when “011”, not PrGIn1 when “100”, not PrGIn2 when “101”, 0 when others;end architecture CaseBased;1843驱动与信号属性3.1驱动的概念VHDL为每一个将在过程中(被)赋值的信号建立一个驱动(driver) 不管对信号赋了多少个值,每个过程的每个信号都只有一个驱动,它只保存最后的一个值。所有的操作都对驱动完成,只是在过程挂起的时候,把驱动复制到信号。 185Exproc : process (SigA,SigB)begin SigC = SigA; . SigC = Sig
40、B + 1;end process Exproc;敏感列表:SigA SigB 驱动器:Exproc_SigA = 0 Exproc_SigB = 0 Exproc_SigC = 0 信号:SigA = 0SigB = 0SigC = 01863.2信号的历史和将来每个驱动分配一个计划输出波形 (projected output waves),由一个或多个事务(transaction)序列组成事务则由信号的值和时间组成,其中的时间表明了驱动将被赋以新值的时刻。(与同一个时间点相关联的延迟时间 )187SignalEx = 0 after 2 s; 1 after 5 s; 0 after 6
41、s; 1 after 8 s;1883.3信号的时间相关属性信号的历史记录用信号属性(attribute)来表示,每个属性都有一个属性名,并且这些属性能够根据信号历史自动更新。要获得信号属性的当前值,需要指定信号名称,后面跟着一个单撇号()和属性名,比如:CLKEvent。 189190时间(s)012345678SignalEx000001101SignalExTransactionfalsefalsetruefalsefalsetruetruefalsetrueSignalExEventfalsefalsefalsefalsefalsetruetruefalsetrueSignalExLa
42、st_Eventmax timemax timemax timemax timemax time0010SignalExLast_Value0000001001913.4信号的其它属性VHDL为标量类、离散类、数组类、信号及(命名)实体等等不同类型的对象预定义了36个不同的属性用户还可以定义自己的属性,近乎无限地扩展VHDL集合 在VHDL中,属性应用相当频繁192属性应用1:边沿检测if CLKevent- 上升沿 and CLK = 1 and CLKlast_value = 0then .if CLKevent- 下降沿 and CLK = 0 and CLKlast_value = 1
43、then .193属性应用2:通用循环if i in DataArrrange- 正向 loop .if i in DataArrreverse_range - 反向 loop .194属性应用3:MSB(或LSB)的下标ArrayTypeleft- MSB的下标ArrayTyperight- LSB的下标195属性应用4:数据建立时间if CLKevent and CLK = 1 and CLKlast_value = 0then SetupViolated := SomeSignallast_event SetupTime;end if;1964决断决断4.1多(驱动)源信号具有多个(数据
44、来)源的信号在大量的应用中存在很难预先确定:一个“多驱动源”的信号是否始终都将只由一个单一的“源”来驱动?当几个源同时流向同一根信号线时,为了确定所得到的值,需要为多源信号建立一种决定最终结果的方法 1971984.2多驱动源信号必须决断决断: 一个具有多驱动源的信号在同一时间可能被两个或多个源同时驱动 ,这种多个信号的“混合”在VHDL中称为决断(resolving)。决断函数: 信号值混合的规则被定义为一张表格,称为决断函数(resolving function)。表格按行和列列出所有可能的信号值,而表格中的单元格则含有如果两个值混合将产生什么值的说明。 1992004.3二值逻辑决断20
45、14.3二值逻辑决断未决断的类型(象Bit和Bit_vector)不能用于多驱动源的信号,因此,二值逻辑数据类型不够用来决断 逻辑数据的类型要有多于两个以上的值该类型要为所有信号组合定义一个决断函数2024.4多值逻辑有时,信号具有什么值并不重要,此时,信号值用“不关心”(dont care)表示三态缓冲器用“高阻”(high impedance)状态来“断开”驱动源与信号线的连接,这个状态既不是0也不是1偶然,系统可能具有“未赋值”(unassigned)或“未知”(unknown)值,这不同于“不关心”值 203std_ulogic 类型 standard中的“bit”(在Std_Logi
46、c_1164包中定义)std_ulogic_vector 类型 “bit_vector”(在Std_Logic_1164包中定义)一套为它们而定义的基本逻辑操作ulogic中的字符“u”表示“未决断类型”(unresolved type)之意。这样的值不能与具有多驱动源的信号一起使用。 204TYPE std_ulogic IS ( U, - Uninitialized X, - Forcing 0 or 1 0, - Forcing 0 1, - Forcing 1 Z, - High Impedance W, - Weak 0 or 1 L, - Weak 0 (for ECL open
47、emitter) H, - Weak 1 (for ECL open emitter) -, - dont care );TYPE std_ulogic_vector IS (NATURAL RANGE ) OF std_ulogic;205library IEEE; use IEEE.Std_Logic_1164.all;and、nand、or、nor、xor 和 not上升沿/下降沿(检测)函数 (rising_edge 和 falling_edge) 206if rising_edge (CLK) then Q = D;end if;if ( CLKevent and CLK = 1 a
48、nd CLKlast_value = 0 ) then Q En, In2 = Clk, Out1 = IntClk); latch : entity work.Dlatch(Beh) port map (D = Din, Clk = IntClk, Q = Qout);end architecture Struct;219entity Dlatch_En is port (Din,Clk,En : in bit; Qout : out bit);end entity Dlatch_En;220architecture Struct of Dlatch_En is signal IntClk
49、: bit;begin gate : entity work.And2(Beh) port map (In1 = En, In2 = Clk, Out1 = IntClk); latch : entity work.Dlatch(Beh) port map (D = Din, Clk = IntClk, Q = Qout);end architecture Struct;221architecture Struct of Dlatch_En is signal IntClk : signal IntClk : bitbit; ;begin .end architecture Struct;22
50、2architecture Struct of Dlatch_En is .begin gate : entityentity workwork.And2(Beh).And2(Beh) . latch : entity work.entity work.Dlatch(Beh)Dlatch(Beh) .end architecture Struct;223 . gate : gate : entityentity workwork.And2(Beh).And2(Beh) .224 . gate : gate : entityentity workwork.And2(Beh).And2(Beh)
51、portport mapmap (In1 = En, (In1 = En, In2 = Clk, In2 = Clk, Out1 = IntClk); Out1 = IntClk); .225 . latch : latch : entityentity workwork.Dlatch(Beh).Dlatch(Beh) .226 . latch : latch : entityentity workwork.Dlatch(Beh).Dlatch(Beh) portport mapmap (D = Din, (D = Din, Clk = IntClk, Clk = IntClk, Q = Qo
52、ut); Q = Qout); .227VHDLVHDL结构描述所对应的逻辑原理图结构描述所对应的逻辑原理图2281.2结构描述的元素元件一:能够成为一个独立系统的元件,单独的、完整的 entity-architecture 对元件二:能够在结构体中用 component 声明来定义的元件例示语句(端口映射) 并发语句2291.3元件及元件例示元件:一个按 行为方式 或 结构方式 定义的任意模块元件在使用的时候必须进行实例化实例组成:instance_name : entity work.entity_name(architecture_name)230entity DlatchDlatch
53、is port (D,Clk : in bit; Q : out bit);end entity Dlatch;architecture BehBeh of Dlatch isbegin process (Clk,D) begin if Clk = 1 then Q En, (In1 = En, In2 = Clk, In2 = Clk, Out1 = IntClk); Out1 = IntClk); latchlatch : : entityentity work. work.DlatchDlatch( (BehBeh) ) portport mapmap (D = Din, (D = Di
54、n, Clk = IntClk, Clk = IntClk, Q = Qout); Q = Qout);end architecture Struct;entity And2And2 is port (In1,In2 : in bit; Out1 : out bit);end entity And2;architecture BehBeh of And2 isbegin Out1 ”符号明确表明对应关系位置关联232entity Dlatch_En is port (Din,Clk,En : in bit; Qout : out bit);end entity Dlatch_En;archit
55、ecture Struct of Dlatch_En is signal IntClk : bit;begin gate : entity work.And2(Beh) portport mapmap (In1 = En, (In1 = En, In2 = Clk, In2 = Clk, Out1 = IntClk); Out1 = IntClk); latch : entity work.Dlatch(Beh) portport mapmap (D = Din, (D = Din, Clk = IntClk, Clk = IntClk, Q = Qout); Q = Qout);end ar
56、chitecture Struct;entity And2And2 is port (In1,In2 : in bit; Out1 : out bit);end entity And2; .entity DlatchDlatch is port (D,Clk : in bit; Q : out bit);end entity Dlatch; .2332直接实体例示2.1直接例示描述结构化系统最简单的方法。唯一需要:编译好的、要实例化的元件描述(在库中)元件的例示语句234直接例示语句的组成:必须有强制性标记(实例名),后面跟着冒号(:)关键字 entity,后面跟着库名及元件描述中的实体名(元
57、件描述在 work 库中编译)可选,用圆括号括起来的元件描述中的结构体名。(多个结构体时才需要指定,否则省略)端口映射子句 port map (.);235entity DlatchDlatch is port (D,Clk : in bit; Q : out bit);end entity Dlatch;architecture BehBeh of Dlatch isbegin process (Clk,D) begin if Clk = 1 then Q En, (In1 = En, In2 = Clk, In2 = Clk, Out1 = IntClk); Out1 = IntClk);
58、 latchlatch : : entityentity work. work.DlatchDlatch( (BehBeh) ) portport mapmap (D = Din, (D = Din, Clk = IntClk, Clk = IntClk, Q = Qout); Q = Qout);end architecture Struct;entity And2And2 is port (In1,In2 : in bit; Out1 : out bit);end entity And2;architecture BehBeh of And2 isbegin Out1 = In1 and
59、In2 after 2 ns;end architecture Beh;236237- And2 -entity And2 is port (In1,In2 : in bit; Out1 : out bit);end entity And2;architecture Beh of And2 isbegin Out1 = In1 and In2 after 2 ns;end architecture Beh;- Or2 -entity Or2 is port (In1,In2 : in bit; Out1 : out bit);end entity Or2;architecture Beh of
60、 Or2 isbegin Out1 = In1 or In2 after 2 ns;end architecture Beh;- Nand2 -entity Nand2 is port (In1,In2 : in bit; Out1 : out bit);end entity Nand2;architecture Beh of Nand2 isbegin Out1 = In1 nand In2 after 2 ns;end architecture Beh;- Nor2 -entity Nor2 is port (In1,In2 : in bit; Out1 : out bit);end en
61、tity Nor2;architecture Beh of Nor2 isbegin Out1 = In1 nor In2 after 2 ns;end architecture Beh;238- Somesystem -entity Somesystem is port (.);end entity Somesystem;architecture Struct of Somesystem isbegin LastGate :LastGate : entity .entity . .end architecture Struct;- For And2 -entityentity workwor
62、k.And2.And2 portport mapmap (A,B,C); (A,B,C);- For Or2 -entityentity workwork.Or2.Or2 portport mapmap (A,B,C); (A,B,C);- For Nand2 -entityentity workwork.Nand2.Nand2 portport mapmap (A,B,C); (A,B,C);- For Nor2 -entityentity workwork.Nor2.Nor2 portport mapmap (A,B,C); (A,B,C);2392.1位置关联名称关联:明确给出端口与信号的对应关系位置关联:按端口声明的顺序给出信号名称(端口映射中只有信号名,不同的信号名顺序则有不同的对应关系)2402412422432442452462.3名称关联247