VHDL设计初步(EVITA版).ppt

上传人:小飞机 文档编号:5452204 上传时间:2023-07-08 格式:PPT 页数:247 大小:2.11MB
返回 下载 相关 举报
VHDL设计初步(EVITA版).ppt_第1页
第1页 / 共247页
VHDL设计初步(EVITA版).ppt_第2页
第2页 / 共247页
VHDL设计初步(EVITA版).ppt_第3页
第3页 / 共247页
VHDL设计初步(EVITA版).ppt_第4页
第4页 / 共247页
VHDL设计初步(EVITA版).ppt_第5页
第5页 / 共247页
点击查看更多>>
资源描述

《VHDL设计初步(EVITA版).ppt》由会员分享,可在线阅读,更多相关《VHDL设计初步(EVITA版).ppt(247页珍藏版)》请在三一办公上搜索。

1、1,VHDL 设计初步,云南大学信息学院电子信息技术基础实验教学中心周克峰 谢戈 余江,2,3声明信号,3.1外部信号与内部信号外部(external)信号把系统与外部环境连接起来,形成系统的接口(端口)。在 entity 中声明。内部(internal)信号对系统外部不可见,完全嵌入在系统内部,是内部结构的一部分,在内部电路之间提供信号。在 architecture 中声明。,3,entity.-外部信号声明.end entity.,architecture.-内部信号声明.end architecture.,4,3.2声明接口信号把系统与外部环境连接起来的信号,在VHDL中称为端口,定义在

