VHDL设计初步(EVITA版).ppt_第1页
VHDL设计初步(EVITA版).ppt_第2页
VHDL设计初步(EVITA版).ppt_第3页
VHDL设计初步(EVITA版).ppt_第4页
VHDL设计初步(EVITA版).ppt_第5页
已阅读5页,还剩242页未读 继续免费阅读

下载本文档

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

文档简介

VHDL 设计初步,云南大学信息学院 电子信息技术基础实验教学中心 周克峰 谢戈 余江,2,3 声明信号,3.1 外部信号与内部信号 外部(external)信号把系统与外部环境连接起来,形成系统的接口(端口)。在 entity 中声明。 内部(internal)信号对系统外部不可见,完全嵌入在系统内部,是内部结构的一部分,在内部电路之间提供信号。在 architecture 中声明。,3,entity . - 外部信号声明 . end entity .,architecture . - 内部信号声明 . end architecture .,4,3.2 声明接口信号 把系统与外部环境连接起来的信号,在VHDL中称为端口,定义在系统 entity 部分的 port 子句中 在 entity 内,每一个信号都定义为一个端口 每一个信号都必须有一个唯一的信号名,以及一个类型 port 还必须具有信号流方向的指示,即 mode,5,3.3 端口模式 mode 5种:in、out、inout、buffer、linkage mode 应该明确声明,否则默认为 in VHDL中,每个端口都要指定一个适当的 mode 语法:port_name : mode port_type 所有端口用一个 port 子句,声明之间用分号(;)分隔。最后的一个没有分号。,6,entity . - 外部信号声明 port ( a, b, c : in Bit; DATA : 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 .,7,3.4 内部信号声明 与外部信号在 entity 中声明对应,内部信号在architecture 中描述 必须在每个声明中使用 signal,与其它对象区分 端口声明中 signal 不是必须的 内部信号不需要 mode 声明,8,architecture . - 内部信号声明 signal x, y : Bit; signal INTBUS : Bit_vector (0 to 4); . end architecture .,9,3.5 内部信号的可见性 信号的可见性(visibility)由声明的位置决定: package 中声明的,所有使用包的设计单元可见 entity 中声明的,指定的 architecture 中可见 architecture 中声明的,只对该结构可见 结构内部的 block 中声明的,只对这个模块可见,10,Signal,11,4 练习,一条 8 位的总线,用标准类型 byte 来表示。 连接系统及其外部环境的信号定义为 port。 总线宽度由定义中的位的顺序隐含地确定。 对VHDL信号的前一个值进行检查是有可能的。 在向量中定义的位顺序并不重要。,12,4 练习(续一),系统内部的信号在实体中声明为 generic,因为它们必须 generated(被产生)出来。 内部信号声明包括对信号名、模式和类型的声明。 信号可以定义为:信息的传输者。 如果信号在包中声明,然后由一个实体使用,那么同样必须在这个实体的结构中使用 use 子句。 电子设备(比如计算机)中唯一的信号就是电子信号。,13,4 练习(续二),实体中声明的信号,对所有指派给该实体的结构可见。 总线与向量是同一概念的两种不同叫法。 向量中位顺序的左边界必须始终小于右边界。 每个端口必须指定一个端口模式。 系统的所有信号都是在系统的实体中定义。,第 4 章,系统接口规范,15,1 实体头部,1.1 实体名称 使用有意义的、最能表示系统用来做什么的、名词短语 用大、小写字母混合书写,16,标识符命名规则: 必须在一行内写完 必须以字母开始 只能由字母、数字和下划线(_)组成 不能以下划线开始或结束,也不能并排 标识符中不能有空格 不区分大、小写字母 保留字不能用作标识符(包括特定名称在内) 可以使用扩展标识符(由“”包围),17,实体名举例: Counter_4Bit Mux_4_To_1 ALU UART_Transmit Receiver,18,1.2 VHDL中的注释 没有文档、资料的设计不是好设计! 以两个连字符(-)开始,到本行行尾结束 可位于任何位置,但不能从标识符或保留字的中间开始,19,20,21,1.3 系统说明 文档设计曾经是VHDL开发的主要原因之一 语言本身不需要,源自习惯性,良好风格,广泛接受 以注释的形式编写 位于VHDL文件的开始处 没有“标准”,但有几个基本要素,22,23,1.4 结束实体 entity 框架的最后一部分是实体的结束 以 end 语句结束 建议在 end 子句后加上:entity 和/或实体名 以一个分号(;)结束本行!,24,2 端口子句,2.1 端口的含义 定义: 用于一个模块(如一个实体)与其外部环境之间进行动态通讯的通道。 VHDL语言参考手册,25,端口组成部分: 用 port 子句来定义 可选的关键字 signal 后面跟着一个逗号(,)的端口名 端口模式(mode) 端口的类型 可选,对端口进行说明的注释 可选,以“:=”符号为前导的端口初始值,26,从例中可见: 模式和类型相同的多个端口,可以在一条端口语句中声明,端口名之间用逗号(,)分隔 多个端口声明可在同一条端口语句中完成,之间用分号(;)分隔 port 子句中最后一个端口声明的后面,没有分号!,27,2.2 端口模式 由数据流通过端口的方向来指定。 in 只接收数据。信号可读,写非法。完全综合 out 只发送数据。信号可写,读非法。完全综合 inout 双向端口。信号可读、写。完全综合 buffer 类似于 inout。但只能写。能综合 linkage 双向端口。严格的读写约束,几乎不用。,28,29,2.3 建立端口说明 适当的端口说明,与良好的端口描述一样重要。尤其是在系统层次化的描述中 具有能对功能给出一些提示性的名称 行末注释给出端口的一些其他信息,30,不好的实体举例,31,良好的实体举例,32,3 类属子句,3.1 什么是类属 定义: 用于将要从一个模块的外部环境传递静态信息到该模块内的通道。 VHDL语言参考手册,33,类属为不同的参数提供常量值,就象从系统的外部看到的一样。 类属声明必须放在系统实体内 类属常用来说明一个常量值 实际中,可以用于时序参数、循环计数器,34,35,3.2 generic 子句 类属在实体的 generic 子句中定义,位于实体的 port 子句之前 类属子句由 generic 关键字和一个圆括号括起来的类属列表组成 与端口类似,类属列表中的各个类属项用分号(;)分隔,36,类属声明的组成: 后面跟着一个逗号(,)的类属名 类属的类型 可选,以“:=”为前导的类属值。如果此时没给出,则必须在元件例化中给出 可选,对类属进行说明的注释,37,38,39,3.3 类属的应用(举例) 类属可用于VHDL代码中的任何需要静态值的地方,强烈建议用类属和常量代替代码中的“硬编码”。 Size数组、总线之类复合对象的大小、循环计数器, 以及类似的应用 Parameters电子设备描述中使用的任何时序参数,如:延迟、建立时间、保持时间、开关时间,40,类属应用举例:对象大小,41,类属应用举例2:循环计数器,42,类属应用举例3:时序参数,43,3.4 练习,实体名可以出现在结束实体的子句的后面。 一个端口必定要么是输入端口,要么是输出端口。 类属代码在仿真期间可以做动态地改变。 注释以双连字符号(-)开始和结束。 端口是实体与外部环境之间的静态通讯连接。,44,3.4 练习(续一),端口模式指定了通过该端口的数据流的方向。 类属支持从实体外部环境输入静态值到实体中。 VHDL是对大小写敏感的语言。 类属可用于同一实体中的端口声明(比如:总线宽度)。 在VHDL中没有标识符可以含有空格。,45,3.4 练习(续二),对每个类属都必须指定一个适当的模式。 实体可以用“end;”子句来结束。 端口就是信号。 在行尾用注释对每个端口作出说明是VHDL语言标准要求的。 VHDL允许定义端口的初始值。,第 5 章,描述系统行为的VHDL概念,47,1 内容简介,VHDL的基本数据类型 改变输入(的)信号值的概念 信号赋值 常量,48,2 非逻辑型的数据类型,2.1 引言 数字系统内部信息、数据的存储、传输、处理形式Bit、Bit_vector 表示单个字符,8个二进制位 表示存储器地址,至少20个二进制位(MB),49,位阵列:按字节(byte)或字(word) 地址译码器:十六进制 0x000x3FF 控制逻辑:存取时间 10 ns(100 MHz),50,标量(类)型(scalar) 枚举(类)型(enumeration ) 物理(类)型(physical) 复合(类)型(complex) 文件类型(file) 存取类型(access),51,2.2 标量类型 总称,指的是:那些在任何时刻(瞬间)只具有单一数据值(single value)的数据类型 所有的标量值都是有顺序的 不是指定在一个范围之间,就是枚举列出,52,Boolean 类型 False True 与逻辑类型 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、2147483646、-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中的特有,如:时间、间隔、电流、温度 不仅给出对象的值,而且后面还有单位 VHDL中只预定义了 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 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 记录 复合类型之一 可以由类型不同的元素组成的、有规则的一种结构 记录中的元素按名称引用(不按下标) record_name.element_name,70,71,3 表达式与运算符,3.1 简介 表达式用于对输入信号进行一定的变换以产生输出信号 表达式是由运算符及相应数目的操作数组成的公式 运算符要求类型匹配的操作数,否则非法 系统行为描述可看作是表达式的有序集合,72,3.2 逻辑运算符 and、or、nand、nor、xor、xnor not 操作数:类型相同的 Bit、Bit_vector、Boolean 结果:与操作数类型相同,73,3.3 数值运算符 +、-、*、/、mod、rem、*、abs 操作数:类型相同的 Integer、Real(*:第二操作数必须是Integer) 对 time 类型: +、- 两个数都要是 time time值可“*”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 结果:与操作数相同 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子句自动设置 模型特性: 若输入连续变化的时间间隔小于延迟时间,则该输入变化将被忽略,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,104,105,106,5.3 常量与类属比较 两者都传递静态信息,但类属可以动态使用,常量则不行 两者在多个结构的情况下,值改变的影响范围不同 声明位置及形式不同:类属在实体中,可以使用列表;常量一般在结构中,每个常量一个声明(多个constant) 可见性上不同(由声明的位置决定),107,6 练习,整个向量的值要写在双引号中,而向量片段(slice)的值则要写在单引号中。 信号赋值的符号根据设计人员的需要不是指向左边就是指向右边()。 常量可以用在表达式中。 有限状态机的状态集合通常声明为一个枚举类型。 数组的所有元素必须是相同的类型。,108,6 练习(续一),一个实数乘以一个整数的乘法在VHDL中是允许的。 若信号线上的脉冲比延迟时间宽,则惯性延迟模型与传输延迟模型都将正确地给出相同的结果。 标量类型不是用范围来定义,就是用它们的元素枚举来定义。 如果新值与旧值相等,那么常量就可以被赋以这个新值。 Boolean值True等价于Bit值1。,109,6 练习(续二),声明常量时,指定其值就足够了,因为它的类型由这个值隐含决定。 如果物理类型是标准的time类型,则其值是可综合的。 运算符始终为特定的类型而定义。 惯性延迟是VHDL中的默认延迟模式。 逻辑运算符只能应用于单个的位。,第 6 章,用过程来指定行为,111,过程(process)是什么?它如何定义和执行? 过程的概念以及如何描述它的行为 过程执行与程序执行的区别 VHDL中第二个重要的对象变量(variable),及与信号的差别 改变过程执行顺序的方法条件、分支、循环,112,1 过程简介,1.1 行为描述 行为:把输入数据变换成输出结果的活动 行为描述:对输入数据如何变换成输出结果这一系统行为的描述,113,所以,行为描述是指:为了得到预期的结果而必须被执行的一系列操作。,114,1.2 什么是过程? 在为设计描述建立程序的同时,也给出了要一步一步完成、或者说要顺序完成的一系列动作。 过程就是建立此类一系列顺序操作的形式方法(格式是非常有结构 ),115,1.3 过程的结构 name : process ( sensitivity list ) declarations begin sequential statements end 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 和 end process 之间给出,并且顺序的执行,118,1.4 过程的执行 过程在无限循环中连续执行,永不结束!(end并不终止过程,只是一个分界符而已)。,119,1.5 练习 在一个过程的内部,声明任意VHDL对象都是合法的。 过程的执行,从 begin 下面的第一条语句开始,在 end 前最后一条语句结束时终止。 每个过程必须指定一个过程名。 在 begin 和 end process 之间的所有语句,一条接着一条地执行。,120,2 改变过程的执行,2.1 过程挂起和恢复的必要性 挂起(suspend)和恢复(resume)只是换一种说法 挂起和恢复比“无限循环”更接近真实,121,VHDL中,用 wait 语句来描述挂起和恢复。wait 使过程挂起,等待条件的满足。若条件得到满足,则恢复过程,否则一直等待下去。,122,2.2 wait 语句 无条件地停止(挂起)过程的执行 列出过程重新(恢复)运行的条件 挂起的过程在恢复运行之前,必须等待列出的条件得到满足,123,wait 语句的运行,124,2.3 不同类型的 wait 语句 等待经过一定的时间 等待布尔条件得到满足 等待信号的值发生变化,125,wait for type_expression 过程挂起一个指定的时间量。时间可以写成显式的,或者表达式(计算结果必须是 time 类型的值)。 此类 wait 语句经常与测试台一起用来建模。 wait for 10 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; wait 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 语句,则过程挂起之前,语句将会被执行。 一个过程中可以有多条 wait 语句(用于测试台时),130,过程开始后立即挂起,一条语句也没有执行,在过程挂起前,所有语句都执行了一遍,131,2.5 敏感列表 为恢复过程专门提供的语言成分(waiting on) 与过程结尾处的 wait on sensitivity_list完全相同 紧接在 process 关键字后面给出(没有必须) 若带有敏感列表,过种就不能再有任何 wait 语句,132,133,2.6 敏感列表的工作 等价关系,使过程一开始就执行了一遍 然后,wait 语句使过程挂起 直到敏感列表中的任意信号发生改变,过程恢复 过程中所有的语句再次执行一遍(开始到结尾) 然后, wait 语句再使过程挂起,134,3 过程特有对象变量,3.1 过程中的信号 信号不能在过程内部声明 对信号的赋值只在过程挂起时才生效,之前,信号保持原值 只有最后一次对信号的赋值有效(多次赋值没有意义),135,Signal1 = 0 Signal2 = 0 Signal3 = 0,136,3.2 只有信号是不够的 约束1不能在过程内部声明 没有太大影响。需要能够在过程内部声明的对象 约束2挂起后信号赋值才生效 分析变得麻烦。需要能够立即赋值的对象 约束3只有最后一次对信号的赋值有效 不能保存中间数据。需要能够保存临时数据的对象 结果:符合上述要求的对象就是变量(variable)!,137,D = 2,138,3.3 变量声明与赋值 在过程内部声明,在过程内部使用 在 process 与 begin 之间声明 与信号声明类似,但使用关键字 variable 而不是 signal 使用“:=”符号赋值,并且赋值立即生效 可以根据需要多次赋值,139,D = 2,典型,140,3.4 信号与变量的比较 属性 信号:类型、值、时间; 变量:类型、值 声明 信号:实体与结构中声明,可以赋初值,约束1 变量:只能在过程和子程序内声明 赋值 信号:约束2、3,不允许自赋值 变量:立即生效,可多次赋值,自赋值合法 延迟 信号:赋值可用 after 推迟,惯性延迟、传输延迟均可 变量:推迟变量赋值非法没有任何延迟,141,4 控制语句的执行顺序,4.1 简介 变化的环境条件用四类条件语句表现: if.then. - 条件执行语句 if.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 子句后面有一系列要执行的操作(即语句),每条语句后面跟着一个分号“;” 要结束条件语句并将它与后面的其他语句分开,需要在紧接最后一条语句之后写出一条 “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 = .; . 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; end 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 loop .; .; end loop;,156,for 循环的使用: 条件不是布尔条件,而是一个命名计数器(指定了计数范围)。只要当前值在计数范围内,循环就不断重复。 每次循环迭代后,计数器自动赋值为指定范围内的下一个计数值。(不能人为改变计数器的值) 计数器不需要事先声明(在循环头部指定就相当于声明),在循环内部它被视作常量,可以用在赋值、下标或表达式中 计数器的计数范围以枚举类型或子类型方式给出,157,158,4.7 循环中断 有时,希望在当前的循环中跳过一部分循环语句,直接进入这个循环的下一次迭代 有时,即使循环条件为 true 也要求循环结束 next 语句 exit 语句 next when condition; exit when condition;,159,160,5 练习,由于过程是一个无限循环,因此,过程开始处的一条 wait 语句与结束处的一条 wait 语句起着相同的作用。 条件语句必须用 endif 子句来结束。 while 循环中的布尔条件每次迭代开始时都要检测。 过程的执行在到达 end process 子句时停止。 带有敏感列表的过程可以不包含任何 wait 语句。,161,5 练习(续一),类型相同的信号与变量可以互相赋值。 case 语句头部的表达式可以是离散类型的。 过程是描述系统行为的顺序操作的规范。 Next 语句导致执行跳转到循环后面的下一条语句。 过程的名字在关键字 process 的后面指明。,162,5 练习(续二),for 循环中的计数器是一个变量,必须在使用(它)的过程的开始处声明。 wait 语句为挂起过程指定了条件。 信号只有在过程挂起时才会被赋值。 条件语句中 then 或 else 子句内的多条语句必须用 begin.end 界定符加以限制。 信号和变量都可以用来保存过程内部的临时数据。,第 7 章,多重过程,164,内容简介,具有并发性的复杂系统描述: 编写由并发执行过程组成的VHDL结构体 并发信号赋值及其构成、功能和执行方法 为什么过程中的信号赋值要在挂起时执行(驱动的概念) 决断函数、多值逻辑、工业标准逻辑类型(std_logic和std_logic_vector),165,1 自然的同时性,1.1 世界无序,166,1.2 系统的并发本质,167,architecture Example of Microcomp is begin 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,1.3 行为结构体的构造 框架(模板) 与实体发生联系 对结构体作说明,给出名字及其主体边界。其中也包括对内部各个对象所做的说明。 主体 具有并发结构 完整地定义所有过程、并发赋值语句,它们均彼此独立地并发运行,169,170,1.4 结构体的执行 信号改变时,凡是敏感列表中包括该信号的所有过程都被恢复 被恢复过程中的语句顺序地执行 各个过程中语句执行彼此独立,171,architecture Somearch of SomeEnt is begin P1 : process (A,B) begin Somestatement; Somestatement; 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;,172,173,1.5 过程间的信息传递 不辨识信号是由外部(外部环境)还是由内部(内部声明)产生 可以由同一结构体内的其它过程产生用来激活的信号,174,architecture 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 Somestatement; Somestatement; Somestatement; end process P3; end architecture SomeArch;,175,2 简化的过程并发信号赋值,2.1 过程简化 允许用一个单行语句来定义单个赋值的过程,称为并发信号赋值(concurrent signal assignment) 可以与过程一起同时出现在结构体内,而且与其它赋值语句并发执行,类似于过程一样,176,architecture SomeArch of SomeEnt is signal 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 (Int1,Int2) begin Out = Int1 and Int2; end process Gate3; end architecture SomeArch;,177,architecture SomeArch of SomeEnt is signal Int1,Int2 : bit; begin Int1 = A or B; Int2 = C or D; Out = Int1 and Int2; end architecture SomeArch;,178,2.2 并发信号赋值的激活 并发信号赋值语句右侧任意一个信号发生改变都将激活该语句的执行 并发信号赋值也可以用 after 语句来推迟,所使用的延迟模型不惯性延迟就是传输延迟,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,architecture Conditional of Mux2to1 is begin z = A when s = 1 else B; end architecture Conditional;,architecture CondinProc of Mux2to1 is begin 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)语句在功能上是等价的 选择信号赋值语句只能对信号赋值,不能含有其它语句,183,architecture CaseBased of ProgrammableGate is begin 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 is begin 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) 不管对信号赋了多少个值,每个过程的每个信号都只有一个驱动,它只保存最后的一个值。所有的操作都对驱动完成,只是在过程挂起的时候,把驱动复制到信号。,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 = 0 SigB = 0 SigC = 0,187,3.2 信号的历史和将来 每个驱动分配一个计划输出波形 (projected output waves),由一个或多个事务(transaction)序列组成 事务则由信号的值和时间组成,其中的时间表明了驱动将被赋以新值的时刻。(与同一个时间点相关联的延迟时间 ),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个不同的属性 用户还可以定义自己的属性,近乎无限地扩展VHDL集合 在VHDL中,属性应用相当频繁,193,属性应用1:边沿检测,if CLKevent - 上升沿 and CLK = 1 and CLKlast_value = 0 then . if CLKevent - 下降沿 and CLK = 0 and CLKlast_value = 1 then .,194,属性应用2:通用循环,if i in DataArrrange - 正向 loop . if i in DataArrreverse_range - 反向 loop .,195,属性应用3:MSB(或LSB)的下标,ArrayTypeleft - MSB的下标 ArrayTyperight - LSB的下标,196,属性应用4:数据建立时间,if CLKevent and CLK = 1 and CLKlast_value = 0 then SetupViolated := SomeSignallast_event SetupTime; end if;,197,4 决断,4.1 多(驱动)源信号 具有多个(数据来)源的信号在大量的应用中存在 很难预先确定:一个“多驱动源”的信号是否始终都将只由一个单一的“源”来驱动? 当几个源同时流向同一根信号线时,为了确定所得到的值,需要为多源信号建立一种决定最终结果的方法,198,199,4.2 多驱动源信号必须决断 决断: 一个具有多驱动源的信号在同一时间可能被两个或多个源同时驱动 ,这种多个信号的“混合”在VHDL中称为决断(resolving)。 决断函数: 信号值混合的规则被定义为一张表格,称为决断函数(resolving function)。表格按行和列列出所有可能的信号值,而表格中的单元格则含有如果两个值混合将产生什么值的说明。,200,201,4.3 二值逻辑决断,202,4.3 二值逻辑决断 未决断的类型(象Bit和Bit_vector)不能用于多驱动源的信号,因此,二值逻辑数据类型不够用来决断 逻辑数据的类型要有多于两个以上的值 该类型要为所有信号组合定义一个决断函数,203,4.4 多值逻辑 有时,信号具有什么值并不重要,此时,信号值用“不关心”(dont care)表示 三态缓冲器用“高阻”(high impedance)状态来“断开”驱动源与信号线的连接,这个状态既不是0也不是1 偶然,系统可能具有“未赋值”(unassigned)或“未知”(unknown)值,这不同于“不关心”值,204,std_ulogic 类型 standard中的“bit” (在Std_Logic_1164包中定义) std_ulogic_vector 类型 “bit_vector” (在Std_Logic_1164包中定义) 一套为它们而定义的基本逻辑操作 ulogic中的字符“u”表示“未决断类型”(unresolved type)之意。这样的值不能与具有多驱动源的信号一起使用。,205,TYPE 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 emitter) H, - Weak 1 (for ECL open emitter) -, - dont care );,TYPE std_ulogic_vector IS (NATURAL RANGE ) OF std_ulogic;,206,library IEEE; use IEEE.Std_Logic_1164.all; and、nand、or、nor、xor 和 not 上升沿/下降沿(检测)函数 (rising

温馨提示

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

评论

0/150

提交评论