第11章 VHDL设计初步_第1页
第11章 VHDL设计初步_第2页
第11章 VHDL设计初步_第3页
第11章 VHDL设计初步_第4页
第11章 VHDL设计初步_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

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

文档简介

1、vhdl 设计初步物理科学与电子工程系参考资料v1 潘松,黄继业. eda技术实用教程. 北京,科学出版社. 2002v2潘松,黄继业. 现代dsp技术. 西安,西安电子科技大学出版社. 2003v vhdl是非常高速集成电路硬件描述语言是非常高速集成电路硬件描述语言 ( (very high speed integrated circuit hardware description language)的英文缩写。的英文缩写。v语法和风格语法和风格:(1 1)类似与现代高级编程语言,如)类似与现代高级编程语言,如c语言。语言。(2)vhdl描述的是硬件,它包含许多硬件特有的结构。描述的是硬件,

2、它包含许多硬件特有的结构。 vhdl程序的基本结构程序的基本结构include “stdio.h”; include “math.h”;int main(void) int a,b,c; a=8; b=9; c=a+b; return c; library ieee; use ieee.std_logic_1164.all;entity and2 is port( a, b : in bit; c : out bit);end and2;architecture a1 of and2 is begin c = a and b; end a1;vhdl程序程序 c程序程序 vhdl 入门的最有效

3、的方法是通过具体电路实例引出对应的vhdl 表述,通过这些有针对性的表述进而学习相关的语句语法,再通过多个类似实例的学习,逐步完备vhdl 的基本语法知识和提高电路的描述和设计能力。据此,全章通过数个简单、完整而典型的vhdl 设计示例,使读者初步了解用vhdl 表达和设计电路的方法,并对由此而引出的vhdl 语言现象和语句规则能逐步趋向系统的了解。 由于用硬件描述语言来对电子线路的表达和设计是eda 建模和实现技术中最基本和最重要的方法,其它的许多方法都是建筑在这一基础之上的,如使用matlab/dsp builder的设计方案、图形方式的状态机输入法、原理图输入法等等。因此vhdl 的学习

4、在eda技术的掌握中具有十分重要的地位。1 简单组合电路的vhdl 描述 2选1 多路选择器是典型的组合电路,本章以此电路的vhdl 表述与设计为例,引出相关的vhdl 结构、语句表述、数据规则和语法特点,并加以详细说明。1.1 多路选择器的多路选择器的vhdl 描述描述 2 选1 多路选择器的电路模型,或元件图如图3-1 所示。例3-1 是其vhdl 的完整描述,即可使用vhdl 综合器直接综合出实现即定功能的逻辑电路,对应的逻辑电路如图3-2 所示,因而可以认为是此多路选择器的内部电路结构。v注意,电路的功能可以是唯一的,但其电路的结构方式不是唯一的,它决定于综合器的基本元件库的来源、优化

5、方向和约束的选择、目标器件(指fpga/cpld)的结构特点等等。 图中,a 和b 分别为两个数据输入端的端口名,s 为通道选择控制信号输入端的端口名,y为输出端的端口名。“mux21a”是设计者为此器件取的名称(好的名称应该体现器件的基本功能特点)。【例3-1】entity mux21a isport ( a, b : in bit; s : in bit; y : out bit );end entity mux21a;architecture one of mux21a isbegin y fb),当s 为高电平时, y 输出fb,而当s 为低电平时,y 输出fa。显然,图3-3 的波型

6、证实了vhdl 逻辑设计的正确性。v注意, 以上各例的实体和结构体分别是以“ end entity xxx ” 和“ end architecture xx ”语句结尾的,这是符合vhdl 的ieee std 1076_1993 版的语法要求的。若根据vhdl87 版本,即ieee std 1076_1987 的语法要求,这两条结尾语句只需写成“end;”或“end xx”。但考虑到目前绝大多数常用的eda 工具中的vhdl 综合器都兼容两种vhdl 版本的语法规则,且许多最新的vhdl 方面的资料,仍然使用vhdl87版本语言规则,因此,出于实用的目的,对于以后出现的示例,不再特意指出vhd

7、l 两种版本的语法差异处。但对于不同的eda 工具,仍需根据设计程序不同的vhdl 版本表述,在综合前作相应的设置。v【例3-2】见文件夹mux21a1 entity mux21a is port ( a, b : in bit; s : in bit; y : out bit ); end entity mux21a; architecture one of mux21a is signal d,e : bit; begin d = a and (not s) ; e = b and s ; y = d or e ; end architecture one ;【例3-3】见文件夹mux21