2、系统 entity 部分的 port 子句中在 entity 内,每一个信号都定义为一个端口每一个信号都必须有一个唯一的信号名,以及一个类型port 还必须具有信号流方向的指示,即 mode,5,3.3端口模式 mode5种:in、out、inout、buffer、linkagemode 应该明确声明,否则默认为 inVHDL中,每个端口都要指定一个适当的 mode语法:port_name:mode port_type所有端口用一个 port 子句,声明之间用分号(;)分隔。最后的一个没有分号。,6,entity.-外部信号声明 port(a,b,c:in Bit;DATA:in Bit_ve

3、ctor(0 to 7);RESULT:inout Bit_vector(0 to 7);z:in Bit;EXTBUS:out Bit_vector(4 downto 0);end entity.,7,3.4内部信号声明与外部信号在 entity 中声明对应,内部信号在architecture 中描述必须在每个声明中使用 signal,与其它对象区分端口声明中 signal 不是必须的内部信号不需要 mode 声明,8,architecture.-内部信号声明 signal x,y:Bit;signal INTBUS:Bit_vector(0 to 4);.end architecture.

4、,9,3.5内部信号的可见性信号的可见性(visibility)由声明的位置决定:package 中声明的,所有使用包的设计单元可见entity 中声明的,指定的 architecture 中可见architecture 中声明的,只对该结构可见结构内部的 block 中声明的,只对这个模块可见,10,Signal,11,4练习,一条 8 位的总线,用标准类型 byte 来表示。连接系统及其外部环境的信号定义为 port。总线宽度由定义中的位的顺序隐含地确定。对VHDL信号的前一个值进行检查是有可能的。在向量中定义的位顺序并不重要。,12,4练习(续一),系统内部的信号在实体中声明为 gene

5、ric,因为它们必须 generated(被产生)出来。内部信号声明包括对信号名、模式和类型的声明。信号可以定义为:信息的传输者。如果信号在包中声明,然后由一个实体使用,那么同样必须在这个实体的结构中使用 use 子句。电子设备(比如计算机)中唯一的信号就是电子信号。,13,4练习(续二),实体中声明的信号,对所有指派给该实体的结构可见。总线与向量是同一概念的两种不同叫法。向量中位顺序的左边界必须始终小于右边界。每个端口必须指定一个端口模式。系统的所有信号都是在系统的实体中定义。,14,第 4 章,系统接口规范,15,1实体头部,1.1实体名称使用有意义的、最能表示系统用来做什么的、名词短语用

6、大、小写字母混合书写,16,标识符命名规则:必须在一行内写完必须以字母开始只能由字母、数字和下划线(_)组成不能以下划线开始或结束,也不能并排标识符中不能有空格不区分大、小写字母保留字不能用作标识符(包括特定名称在内)可以使用扩展标识符(由“”包围),17,实体名举例:Counter_4Bit Mux_4_To_1 ALU UART_Transmit Receiver,18,1.2VHDL中的注释没有文档、资料的设计不是好设计!以两个连字符(-)开始,到本行行尾结束可位于任何位置,但不能从标识符或保留字的中间开始,19,20,21,1.3系统说明文档设计曾经是VHDL开发的主要原因之一语言本身

7、不需要,源自习惯性,良好风格,广泛接受以注释的形式编写位于VHDL文件的开始处没有“标准”,但有几个基本要素,22,23,1.4结束实体entity 框架的最后一部分是实体的结束以 end 语句结束建议在 end 子句后加上:entity 和/或实体名以一个分号(;)结束本行!,24,2端口子句,2.1端口的含义定义:用于一个模块(如一个实体)与其外部环境之间进行动态通讯的通道。VHDL语言参考手册,25,端口组成部分:用 port 子句来定义可选的关键字 signal后面跟着一个逗号(,)的端口名端口模式(mode)端口的类型可选,对端口进行说明的注释可选,以“:=”符号为前导的端口初始值,

8、26,从例中可见:模式和类型相同的多个端口,可以在一条端口语句中声明,端口名之间用逗号(,)分隔多个端口声明可在同一条端口语句中完成,之间用分号(;)分隔port 子句中最后一个端口声明的后面,没有分号!,27,2.2端口模式由数据流通过端口的方向来指定。in只接收数据。信号可读,写非法。完全综合out只发送数据。信号可写,读非法。完全综合inout双向端口。信号可读、写。完全综合buffer类似于 inout。但只能写。能综合linkage双向端口。严格的读写约束,几乎不用。,28,29,2.3建立端口说明适当的端口说明,与良好的端口描述一样重要。尤其是在系统层次化的描述中具有能对功能给出一

9、些提示性的名称行末注释给出端口的一些其他信息,30,不好的实体举例,31,良好的实体举例,32,3类属子句,3.1什么是类属定义:用于将要从一个模块的外部环境传递静态信息到该模块内的通道。VHDL语言参考手册,33,类属为不同的参数提供常量值,就象从系统的外部看到的一样。类属声明必须放在系统实体内类属常用来说明一个常量值实际中,可以用于时序参数、循环计数器,34,35,3.2generic 子句类属在实体的 generic 子句中定义,位于实体的 port 子句之前类属子句由 generic 关键字和一个圆括号括起来的类属列表组成与端口类似,类属列表中的各个类属项用分号(;)分隔,36,类属声

10、明的组成:后面跟着一个逗号(,)的类属名类属的类型可选,以“:=”为前导的类属值。如果此时没给出,则必须在元件例化中给出可选,对类属进行说明的注释,37,38,39,3.3类属的应用(举例)类属可用于VHDL代码中的任何需要静态值的地方,强烈建议用类属和常量代替代码中的“硬编码”。Size数组、总线之类复合对象的大小、循环计数器,以及类似的应用Parameters电子设备描述中使用的任何时序参数,如:延迟、建立时间、保持时间、开关时间,40,类属应用举例:对象大小,41,类属应用举例2:循环计数器,42,类属应用举例3:时序参数,43,3.4练习,实体名可以出现在结束实体的子句的后面。一个端口

11、必定要么是输入端口,要么是输出端口。类属代码在仿真期间可以做动态地改变。注释以双连字符号(-)开始和结束。端口是实体与外部环境之间的静态通讯连接。,44,3.4练习(续一),端口模式指定了通过该端口的数据流的方向。类属支持从实体外部环境输入静态值到实体中。VHDL是对大小写敏感的语言。类属可用于同一实体中的端口声明(比如:总线宽度)。在VHDL中没有标识符可以含有空格。,45,3.4练习(续二),对每个类属都必须指定一个适当的模式。实体可以用“end;”子句来结束。端口就是信号。在行尾用注释对每个端口作出说明是VHDL语言标准要求的。VHDL允许定义端口的初始值。,46,第 5 章,描述系统行

12、为的VHDL概念,47,1内容简介,VHDL的基本数据类型改变输入(的)信号值的概念信号赋值常量,48,2非逻辑型的数据类型,2.1引言数字系统内部信息、数据的存储、传输、处理形式Bit、Bit_vector表示单个字符,8个二进制位表示存储器地址,至少20个二进制位(MB),49,位阵列:按字节(byte)或字(word)地址译码器:十六进制0 x000 x3FF控制逻辑:存取时间10 ns(100 MHz),50,标量(类)型(scalar)枚举(类)型(enumeration)物理(类)型(physical)复合(类)型(complex)文件类型(file)存取类型(access),51

13、,2.2标量类型总称,指的是:那些在任何时刻(瞬间)只具有单一数据值(single value)的数据类型所有的标量值都是有顺序的不是指定在一个范围之间,就是枚举列出,52,Boolean 类型FalseTrue与逻辑类型 Bit 是两个完全不同的类型False/True 不等于 0/1,53,Character 类型ISO 8859-1(Latin-1)8位字符集192个字符0、+、A、,54,55,Integer 类型 数值范围取决于具体实现(implementation)必须涵盖:-2147483647 to 2147483647 实际中,一般限定为完成类型的某个子集-12、0、2147

14、483646、-100、16,56,Real 类型(浮点类型,Floating Point)同样依赖于具体实现数据值用一个范围来定义(能实现的最小者)精度:能实现(十进制数)小数后6位0.0、1.000001、-1.0E5,57,枚举 类型用列表的方式把用到的数据值一一列出,58,59,2.3用户定义的枚举类型type FSMStates is(Idle,Fetch,Decode,Execute);,60,使用枚举需要注意:枚举类型声明中的值,必须“原模原样”一一列出,不能有省略号、双引号!,61,2.4物理类型VHDL中的特有,如:时间、间隔、电流、温度不仅给出对象的值,而且后面还有单位VH

15、DL中只预定义了 time描述性极强,但却不可综合,62,63,2.5预定义数组复合类型之一必须由类型相同的元素组成的、有规则的一种结构VHDL预定义数组:Bit_vector(元素类型为Bit)String(元素类型为Charactor),64,数组中元素的数量由数组的范围指定由左、右边界以及边界之间下标的方向表示无限范围,range type Real_Matrix_1 is array(POSITIVE range)of REAL;有限范围,(1 to 10)type Real_Matrix_2 is array(1 to 10)of REAL;对数组元素使用下标方式引用,65,type

16、 My_DATA_BUS is array(7 downto 0)of Bit;Signal DataBus:My_DATA_BUS;Signal DataBus:Bit_vector(7 downto 0);,66,数组元素定义时,单个的用单引号,多个的用双引号,67,2.6用户定义数组VHDL中,用户可以用任意的维数来声明一个数组。但是,超过三维的数组就变得不具可读性。二维数组的定义:signal name:array(d1,d2)of elemtype;-d1:维数1的下标范围,d2:维数2的下标范围,68,数组典型应用表示存储器(“向量之向量”),69,2.7记录复合类型之一可以由类型

17、不同的元素组成的、有规则的一种结构记录中的元素按名称引用(不按下标)record_name.element_name,70,71,3表达式与运算符,3.1简介表达式用于对输入信号进行一定的变换以产生输出信号表达式是由运算符及相应数目的操作数组成的公式运算符要求类型匹配的操作数,否则非法系统行为描述可看作是表达式的有序集合,72,3.2逻辑运算符and、or、nand、nor、xor、xnornot操作数:类型相同的 Bit、Bit_vector、Boolean结果:与操作数类型相同,73,3.3数值运算符+、-、*、/、mod、rem、*、abs操作数:类型相同的 Integer、Real(*

18、:第二操作数必须是Integer)对 time 类型:+、-两个数都要是 timetime值可“*”Integer或Real,或“/”Integer结果均是 time,74,75,76,77,78,3.4关系运算符=、/=、=操作数:相同类型的Boolean、Bit、Bit_vector、Character、Integer、Real、Time、String结果:总是 Boolean向量比较时的长度问题(左边第一位起),79,3.5移位运算符逻辑:SLL(左移)、SRL(右移)算术:SLA(左移)、SRA(右移)循环:ROL(左移)、ROR(右移)操作数:一维数组(向量)、Bit、Boolean

19、结果:与操作数相同SLL-n SRL n、ROR-n ROL n,80,81,3.6串联运算符(连接)&操作数:任意类型的一维数组、单个的值结果:与操作数相同,长度相加结果中的元素从左操作数开始,总长度与声明同,82,83,4直接信号赋值,4.1信号赋值表达式目标信号=赋值表达式赋值符号总是从右边指向左边!,84,x=y=z;-a=b or c;-k=1;-m=“0101”;-n=m-,85,4.2可延迟的赋值after子句可附加到所有信号赋值语句中赋值生效前必须经过一定的时间量,86,87,4.3惯性延迟inertial delay默认的延迟模型,after子句自动设置模型特性:若输入连续变

20、化的时间间隔小于延迟时间,则该输入变化将被忽略,88,89,90,91,92,4.4传输延迟transport加在信号值和after子句的前面模型特性:输入信号连续两次变化之间的时间间隔,不影响系统的响应,93,94,95,96,97,4.5两种模型比较惯性延迟不需要声明,传输延迟需要transport惯性延迟忽略比延迟短的脉冲,传输延迟传递所有变化两者都用after来定义延迟两者都可用于任何类型的信号,98,99,100,101,5常量,5.1声明常量通常,在结构中声明constant关键字常量名常量的类型声明在“:=”符号之后指定的常量值结束本行的分号(;),102,103,5.2常量的使

21、用主要目的:代替“硬编码”使用方法:与类属相同复杂对象的大小,如:数组、总线控制循环计数器指定时序参数,104,105,106,5.3常量与类属比较两者都传递静态信息,但类属可以动态使用,常量则不行两者在多个结构的情况下,值改变的影响范围不同声明位置及形式不同:类属在实体中,可以使用列表;常量一般在结构中,每个常量一个声明(多个constant)可见性上不同(由声明的位置决定),107,6练习,整个向量的值要写在双引号中,而向量片段(slice)的值则要写在单引号中。信号赋值的符号根据设计人员的需要不是指向左边就是指向右边()。常量可以用在表达式中。有限状态机的状态集合通常声明为一个枚举类型。

22、数组的所有元素必须是相同的类型。,108,6练习(续一),一个实数乘以一个整数的乘法在VHDL中是允许的。若信号线上的脉冲比延迟时间宽,则惯性延迟模型与传输延迟模型都将正确地给出相同的结果。标量类型不是用范围来定义,就是用它们的元素枚举来定义。如果新值与旧值相等,那么常量就可以被赋以这个新值。Boolean值True等价于Bit值1。,109,6练习(续二),声明常量时,指定其值就足够了,因为它的类型由这个值隐含决定。如果物理类型是标准的time类型,则其值是可综合的。运算符始终为特定的类型而定义。惯性延迟是VHDL中的默认延迟模式。逻辑运算符只能应用于单个的位。,110,第 6 章,用过程来

23、指定行为,111,过程(process)是什么?它如何定义和执行?过程的概念以及如何描述它的行为过程执行与程序执行的区别VHDL中第二个重要的对象变量(variable),及与信号的差别改变过程执行顺序的方法条件、分支、循环,112,1过程简介,1.1行为描述行为:把输入数据变换成输出结果的活动 行为描述:对输入数据如何变换成输出结果这一系统行为的描述,113,所以,行为描述是指:为了得到预期的结果而必须被执行的一系列操作。,114,1.2什么是过程?在为设计描述建立程序的同时,也给出了要一步一步完成、或者说要顺序完成的一系列动作。过程就是建立此类一系列顺序操作的形式方法(格式是非常有结构),

24、115,1.3过程的结构name:process(sensitivity list)declarationsbegin sequential statementsend process name;,116,过程结构举例:MUX2TO1:process(A,B,SEL)constant High:Bit:=1;begin Y=A;if(SEL=1)then Y=B;end if;end process MUX2TO1;,117,注意事项:process 和 begin 的后面没有分号过程内部声明的任何对象只能在过程内部可见信号(signal)不能在过程内部声明 所有语句都在 begin 和 en

25、d process 之间给出,并且顺序的执行,118,1.4过程的执行过程在无限循环中连续执行,永不结束!(end并不终止过程,只是一个分界符而已)。,119,1.5练习在一个过程的内部,声明任意VHDL对象都是合法的。过程的执行,从 begin 下面的第一条语句开始,在 end 前最后一条语句结束时终止。每个过程必须指定一个过程名。在 begin 和 end process 之间的所有语句,一条接着一条地执行。,120,2改变过程的执行,2.1过程挂起和恢复的必要性挂起(suspend)和恢复(resume)只是换一种说法挂起和恢复比“无限循环”更接近真实,121,VHDL中,用 wait

26、语句来描述挂起和恢复。wait 使过程挂起,等待条件的满足。若条件得到满足,则恢复过程,否则一直等待下去。,122,2.2wait 语句无条件地停止(挂起)过程的执行列出过程重新(恢复)运行的条件挂起的过程在恢复运行之前,必须等待列出的条件得到满足,123,wait 语句的运行,124,2.3不同类型的 wait 语句等待经过一定的时间等待布尔条件得到满足等待信号的值发生变化,125,wait for type_expression过程挂起一个指定的时间量。时间可以写成显式的,或者表达式(计算结果必须是 time 类型的值)。此类 wait 语句经常与测试台一起用来建模。wait for 10

27、 ns;wait for ClkPeriod/2;,126,wait until condition过程挂起,直到由于条件中涉及的信号发生改变从而使条件变成 True 为止。如果信号一直保持不变,那么即使当前的信号使得当前的条件为真,wait until 语句也不会重新恢复过程。wait until CLK=1;wait until CE and(not RST);,127,wait on sensitivity_list过程挂起,直到敏感列表中有信号发生改变时为止。也就是说,只有当敏感列表中有信号值改变时,过程才恢复。信号的值如何变化不用关注,只要改变就恢复过程。wait on CLK;wa

28、it on Enable,Data;,128,复合条件的 wait 语句如果混合使用上述的条件,就形成第四类 wait 语句。其中含有两种或三种不同形式的 wait 语句组合,必须满足全部条件才会重新恢复过程。wait on Data until CLK=1;wait until Clk=1 for 10 ns;,129,2.4不同位置的 wait 语句wait 语句可以出现在任意位置(通常,不是过程的开始处就是结尾处)若过程中的第一条语句就是 wait 语句,则过程将立即挂起(没有语句会被执行)若过程中的最后一条语句才是 wait 语句,则过程挂起之前,语句将会被执行。一个过程中可以有多条

29、wait 语句(用于测试台时),130,过程开始后立即挂起,一条语句也没有执行,在过程挂起前,所有语句都执行了一遍,131,2.5敏感列表为恢复过程专门提供的语言成分(waiting on)与过程结尾处的 wait on sensitivity_list完全相同紧接在 process 关键字后面给出(没有必须)若带有敏感列表,过种就不能再有任何 wait 语句,132,133,2.6敏感列表的工作等价关系,使过程一开始就执行了一遍然后,wait 语句使过程挂起直到敏感列表中的任意信号发生改变,过程恢复过程中所有的语句再次执行一遍(开始到结尾)然后,wait 语句再使过程挂起,134,3过程特有

30、对象变量,3.1过程中的信号信号不能在过程内部声明对信号的赋值只在过程挂起时才生效,之前,信号保持原值只有最后一次对信号的赋值有效(多次赋值没有意义),135,Signal1=0 Signal2=0 Signal3=0,136,3.2只有信号是不够的约束1不能在过程内部声明没有太大影响。需要能够在过程内部声明的对象约束2挂起后信号赋值才生效分析变得麻烦。需要能够立即赋值的对象约束3只有最后一次对信号的赋值有效不能保存中间数据。需要能够保存临时数据的对象结果:符合上述要求的对象就是变量(variable)!,137,D=2,138,3.3变量声明与赋值在过程内部声明,在过程内部使用在 proce

31、ss 与 begin 之间声明与信号声明类似,但使用关键字 variable 而不是 signal使用“:=”符号赋值,并且赋值立即生效可以根据需要多次赋值,139,D=2,典型,140,3.4信号与变量的比较属性信号:类型、值、时间;变量:类型、值声明信号:实体与结构中声明,可以赋初值,约束1变量:只能在过程和子程序内声明赋值信号:约束2、3,不允许自赋值变量:立即生效,可多次赋值,自赋值合法延迟信号:赋值可用 after 推迟,惯性延迟、传输延迟均可变量:推迟变量赋值非法没有任何延迟,141,4控制语句的执行顺序,4.1简介变化的环境条件用四类条件语句表现:if.then.-条件执行语句i

32、f.then.else.和 if.then.elsif.-具有选择性的条件执行语句case.-多项选择语句while.do.和 for.do.-循环语句(允许某些语句重复执行),142,文本化,143,图形化,144,4.2条件语句“有条件的操作”:只有满足了所给出的条件时才执行操作。if condition_met then execute_operations-如果“条件满足”,则“执行操作”,145,条件语句的使用:“条件满足”作为一个布尔表达式(结果不是false 就是 true);如果它是 true,则说明条件满足,那么 then 子句起作用在 then 子句后面有一系列要执行的操作

33、(即语句),每条语句后面跟着一个分号“;”要结束条件语句并将它与后面的其他语句分开,需要在紧接最后一条语句之后写出一条“end if”子句,146,147,4.3选择性条件语句如果一个条件满足,将采取某些动作,但如果条件不满足,则执行另一套操作。if.then.else.语句 if.then.elsif.语句请注意,在 elsif 关键字中间没有字母“e”!,148,149,4.4多项选择if.then.elsif.结构实际上是一个多重选择语句:允许根据所遇到的条件从几个分支中只选一个分支执行。case condition is when choices_1=.;when choices_2=

34、.;.when others=.;end case;,150,case 语句的使用:条件是一个值为离散型的表达式(任意的枚举或整数类型),或者是一个一维数组 每个可选的动作分组由 when choices=子句引导。其中的 choices 字段指出条件表达式的可能值,这些值可以是单个的值、值的范围或其它可能的事物。但是,它们之间不能互相重叠。,151,152,ProgrGate:process(Mode,PrGIn1,PrGIn2)begin case Mode is when“000”=PrGOut PrGOut PrGOut PrGOut PrGOut PrGOut PrGOut=0;en

35、d case;end process ProgrGate;,153,4.5条件循环只要开始处的条件为 true,循环就不断地反复执行(在最后一条语句完成后跳转到循环开头)while condition loop.;.;end loop;首先检测条件,若为 true 就执行循环内的语句;若为 false 就结束循环。(执行的控制权传递给紧跟其后的第一条语句。),154,举例:设计一个只要 level 信号为1就对CLK 的上升沿计数的计数器。,155,4.6使用计数器的循环有时,希望循环内的操作只重复给定的次数。for 循环比 while 循环更方便。for counter in range l

36、oop.;.;end loop;,156,for 循环的使用:条件不是布尔条件,而是一个命名计数器(指定了计数范围)。只要当前值在计数范围内,循环就不断重复。每次循环迭代后,计数器自动赋值为指定范围内的下一个计数值。(不能人为改变计数器的值)计数器不需要事先声明(在循环头部指定就相当于声明),在循环内部它被视作常量,可以用在赋值、下标或表达式中计数器的计数范围以枚举类型或子类型方式给出,157,158,4.7循环中断有时,希望在当前的循环中跳过一部分循环语句,直接进入这个循环的下一次迭代有时,即使循环条件为 true 也要求循环结束 next 语句 exit 语句 next when cond

37、ition;exit when condition;,159,160,5练习,由于过程是一个无限循环,因此,过程开始处的一条 wait 语句与结束处的一条 wait 语句起着相同的作用。条件语句必须用 endif 子句来结束。while 循环中的布尔条件每次迭代开始时都要检测。过程的执行在到达 end process 子句时停止。带有敏感列表的过程可以不包含任何 wait 语句。,161,5练习(续一),类型相同的信号与变量可以互相赋值。case 语句头部的表达式可以是离散类型的。过程是描述系统行为的顺序操作的规范。Next 语句导致执行跳转到循环后面的下一条语句。过程的名字在关键字 proc

38、ess 的后面指明。,162,5练习(续二),for 循环中的计数器是一个变量,必须在使用(它)的过程的开始处声明。wait 语句为挂起过程指定了条件。信号只有在过程挂起时才会被赋值。条件语句中 then 或 else 子句内的多条语句必须用 begin.end 界定符加以限制。信号和变量都可以用来保存过程内部的临时数据。,163,第 7 章,多重过程,164,内容简介,具有并发性的复杂系统描述:编写由并发执行过程组成的VHDL结构体并发信号赋值及其构成、功能和执行方法为什么过程中的信号赋值要在挂起时执行(驱动的概念)决断函数、多值逻辑、工业标准逻辑类型(std_logic和std_logic

39、_vector),165,1自然的同时性,1.1世界无序,166,1.2系统的并发本质,167,architecture 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 process HD;end architecture Example;,168

40、,1.3行为结构体的构造框架(模板)与实体发生联系对结构体作说明,给出名字及其主体边界。其中也包括对内部各个对象所做的说明。主体 具有并发结构完整地定义所有过程、并发赋值语句,它们均彼此独立地并发运行,169,170,1.4结构体的执行信号改变时,凡是敏感列表中包括该信号的所有过程都被恢复被恢复过程中的语句顺序地执行 各个过程中语句执行彼此独立,171,architecture Somearch of SomeEnt isbegin P1:process(A,B)begin Somestatement;Somestatement;Somestatement;Somestatement;end

41、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;,172,173,1.5过程间的信息传递不辨识信号是由外部(外部环境)还是由内部(内部声明)产生可以由同一结构体内的其它过程产生用来激活的信号,174,architecture SomeArch of SomeEnt is Signal D,E:bit;b

42、egin 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 Somestatement;Somestatement;Somestatement;end process P3;end architecture SomeArch;,175,2简化的过程并发

43、信号赋值,2.1过程简化允许用一个单行语句来定义单个赋值的过程,称为并发信号赋值(concurrent signal assignment)可以与过程一起同时出现在结构体内,而且与其它赋值语句并发执行,类似于过程一样,176,architecture SomeArch of SomeEnt issignal Int1,Int2:bit;begin Gate1:process(A,B)begin Int1=A or B;end process Gate1;Gate2:process(C,D)begin Int2=C or D;end process Gate2;,Gate3:process(In

44、t1,Int2)begin Out=Int1 and Int2;end process Gate3;end architecture SomeArch;,177,architecture SomeArch of SomeEnt issignal Int1,Int2:bit;begin Int1=A or B;Int2=C or D;Out=Int1 and Int2;end architecture SomeArch;,178,2.2并发信号赋值的激活并发信号赋值语句右侧任意一个信号发生改变都将激活该语句的执行并发信号赋值也可以用 after 语句来推迟,所使用的延迟模型不惯性延迟就是传输延迟

45、,179,architecture 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 Gates;,180,2.3条件信号赋值能够在结构体中使用 与条件语句在功能上是等价的条件信号赋值语句只能对信号赋值,而条件语句可用于任意类型的顺序语句当条件满足时用指定值对信号赋值,如果条件不满足(即else)则对信号赋其它的值,181,archit

46、ecture 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=A;else Z=B;end if;end process Mux;end architecture CondinProc;,182,2.4选择信号赋值有条件地从多个值中选一个来做将要赋的值能够在结构体中使用 与多项选择(case)语句在功能上是等价的选择信号赋

47、值语句只能对信号赋值,不能含有其它语句,183,architecture CaseBased of ProgrammableGate isbegin ProgrGate:process(Mode,PrGIn1,PrGIn2)begin case Mode is when“000”=PrGOut PrGOut PrGOut PrGOut PrGOut PrGOut PrGOut=0;end case;end process ProgrGate;end architecture CaseBased;,184,architecture SelBased of ProgrammableGate isb

48、egin with Mode select PrGOut=PrGIn1 and PrGIn2 when“000”,PrGIn1 or PrGIn2 when“001”,PrGIn1 nand PrGIn2 when“010”,PrGIn1 nor PrGIn2 when“011”,not PrGIn1 when“100”,not PrGIn2 when“101”,0 when others;end architecture CaseBased;,185,3驱动与信号属性,3.1驱动的概念VHDL为每一个将在过程中(被)赋值的信号建立一个驱动(driver)不管对信号赋了多少个值,每个过程的每个

49、信号都只有一个驱动,它只保存最后的一个值。所有的操作都对驱动完成,只是在过程挂起的时候,把驱动复制到信号。,186,Exproc:process(SigA,SigB)begin SigC=SigA;.SigC=SigB+1;end process Exproc;,敏感列表:SigA SigB,驱动器:Exproc_SigA=0 Exproc_SigB=0 Exproc_SigC=0,信号:SigA=0SigB=0SigC=0,187,3.2信号的历史和将来每个驱动分配一个计划输出波形(projected output waves),由一个或多个事务(transaction)序列组成事务则由信号

50、的值和时间组成,其中的时间表明了驱动将被赋以新值的时刻。(与同一个时间点相关联的延迟时间),188,SignalEx=0 after 2 s;1 after 5 s;0 after 6 s;1 after 8 s;,189,3.3信号的时间相关属性信号的历史记录用信号属性(attribute)来表示,每个属性都有一个属性名,并且这些属性能够根据信号历史自动更新。要获得信号属性的当前值,需要指定信号名称,后面跟着一个单撇号()和属性名,比如:CLKEvent。,190,191,192,3.4信号的其它属性VHDL为标量类、离散类、数组类、信号及(命名)实体等等不同类型的对象预定义了36个不同的属

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号