8、a2 entity mux21a is port ( a, b, s: in bit; y : out bit ); end entity mux21a; architecture one of mux21a is begin process (a,b,s) begin if s = 0 then y = a ; else y = b ; end if; end process;v end architecture one ;图3-3 mux21a功能时序波形3.1.2 相关语句结构和语法说明 以下将对例3-1 至例3-3 中出现的相关语句结构和语法含义作出说明: 1. 实体表达 vhdl 完

9、整的、可综合的程序结构必须能完整地表达一片专用集成电路asic 器件的端口结构和电路功能,即无论是一片74ls138 还是一片cpu,都必须包含实体和结构体两个最基本的语言结构。这里将含有完整程序结构(包含实体和结构体)的vhdl 表述称为设计实体。如前所述,实体描述的是电路器件的端口构成和信号属性,它的最简表式如下:【例3-4】 entity e_name is port ( p_name : port_m data_type; . p_namei : port_mi data_type ); end entity e_name; 上式中,entity、is、port 和end entity

10、 都是描述实体的关键词,在实体描述中必须包含这些关键词。在编辑中,关键词不分大写和小写。实体名端口信号名端口模式数据类型 2. 实体名 例3-4 中的e_name 是实体名,是标识符,具体取名由设计者自定。由于实体名实际上表达的应该设计电路的器件名,所以最好根据相应电路的功能来确定,如4 位二进制计数器,实体名可取为counter4b;8 位二进制加法器,实体名可取为adder8b,等等。但应注意,不应用数字或中文定义实体名,也不应用与eda 工具库中已定义好的元件名作为实体名,如or2、latch 等,且不能用数字起头的实体名,如74lsxx。 3. 端口语句和端口信号名 描述电路的端口及其

11、端口信号必须用端口语句port( )引导,并在语句结尾处加分号“;”。例3-4 中的p_name 是端口信号名,如例3-1 中的端口信号名分别是a、b、s 和y。4. 端口模式 在例3-4中的port_m表达端口模式,可综合的端口模式有四种,它们分别是“in”、“out”、“inout”和“buffer”,用于定义端口上数据的流动方向和方式: in:输入端口,定义的通道为单向只读模式。规定数据只能由此端口被读入实体。 out:输出端口,定义的通道为单向输出模式。规定数据只能通过此端口从实体向外流出,或者说可以将实体中的数据向此端口赋值。 inout:定义的通道确定为输入输出双向端口。即从端口的

12、内部看,可以对此端口进行赋值,或通过此端口读入外部的数据信息;而从端口的外部看,信号既可由此端口流出,也可向此端口输入信号。如 ram 的数据口,单片机的i/o 口等。 buffer:缓冲端口,其功能与inout 类似,区别在于当需要输入数据时,只允许内部回读输出的信号,即允许反馈。如计数器设计,可将计数器输出的计数信号回读,以作下一计数值的初值。与inout 模式相比,buffer 回读的信号不是由外部输入的,而是由内部产生,向外输出的信号。 5. 数据类型 例3-4 中的data_type 是数据类型名。例3-1 中,端口信号a、b、s 和y 的数据类型都定义为bit。由于vhdl 中任何

13、一种数据对象的应用都必须严格限定其取值范围和数值类型,即对其传输或存储的数据的类型要作明确的界定,因此,在vhdl 设计中,必须预先定义好要使用的数据类型,这对于大规模电路描述的排错是十分有益的。相关的数据类型有integer 类型、boolean 类型、std_logic 类型和bit 类型等。 bit 数据类型的信号规定的取值范围是逻辑位1和0。在vhdl 中,逻辑位0 和1 的表达必须加单引号,否则vhdl 综合器将0 和1 解释为整数数据类型integer。 bit 数据类型可以参与逻辑运算或算术运算,其结果仍是位的数据类型。vhdl 综合器用一个二进制位表示bit。将例3-1 中的端

14、口信号a、b、s 和y 的数据类型都定义为bit表示:a、b、s 和y 的取值范围,或者说数据范围都被限定在逻辑位1和0的二值范围内。6. 结构体表达 结构体的一般表达如例3-5 所示。【例3-5】 architecture arch_name of e_name is 说明语句 begin (功能描述语句) end architecture arch_name ; 上式中,architecture、of、is、begin 和end architecture 都是描述结构体的关键词,在描述中必须包含它们。arch_name 是结构体名,是标识符。 说明语句包括在结构体中,用以说明和定义数据对象

15、、数据类型、元件调用声明等等。说明语句并非是必须的,(功能描述语句)则不同,结构体中必须给出相应的电路功能描述语句,可以是并行语句,顺序语句或它们的混合。 一般地,一个可综合的,完整的vhdl 程序有比较固定的结构。设计实体中,一般首先出现的是各类库及其程序包的使用声明,包括未以显式表达的工作库work 库的使用声明,然后是实体描述,最后是结构体描述,而在结构体中可以含有不同的逻辑表达语句结构。如前所述,在此把一个完整的可综合的vhdl 程序设计构建为设计实体(独立的电路功能结构),而其程序代码常被称为vhdl 的rtl 描述。7. 赋值符号和数据比较符号 例3-1 中的表达式y= a 表示输

16、入端口a 的数据向输出端口y 传输;但也可以解释为信号a 向信号y 赋值。在vhdl 仿真中赋值操作y= a并非立即发生的,而是要经历一个模拟器的最小分辨时间后,才将a 的值赋予y 。在此不妨将 看成是实际电路存在的固有延时量。vhdl 要求赋值符“=”两边的信号的数据类型必须一致。 例3-1 中,条件判断语句when_else 通过测定表式 s=0 的比较结果,以确定由哪一端口向y 赋值。条件语句when_else 的判定依据是表式 s=0 输出的结果。表式中的等号“=”没有赋值的含义,只是一种数据比较符号。其表式输出结果的数据类型是布尔数据类型boolean。boolean 类型的取值分别

17、是:true(真)和false(伪)。即当s 为高电平时,表式 s=0 输出“false”;当s 为低电平时,表式 s =0 输出“true”。在vhdl 综合器或仿真器中分别用1和0表达true 和false。布尔数据不是数值,只能用于逻辑操作或条件判断。 用于条件语句的判断表达式可以是一个值,也可以是更复杂的逻辑或运算表达式,如: if a then . - 注意,a 的数据类型必须是boolean if (s1=0)and(s2=1)or(cb+1) then .8. 逻辑操作符 例3-2 中出现的文字and、or 和not 是逻辑操作符号。vhdl 共有7 种基本逻辑操作符,它们是an

18、d(与)、or(或)、nand(与非)、nor(或非)、xor(异或)、xnor(同或)和not(取反)。信号在这些操作符的作用下可构成组合逻辑。逻辑操作符所要求的操作数(操作对象)的数据类型有3 种,即bit、boolean 和std_logic。 注意,与其他hdl 用某种符号表达逻辑操作符不同,vhdl 中直接用对应的英语文字表达逻辑操作符号,这更明确显示了vhdl 作为硬件行为描述语言的特征。9. 条件语句 例3-3 利用if_then_else 表达的vhdl 顺序语句的方式,同样描述了一个多路选择器的电路行为。其结构体中的if 语句的执行顺序类似于软件语言,首先判断如果s 为低电平

19、,则执行y=a 语句,否则(当s 为高电平),则执行语句y=b。由此可见vhdl 的顺序语句同样能描述并行运行的组合电路。注意,if 语句必须以语句“end if;”结束。10. when_else 条件信号赋值语句 例3-1 中出现的是条件信号赋值语句,这是一种并行赋值语句,其表达方式如下: 赋值目标 = 表达式 when 赋值条件 else 表达式 when 赋值条件 else . 表达式 ; 在结构体中的条件信号赋值语句的功能与在进程中的if 语句相同,在执行条件信号语句时,每一“赋值条件”是按书写的先后关系逐项测定的,一旦发现(赋值条件= true),立即将“表达式”的值赋给“赋值目标

20、”信号。 注意,由于条件测试的顺序性,条件信号赋值语句中的第一子句具有最高赋值优先级,第二句其次,如此类推。例如在以下程序中,如果当p1 和p2 同时为1时,z 获得的赋值是a 而不可能是b 。还应该注意,相对于在同一结构体中的其它语句,此类赋值语句作为一个完整的语句,属于并行语句。 z = a when p1 = 1 else b when p2 = 1 else c ;11. 进程语句和顺序语句 由例3-3 可见,顺序语句“if_then_else_end if;”是放在由“process. end process”引导的语句中的。由process 引导的语句称为进程语句。在vhdl 中,

21、所有合法的顺序描述语句都必须放在进程语句中。 process 旁的(a,b,s)称为进程的敏感信号表,通常要求将进程中所有的输入信号都放在敏感信号表中。例如,例3-3 中的输入信号是a、b 和s,所以将它们全部列入敏感信号表中。由于process 语句的执行依赖于敏感信号的变化(或称发生事件),当某一敏感信号(如a)从原来的1跳变到0,或者从原来的0跳变到1时,就将启动此进程语句,于是此process 至end process 引导的语句(包括其中的顺序语句)被执行一遍,然后返回进程的起始端,进入等待状态,直到下一次敏感信号表中某一信号或某些信号发生事件才再次进入“启动运行”状态。 在一个结构

22、体中可以包含任意个进程语句,所有的进程语句都是并行语句,而由任一进程process 引导的语句(包含在其中的语句)结构属于顺序语句。12. 文件取名和存盘 如果用quartusii 提供的vhdl 文本编辑器编辑vhdl 代码文件,在保存文件时,必须赋给一个正确的文件名。一般地,文件名可以由设计者任意给定,但文件后缀扩展名必须是“.vhd”,如adder_f.vhd。但考虑到某些eda 软件的限制和vhdl 程序的特点,以及调用的方便性,因此建议程序的文件名尽可能与该程序的实体名一致,如例3-1 的文件名应该是:mux21a.vhd。原则上文件名不分大小写,但推荐使用小写,特别是后缀。3.2

23、简单时序电路的vhdl 描述 与其他硬件描述语言相比,在时序电路的描述上,vhdl 具有许多独特之处。最明显的是vhdl 主要通过对时序器件功能和逻辑行为的描述,而非结构上的描述使得计算机综合出符合要求的时序电路,从而充分体现了vhdl 电路系统行为描述的强大功能。以下将对一个典型的时序元件d 触发器的vhdl 描述进行详细分析,从而得出时序电路描述的一般规律和设计方法。3.2.1 d 触发器 最简单、最常用,并最具代表性的时序电路是d 触发器,它是现代数字系统设计中最基本的时序单元和底层元件。d 触发器的描述包含了vhdl 对时序电路的最基本和典型的表达方式,同时也包含了vhdl 中许多最具

24、特色的语言现象。例3-6 是对d 触发器元件图3-4 的描述。从vhdl 的描述上看,与例3-3 相比,例3-6 多了4 个部分: (1) 由library 引导的库的说明部分。 (2) 使用了另一种数据类型:std_logic。 (3) 定义了一个内部节点信号:signal。 (4) 使用了一种新的条件判断表式:clkevent and clk = 1。 除此之外,虽然例3-3 描述的是组合电路,而例3-6 描述的是时序电路,如果不详细分析其中的表述含义,二例在语句结构和语言应用上没有明显的差异,也不存在如其他硬件描述语言(如abel、ahdl)那样包含用于表示时序或组合逻辑的特征语句,更没

25、有与特定的软件或硬件相关的特征属性语句。这也充分表明了vhdl 电路描述与设计平台和硬件实现对象无关性的优秀特点。【例3-6】 library ieee ; use ieee.std_logic_1164.all ; entity dff1 is port (clk : in std_logic ; d : in std_logic ; q : out std_logic ); end ; architecture bhv of dff1 is signal q1 : std_logic ; -类似于在芯片内部定义一个数据的暂存节点 begin process (clk,q1) begin i

26、f clkevent and clk = 1 then q1 = d ; end if; end process ; q = q1 ; -将内部的暂存数据向端口输出(双横线-是注释符号) end bhv3.2.2 d 触发器vhdl 描述的语言现象说明 以下对例3-6 中出现的新的语句语言现象作出说明。 1. 标准逻辑位数据类型std_logic 从例3-6 可见,d 触发器的3 个信号端口clk、d 和q 的数据类型都被定义为std_logic(例3-1 中,端口信号的数据类型被定义为bit)。就数字系统设计来说,类型 std_logic 比bit 包含的内容丰富和完整得多,当然也包含了bi

27、t 类型。试比较以下std_logic 和bit 两种数据类型的程序包定义表式(其中type 是数据类型定义语句)。 bit 数据类型定义: type bit is(0,1); -只有两种取值 std_logic 数据类型定义: type std_logic is (u,x,0,1,z,w,l,h,-); std_logic 所定义的9 种数据的含义是:u表示未初始化的;x表示强未知的;0表示强逻辑0;1表示强逻辑1;z表示高阻态;w 表示弱未知的;l表示弱逻辑0;h表示弱逻辑1;-表示忽略。 它们完整地概括了数字系统中所有可能的数据表现形式,所以例3-6 中的clk、d 和q 比例3-1 中

28、的a、b、s 具有更宽的取值范围,因而其描述和实际电路有更好的适应性。 在仿真和综合中,将信号或其他数据对象定义为std_logic 数据类型是非常重要的,它可以使设计者精确地模拟一些未知的和具有高阻态的线路情况。对于综合器,高阻态z和-忽略态(有的综合器用x)可用于三态的描述。std_logic 型数据在数字器件中实现的只有其中的4 到5 种值,即x (或/和)、0、1和z,其他类型通常不可综合。 注意,此例中给出的std_logic 数据类型的定义主要是借以学习一种新的语法现象,而非d 触发器等时序电路必须使用此类数据类型。2. 设计库和标准程序包 有许多数据类型的说明,及类似的函数是预先

29、放在vhdl 综合器附带的设计库和程序包中的。如bit 数据类型的定义是包含在vhdl 标准程序包standard 中的,而程序包standard 包含于vhdl 标准库std 中。一般,为了使用bit 数据类型,应该在例3-1的程序上面增加如下3 句说明语句: library work ; library std ; use std.standard.all ; 第2 句中的library 是关键词,library std 表示打开std 库;第3 句的use 和all 是关键词,全句表示允许使用std 库中standard 程序包中的所有内容(.all),如类型定义、函数、过程、常量等。

30、此外,由于要求vhdl 设计文件保存在某一文件夹,如d:myfile 中,并指定为工程project 的文件所在的目录,vhdl 工具就将此路径指定的文件夹默认工作库(worklibrary),于是在vhdl 程序前面还应该增加 “library work;”语句,vhdl 工具才能调用此路径中相关的元件和程序包。 但是,由于vhdl 标准中规定标准库std 和工作库work 都是默认打开的,因此就可以像例3-1 那样,不必将上述库和程序包的使用语句以显式表达在vhdl 程序中。除非如例3-6 那样,需要使用一些特殊的程序包。 使用库和程序包的一般定义表式是: library ; use .a

31、ll ; std_logic 数据类型定义在被称为std_logic_1164 的程序包中,此包由ieee 定义,而且此程序包所在的程序库的库名被取名为ieee。由于ieee 库不属于vhdl 标准库,所以在使用其库中内容前,必须事先给予声明。即如例3-6 最上的两句语句: library ieee ; use ieee.std_logic_1164.all ; 正是出于需要定义端口信号的数据类型为std_logic的目的,当然也可以定义为bit类型或其他数据类型,但一般应用中推荐定义std_logic 类型。3. 信号定义和数据对象 例3-6 中的语句“signal q1:std_logic

32、;”表示在描述的器件dff1 内部定义标识符q1 的数据对象为信号signal,其数据类型为std_logic。由于q1 被定义为器件的内部节点信号,数据的进出不像端口信号那样受限制,所以不必定义其端口模式(如in、out 等)。定义q1 的目的是为了在设计更大的电路时使用由此引入的时序电路的信号,这是一种常用的时序电路设计的方式。事实上,如果在例3-6 中不作q1 的定义,其结构体(如将其中的赋值语句q1 = d 改为q = d)同样能综合出相同的结果,但不推荐这种设计方式。 语句“signal q1:std_logic;”中的signal 是定义某标识符为信号的关键词。 在vhdl 中,数

33、据对象(data objects)类似于一种容器,它接受不同数据类型的赋值。数据对象有3 类,即信号(signal)、变量(variable)和常量(constant)。在vhdl中,被定义的标识符必须确定为某类数据对象,同时还必须被定义为某种数据类型。如例3-6 中的q1,对它规定的数据对象是信号,而数据类型是std_logic,前者规定了q1 的行为方式和功能特点,后者限定了q1 的取值范围。vhdl 规定,q1 作为信号,它可以如同一根连线那样在整个结构体中传递信息,也可以根据程序的功能描述构成一个时序元件;但q1 传递或存储的数据的类型只能包含在std_logic 的定义中。 需要注意

34、的是,语句“signal q1:std_logic;”仅规定了q1 的属性特征,而其功能定位需要由结构体中的语句描述具体确定。如果将q1 比喻为一瓶葡萄酒,则其特定形状的酒瓶就是其数据对象,瓶中的葡萄酒(而非其他酒)就是其数据类型,而这瓶酒的用处(功能)只能由拥有这酒的人来确定,即结构体中的具体描述。4. 上升沿检测表式和信号属性函数event 例3-6 中的条件语句的判断表式“clkevent and clk=1”是用于检测时钟信号clk 的上升沿的,即如果检测到clk 的上升沿,此表达式将输出“true”。 关键词event 是信号属性函数,用来获得信号行为信息的函数称为信号属性函数。vh

35、dl 通过以下表式来测定某信号的跳变情况: event 短语“clockevent”就是对clock 标识符的信号在当前的一个极小的时间段内发生事件的情况进行检测。所谓发生事件,就是clock 在其数据类型的取值范围内发生变化,从一种取值转变到另一种取值(或电平方式)。如果clock 的数据类型定义为std_logic,则在 时间段内,clock 从其数据类型允许的9 种值中的任何一个值向另一值跳变,如由0变成1、由1变成0或由z变成0,都认为发生了事件,于是此表式将输出一个布尔值true,否则为false。 如果将以上短语clockevent 改成语句:clockevent and cloc

36、k=1,则表示一旦“clockevent”在 时间内测得clock 有一个跳变,而此小时间段之后又测得clock 为高电平1,即满足此语句右侧的clock =1的条件,于是两者相与(and)后返回值为true,由此便可以从当前的clock =1推断在此前的 时间段内,clock必为0 (设clock 的数据类型是bit)。因此,以上的表达式就可以用来对信号clock的上升沿进行检测,于是语句clockevent and clock =1就成了边沿测试语句。5. 不完整条件语句与时序电路 现在来分析例3-6 中对d 触发器功能的描述。 首先考察时钟信号clk 上升沿出现的情况(即满足if 语句条

37、件的情况)。当clk 发生变化时,process 语句被启动,if 语句将测定条件表式“clkevent and clk=1”是否满足条件,如果clk 的确出现了上升沿,则满足条件表式对是上升沿检测,于是执行语句q1=d,即将d 的数据向内部信号q1 赋值,即更新q1,并结束if 语句,最后将q1的值向端口信号q 输出。至此,是否可以认为,clk 上升沿测定语句clkevent andclk=1就成为综合器构建时序电路的必要条件呢?回答显然是否定的。 其次再考察如果clk 没有发生变化,或者说clk没有出现上升沿方式的跳变时if 语句的行为。这时由于if 语句不满足条件,即条件表式给出“fal

38、se”,于是将跳过赋值表式q1=d,不执行此赋值表式而结束if 语句。由于在此,if 语句中没有利用通常的else语句明确指出当if 语句不满足条件时作何操作。显然这是一种不完整的条件语句(即在条件语句中,没有将所有可能发生的条件给出对应的处理方式)。对于这种语言现象,vhdl综合器理解为,对于不满足条件,跳过赋值语句q1=d 不予执行,即意味着保持q1 的原值不变(保持前一次时钟上升沿后q1 被更新的值)。对于数字电路来说,试图保持一个值不变,就意味着具有存储功能的元件的使用,就是必须引进时序元件来保存q1 中的原值,直到满足if 语句的判断条件后才能更新q1 中的值。 显然,时序电路构建的

39、关键在于利用这种不完整的条件语句的描述。这种构成时序电路的方式是vhdl 描述时序电路最重要的途径。通常,完整的条件语句只能构成组合逻辑电路,如例3-3 中,if_then_else 语句指明了s 为1和0全部可能的条件下的赋值操作,从而产生了多路选择器组合电路模块。 然而必须注意,虽然在构成时序电路方面,可以利用不完整的条件语句所具有的独特功能构成时序电路,但在利用条件语句进行纯组合电路设计时,如果没有充分考虑电路中所有可能出现的问题,即没有列全所有的条件及其对应的处理方法,将导致不完整的条件语句的出现,从而产生设计者不希望的组合与时序电路的混合体。在此,不妨比较例3-7和例3-8 的综合结

40、果。可以认为例3-7 的原意是要设计一个纯组合电路的比较器,但是由于在条件语句中漏掉了给出当a1b1 时q1 作何操作的表述,结果导致了一个不完整的条件语句。这时,综合器将对例3-7 的条件表述解释为:当条件a1b1 时对q1 不作任何赋值操作,即在此情况下保持q1 的原值,这便意味着必须为q1 配置一个寄存器,以便保存它的原值。图3-5 所示的电路图即为例3-7 的综合结果。不难发现综合器已为比较结果配置了一个寄存器。通常在仿真时,对这类电路的测试,很难发现在电路中已被插入了不必要的时序元件,这样浪费了逻辑资源,降低了电路的工作速度,影响了电路的可靠性。因此,设计者应该尽量避免此类电路的出现

41、。 例3-8 是对例3-7 的改进,其中的“else q1 b1 then q1 = 1 ; elsif a1 b1 then q1 b1 then q1 = 1 ; else q1 = 0 ; end if; end process ; end ;图3-6 例3-8的电路图(synplify综合)图3-5 例3-7的电路图(synplify综合)3.2.3 实现时序电路的不同表述 例3-6 通过利用表式“clkevent and clk=1”来检测clk 的上升沿,从而实现了边沿触发寄存器的设计。事实上,vhdl 还有其他多种实现时序元件的方式。 严格地说,如果信号clk 的数据类型是std

42、_logic,则它可能的取值有9 种,而clkevent 为真的条件是clk 在9 种数据中的任何两种间的跳变,因而当表式: clkevent and clk=1 为真时,并不能推定clk 在 时刻前是0 (例如,它可以从z变到1),从而即使clk 有“事件”发生也不能肯定clk 发生了一次由0到1的上升沿的跳变。为了确保此clk 发生的是一次上升沿的跳变,例3-9 采用了如下的条件判断表式: clkevent and (clk=1) and (clklast_value=0) 与event 一样,last_value 也属于预定义的信号属性函数,它表示最近一次事件发生前的值。clklast_

43、value=0为true,表示clk 在 时刻前为0。 clkevent and clk=1和clklast_value=0相与为真的话,则保证了clk在 时刻内的跳变是从0变到1的。例3-9、3-10、3-11 都有相同的用意,只是例3-11 调用了一个测定clk 上升沿的函数rising edge( )。 rising edge( )是vhdl 在ieee 库中标准程序包std_logic_1164 内的预定义函数,这条语句只能用于标准逻辑位数据类型std_logic 的信号。因此必须打开ieee 库和程序包std_logic_1164,然后定义相关的信号(如clk)的数据类型为标准逻辑位

44、数据类型std_logic。在此clk 的数据类型必须是std_logic。 测下降沿可用的语句有:falling edge( )、clkevent and (clk=0) 、 clk=0 and clklast_value=1 等。【例3-9】. process (clk) begin if clkevent and (clk=1) and (clklast_value=0) then q = d ; -确保clk的变化是一次上升沿的跳变 end if; end process ;【例3-10】. process (clk) begin if clk=1 and clklast_value=

45、0 -同例3-9 then q = d ; end if; end process ;【例3-11】library ieee ;use ieee.std_logic_1164.all ;entity dff3 is port (clk,d : in std_logic ; q : out std_logic ); end ; architecture bhv of dff3 is signal q1 : std_logic; begin process (clk) begin if rising_edge(clk) - 必须打开std_logic_1164程序包 then q1 = d ; e

46、nd if; end process ; q = q1 ; -在此,赋值语句可以放在进程外,作为并行赋值语句end ; 例3-12 则是利用了一条wait until 语句实现时序电路设计的,含义是如果clk 当前的值不是1,就等待并保持q 的原值不变,直到clk 变为1时才对q 进行赋值更新。vhdl要求,当进程语句中使用wait 语句后,就不必列出敏感信号。 例3-13 描述的d 触发器的clk边沿检测是由process 语句和if 语句相结合实现的。其原理是:当clk 为0时,process 语句处于等待状态,直到发生一次由0到1的跳变才启动进程语句,而在执行if 语句时,又满足了clk

47、 为1的条件,于是对q 进行赋值更新,而此前,q 一直保持原值不变,直到下一次上跳时钟边沿的到来。因此例3-9 至例3-13描述的都是相同的d 触发器,其电路的仿真测试波形如图3-7 所示。由波形可见,q 的变化仅发生于clk 的上升后。 与例3-13 相比,例3-14 仅在敏感信号表中多加了电路输入信号d,但综合后的电路功能却发生了很大的变化。由时序图3-8 可见,它表现的是电平式触发的锁存器功能,与图3-7 表现的波形有很大的区别。在clk 处于高电平时,输出q 随d 的变化而变化,而clk仅在低电平时保持数据不变。 由例3-14 的语句分析可知,当clk为1不变时,输入数据d 的任何变化

48、都会启动进程process,从而实现输出信号q 的更新,而当clk 原来为0时,即使由于d 的变化启动了process,但由于不满足if 语句的条件,q 仍然必须处于数据原值保存的状态。显然,例3-14 提供了一个电平型触发的时序元件(锁存器)的设计方法。 但需要指出,此类功能只有maxplusii、quartusii 等eda 工具中含有,许多其他vhdl综合器不承认这类语法表述,它们都要求将进程中的所有输入信号都列进敏感信号表中,否则给予警告信息。因此,对于这种综合器,无法利用此类表述实现电平型触发的时序元件,显然,具体情况需要根据设计者使用的eda 软件的功能具体确定。在一般情况下,不推

49、荐使用例3-14 的表达方式产生时序电路。 由例3-9 至例3-14 可见,时序电路的建立只能利用进程中的顺序语句来建立。此外,考虑到多数综合器并不理会边沿检测语句中的信号的std_logic 数据类型,因此最常用和通用的边沿检测表式仍然是clkevent and clk=1。【例3-12】. process begin wait until clk = 1 ; -利用wait语句 q = d ; end process;【例3-13】. process (clk) begin if clk = 1 then q = d ; -利用进程的启动特性产生对clk的边沿检测 end if; end

50、process ;【例3-14】. process (clk,d) begin if clk = 1 -电平触发型寄存器 then q = d ; end if; end process ;quartus ii使用步骤v编辑vhdl文件v建立相关工程v编译排错v设置波形仿真文件v仿真vhdl实例:2选1数据选择器的设计v首先,打开quartus ii软件:vhdl实例:2选1数据选择器的设计v在file菜单中选择new,打开新建对话框:1.注意,我们使用的是vhdl语言,所以这里首先要选择新建vhdl file2.然后点击okvhdl实例:2选1数据选择器的设计v在出现的名字为vhdl1.vh

51、d的文件里面可以编辑vhdl文件:1.在这里可以编辑vhdl语言描述的电路2.然后点击保存,保存到你所指定的文件夹中,例如e:/quartusproject/mux21a。注意,所有的关于本次设计的文件都要放到这个文件夹中,包括以后的一些文件!。vhdl实例:2选1数据选择器的设计1.在这里填入文件名称,注意文件名称必须要和你vhdl文件中的实体名称相同!2. 点击“保存”后,弹出该对话框,说你是否要给这个文件建立一个工程,点击“是”。我们必须要建立一个工程。vhdl实例:2选1数据选择器的设计vhdl实例:2选1数据选择器的设计1.选择一个文件夹,注意:大家一定要一个项目建立一个文件夹,不要

52、把好多个项目放在一个文件夹下面,那样会很乱。2.输入项目的名称,一般项目名称和文件夹名称相同即可。默认情况项目名称和上面建立的文件夹名称相同。3.输入顶层设计实体的名称,。默认情况项目名称和上面建立的文件夹名称相同。vhdl实例:2选1数据选择器的设计1.点击add all。这就是加入的文件,即名字为max21a.vhd的文件。vhdl实例:2选1数据选择器的设计1.选择器件系列。2.选择具体器件型号。vhdl实例:2选1数据选择器的设计vhdl实例:2选1数据选择器的设计vhdl实例:2选1数据选择器的设计1.注意,建立工程之后,这里有这样的图标出现。2.点击该图标进行编译vhdl实例:2选1数据选择器的设计该窗口显示编译状态,如果有错误会给出错误的大致情况。显示编译进度。vhdl实例:2选1数据选择器的设计编译完成后,给出编译的总体情况。编译报告vhdl实例:2选1数据选择器的设计仿真:仿真:点击file/new,弹出新建对话框:选择other files标签 建

温馨提示

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

评论

0/150

提交评论