第二章VHDL设计入门(新)

上传人:猪** 文档编号:243129602 上传时间:2024-09-16 格式:PPT 页数:71 大小:1.02MB
返回 下载 相关 举报
第二章VHDL设计入门(新)_第1页
第1页 / 共71页
第二章VHDL设计入门(新)_第2页
第2页 / 共71页
第二章VHDL设计入门(新)_第3页
第3页 / 共71页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第二章,VHDL设计入,VHDL,是,IEEE,、,工业标准硬件描述语言,IEEE-Institute for Electrical and Electronic Engineers,电气和电子工程师学会美,Very High Speed Integrated Circuit Hardware Description Language,(,VHDL,),它是20世纪70年代和80年代初,由美国国防部为其超高速集成电路,VHSIC,计划提出的硬件描述语言,它支持硬件的设计、综合、验证和测试。1986年3月,,IEEE,开始致力于,VHDL,的标准化工作,讨论,VHDL,语言标准。,IEEE,于1987年12月公布了,VHDL,的标准版本(,IEEE STD 1076/1987,);1993,年,VHDL,重新修订,形成新的标准即,IEEE STD 1076-1993,。,VHDL,是,IEEE、,工业标准硬件描述语言,VHDL,语言描述能力极强,,覆盖了逻辑设计的诸多领域和层次,并支持众多的硬件模型。设计者的原始描述是非常简练的硬件描述,经过,EDA,工具综合处理,最终生成付诸生产的电路描述或版图参数描述的工艺文件。整个过程通过,EDA,工具自动完成,大大减轻了设计人员的工作强度,极大地提高了设计效率和设计质量。,VHDL,语言具有良好的可读性,,VHDL,既能被人容易读懂又能被计算机识别。,VHDL,语言中的设计实体(,Design Entity)、,程序包(,Package)、,设计库(,Library),,为设计人员重复利用别人的设计提供了技术手段。重复利用他人的,IP,模块(具有知识产权的功能单元块)是,VHDL,语言的特色,,VHDL,语言的移植性很强,。因为它是一种标准语言,故它的设计描述可以被不同的工具所支持。,VHDL,是,IEEE、,工业标准硬件描述语言,目前,在可编程逻辑器件设计输入中,广泛使用,VHDL,语言,并且规定每个,PLD,厂家开发的设计系统都要支持,VHDL。,但,VHDL,设计的最终实现取决于针对目标器件的编程,工具不同导致综合的质量也不一样。,VHDL,有过两个标准:,IEEE Std 1076-1987 (called VHDL 1987),IEEE Std 1076-1993 (called VHDL 1993),VHDL,的标准,.1,VHDL,程序的基本结构,库,(,Library),包集合,(,Package),实体,(,Entity),结构体,(,Architecture),配置,(,Configuration),VHDL,程序,一、,VHDL,程序的组成,5部分组成,需要编写的程序单元,实体,用于描述所设计的系统的外部接口信号。,构造体,用于描述系统内部的结构和行为。,已编写好的部分,二、,VHDL,程序的基本格式,LIBRARY IEEE; (,调用,IEEE,库),USE IEEE.STD_LOGIC_1164.ALL;ENTITY,实体名,ISEND,实体名;,ARCHITECTURE,结构体名,OF,实体名,ISEND,结构体名;,指定所用库及说明使用库中哪一个程序包,实体说明,结构体说明,Max+plusII,要求实体名必须与,VHDL,程序名相同!,VHDL程序的基本结构,三、实体,的结构,ENTITY,实体名,IS GENERIC(,类属参数表);,PORT(,端口表) ;,END,实体名;,端口界面常数,为在设计实体外部改变设计内部结构提供通道,说明设计实体对外端口的,名称,、,模式,和,数据类型,注意,VHDL,程序中的分号“;”,四、结构体,的结构,ARCHITECTURE,结构体名,OF,实体名,IS,定义内部信号、常数、数据类型、函数;,BEGIN,并行处理语句 ;,END,结构体名;,结构体中的语句是并行执行的,简单时可省略,结构体具体描述实体的逻辑行为或功能,,描述方式有三种:行为描述、寄存器传输描述、结构描述。其区别仅在描述语句上,结构体的结构是一样的。,【,例 1,】,ENTITY,mux21a,IS,PORT,( a, b :,IN,BIT,;,s :,IN BIT,;,y :,OUT BIT,) ;,END,ENTITY,mux21a ;,ARCHITECTURE,one,OF,mux21a,IS,BEGIN,y = a,WHEN,s = 0,ELSE,b ;,END,ARCHITECTURE,one ;,实体,结构体,举例 多路选择器,VHDL,描述,图,1,-1,mux21a,实体,图1-2,mux21a,结构体,2.1.1 2选1多路选择器的,VHDL,描述, 实体名应反映实体功能,不能用数字开头、不能与,EDA,工具库中已定义好的元件名同名,不能用数字和中文。 文件存盘时,文件名应与实体名相同。,实体名, 结构体中用于描述逻辑功能和电路结构的语句分为顺序语句和并行语句。,并行语句,WHENELSE,在此处的含义是:当满足条件,s0,时,,a,输入端的信号传送至,y,,否则,b,端信号送至,y,端。,2.1.1 2选1多路选择器的,VHDL,描述,【,例 2,】,ENTITY mux21b IS,PORT (a,b,s : IN BIT;,y : OUT BIT );,END ENTITY mux21b;,ARCHITECTURE one OF mux21b IS,SIGNAL d,e : BIT;,BEGIN,d = a AND (NOT S) ;,e = b AND s ;,y = d OR e ;,END ARCHITECTURE one ;,【例 3】,. . .,ARCHITECTURE one OF mux21c IS,BEGIN,y = (a AND (NOT s) OR (b AND s) ;,END one;,PORT( );,定义了端口的名称、模式、数据类型,AND、OR、NAND、XOR、NOT,是逻辑操作符,p18,“=” 表示信号代入赋值,端口模式,IN,OUT,INOUT,BUFFER,OUT,定义的端口为,单向输出模式,,实体内的数据通过此端口向外流出。,IN,定义的端口为,单向输入模式,,规定数据只能通过此端口被读入实体中。,INOUT,定义的端口为,输入输出双向模式,,数据可通过此端口输出或读入。,BUFFER,的功能与,INOUT,类似,区别当从,BUFFER,端口读数时,是回读输出信号,即内部反馈,回读的信号不是由外部输入的,是由内部产生的。,数据类型,在,VHDL,中,预先定义好的数据类型有多种,如:,整数(,Integer);,布尔量(,Boollean,);,位(,Bit);,位矢量(,Bit_vector),等。,BIT,数据类型的信号规定的取值范围是逻辑位1和0。,在,VHDL,中表示逻辑取值必须加单引号,否则综合器将其视为整数数据类型,INTEGER。,见例1-1。,VHDL,的预定义数据类型都是在标准库,STD,的标准程序包,standard,中定义的。使用时不需要用,USE,语句显式调用。,IEEE,程序包,std_logic_1164,中定义了两个非常重要的数据类型:工业标准的逻辑类型,std_logic,和,std_logic_vector,使用时需声明库和程序包。,标准定义的数据类型,IEEE,预定义的数据类型,用户自定义的数据类型,!,2选1多路选择器的,VHDL,描述,数据比较符号“”没有赋值的含义,只是一种数据比较符号,其表达式返回结果的数据类型是布尔型,取值分别是:true(真)和false(伪)。即当s为高电平时,表式s0输出false,当s为低电平时,表达式s0输出true。VHDL综合器中分别用10表示true和false。,条件判断句IFTHENELSE,依据表式输出值决定把,a,或,b,值赋给,y。,条件判断句IFTHENELSE,是顺序执行语句,,IF,语句必须以,END IF;,结束。,p34,PROCESSEND PROCESS;,引导的语句为进程语句。,VHDL,中所有合法的顺序语句都必须放在进程中。(,a,b,s),是敏感信号表。,p32,【例 4】,ENTITY mux21d IS,PORT ( a, b, s: IN BIT;,y : OUT BIT );,END ENTITY mux21d;,ARCHITECTURE one OF mux21d IS,BEGIN,PROCESS (a,b,s),BEGIN,IF s = 0 THEN,y = a ; ELSE y = b ;,END IF;,END PROCESS;,END ARCHITECTURE one ;,2选1多路选择器的,VHDL,描述,图 3,mux21a,功能时序波形,2.1.2,VHDL,相关语句说明,1. 实体表达,【例 5】,ENTITY e_name IS,PORT ( p_name : port_m data_type;,.,p_namei,: port_mi data_type );,END ENTITY e_name;,或:,【例1-6】,ENTITY e_name IS,PORT ( p_name : port_m data_type;,.,p_namei,: port_mi data_type );,END e_name;,IEEE STD 1076_1993,版语法,IEEE STD 1076_1987,版语法,2.1.2,VHDL,相关语句说明,2. 结构体表达,ARCHITECTURE arch_name OF e_name IS,(,说明语句),BEGIN,(,功能描述语句),END ARCHITECTURE arch_name ;,或:,ARCHITECTURE arch_name OF e_name IS,(,说明语句),BEGIN,(,功能描述语句),END arch_name ;,IEEE VHDL93,IEEE VHDL87,结构体的引导语句和结构,2.1.2,VHDL,相关语句说明,3.,IF_THEN,条件语句,4.,WHEN_ELSE,条件信号赋值语句,赋值目标 = 表达式,1,WHEN,赋值条件,1,ELSE,表达式,2,WHEN,赋值条件,2,ELSE,.,表达式,n,;,IF a,THEN ,IF (s1=0)AND(s2=0) THEN ,a,的数据类型必须是,boolean,IF_THEN_,是顺序语句,用在进程,PROCESS,中,在执行条件信号赋值语句时,依次测定赋值条件,一旦发现赋值条件为,true,,立即将表达式的值传送到赋值目标。对赋值目标的判断具有顺序性,第一行有最高优先级。,2.1.2,VHDL,相关语句说明,由“,PROCESS END PROCESS”,引导的是进程语句,在,VHDL,中,所有合法的顺序语句都必须放在进程语句中。例如例1-4,5.,PROCESS,进程语句和顺序语句,PROCESS (a,b,s),是进程的敏感信号表,,,进程的所有输入信号都应放在表中。进程语句的执行依赖于敏感信号的变化。当某一敏感信号发生变化时,就将启动进程语句,而在执行一遍整个进程中的顺序语句后,便进入等待状态。直到下一次有敏感信号变动,才再次启动运行进程。,在一个结构体中可以包含多个进程语句,所有进程语句都是并行关系。而进程语句内则为顺序语句。,6. 文件取名和存盘,文件取名应与程序的实体名相同,,VHDL,文件的扩展名是“*.,vhd,”。,文件名部分大小写。,VHDL,程序文件存放的目录将被设定为,WORK,库,所以要为设计文件在合适的路径上建立文件夹。,2.1.2,VHDL,相关语句说明,2.1.3,VHDL,设计的基本概念和语句小节,数据类型,信号赋值符,条件比较符,实体,结构体,端口定义,端口模式,逻辑操作符,以,ENTITYEND name;,描述器件的端口特性,以,ARCHITECTURE END ARCHITECTURE,描述器件内部逻辑功能,以,PORT( ),描述器件端口名称、端口模式及其数据类型,IN、OUT、INOUT、BUFFER,描述端口数据的流向,数据类型反映数据的类别,,BIT,的定义值为逻辑1和0,“=”,用于信号数据的传输,“”,在条件语句表达式中比较两侧数据的关系,ture、false,AND OR NAND NOR XOR NOT,可描述器件内组合逻辑关系,2.1.3,VHDL,设计的基本概念和语句小节,IF,条件语句,并行条件语句,进程语句,顺序语句,并行语句,文件取名,文件存盘,IF_THEN_ELSE,是顺序语句;可用于描述组合电路,WHEN_ELSE,条件信号赋值语句,以,PROCESSEND PROCESS,引导的语句结构,在进程语句内,以顺序方式执行的语句,在结构体内以并行方式执行的语句,文件名应与,VHDL,设计的实体名一致,后缀是“.,vhd,”,VHDL,设计文件必须存于指定为,project,的目录中,此目录将被设定为,WORK,库。,WORK,库的路径即为此目录的路径。,2.2 寄存器描述及其,VHDL,语言现象,2.2.1,D,触发器的,VHDL,描述,【例 9】,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),BEGIN,IF CLKEVENT AND CLK = 1,THEN Q1 = D ;,END IF;,Q = Q1 ; -,将内部的暂存数据向端口输出,END PROCESS ;,END,bhv,;,2.2.1,D,触发器的,VHDL,描述,【例 9】,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),BEGIN,IF CLKEVENT AND CLK = 1,THEN Q1 = D ;,END IF;,Q = Q1 ; -,将内部的暂存数据向端口输出,END PROCESS ;,END,bhv,;,由,LIBRARY,引导的库的说明部分,使用了标准逻辑位,STD_LOGIC,数据类型,定义了内部接点信号,SIGNAL,如何判断,CLK,的前沿?,【例 9】,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),BEGIN,IF CLKEVENT AND CLK = 1,THEN Q1 = D ;,END IF;,Q = Q1 ; -,将内部的暂存数据向端口输出,END PROCESS ;,END,bhv,;,STD_LOGIC,类型比,BIT,包含的内容丰富和完整得多。,BIT,数据类型定义:,TYPE BIT IS(0,1);,STD_LOGIC,数据类型定义:,TYPE STD_LOGIC IS(U, X, 0, 1, Z, W, L, H, ),未初始化的;强未知的;强逻辑0;强逻辑1;高阻态;弱未知的;弱逻辑0;弱逻辑1;表示忽略。 实际能综合的是前四种.,2.2 寄存器描述及其,VHDL,语言现象,2.2.1,D,触发器的,VHDL,描述,使用库和程序包的一般格式是,LIBRARY ;,USE .,ALL,STD_LOGIC,数据类型定义在被称为,STD_LOGIC_1164,的程序包中,此包由,IEEE,定义,而且此包所在程序库名被取名为,IEEE。,因,IEEE,库不是,VHDL,标准库,所以在使用库中内容前,必须事先予以声明。,定义,BIT,数据类型的函数在,VHDL,标准库的,STANDARD,标准库中。,VHDL,标准中规定标准库,STD,和当前工作库,WORK,都是默认打开的。所以在前面的例子中省略了库文件的调用语句。,【例 9】,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 DFF1;,ARCHITECTURE,bhv,OF DFF1 IS,SIGNAL Q1 : STD_LOGIC ;,BEGIN,PROCESS (CLK),BEGIN,IF CLKEVENT AND CLK = 1,THEN Q1 = D ;,END IF;,Q = Q1 ; -,将内部的暂存数据向端口输出,END PROCESS ;,END,bhv,;,“SIGNAL Q1 :STD_LOGIC”,表示所描述的,DFF,内部定义标识符,Q1,的数据对象为信号,SIGNAL,,其数据类型为,STD_LOGIC。,定义,Q1,的目的是为了在设计更大的电路时使用由此产生的信号,这是时序电路设计时常用的方式。,实际上,例 9中不做,Q1,的定义,同样能综合出相同的结果,2.2 寄存器描述及其,VHDL,语言现象,2.2.1,D,触发器的,VHDL,描述,【例 10】,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 DFF1;,ARCHITECTURE,bhv,OF DFF1 IS,BEGIN,PROCESS (CLK),BEGIN,IF CLKEVENT AND CLK = 1,THEN Q = D ;,END IF;,END PROCESS ;,END,bhv,;,没有定义内部信号的情况的例子,上例中为什么要定义内部信号,Q1?-,可以在不同进程之间传递信号,【例 9】,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),BEGIN,IF CLKEVENT AND CLK = 1,THEN Q1 = D ;,END IF;,Q = Q1 ;,END PROCESS ;,END,bhv,;,如何判断,CLK,的前沿?,2.2 寄存器描述及其,VHDL,语言现象,2.2.1,D,触发器的,VHDL,描述,【例 9】,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),BEGIN,IF CLKEVENT AND CLK = 1,THEN Q1 = D ;,END IF;,Q = Q1 ;,END PROCESS ;,END,bhv,;,如何判断,CLK,的前沿?,EVENT,是一个信号属性函数,布尔型,如果有事件发生在该属性附着的信号上(即信号有变化),则其取值为,true,,否则为,false,,利用此属性可决定时钟边沿是否有效,即时钟是否变化。,clkEVENT,AND,clk,=1,用于检测时钟的上升沿,即时钟变化了,且变化后的值为1。以此来表示上升沿。,同理:,clkEVENT,AND,clk,= 0,表示,clk,的下降沿出现(当上述语句中两条件相与后为,true,时),表示当,clk,前沿到达时,就将,D,端信号的值赋给,Q1,,否则(不满足条件)直接跳过。,p42,2.2 寄存器描述及其,VHDL,语言现象,2.2.1,D,触发器的,VHDL,描述,ENTITY,DFF,test1 IS,PORT,(,clk, d : in bit;,q : out bit);,END,DFF,test1;,ARCHITECTURE,body OF,DFF,test1 IS,SIGNAL q1 : BIT ;,BEGIN,PROCESS (,clk,),BEGIN,IF,clk,=1 AND,clklast_value,=0,THEN q1 = d;,END if;,q = q1 ;,END PROCESS;,END body;,如何判断,CLK,的前沿?,clk,=1 AND,clklast_value,=0,用来保证,clk,是从0上跳到1,以避免对,X1,Z1,等情况的误判。,Clk,变动前的值是0,2.2 寄存器描述及其,VHDL,语言现象,2.2.1,D,触发器的,VHDL,描述,LIBRARY IEEE;,USE IEEE.std_logic_1164.all;,Entity test1 is,port (,clk, d : in bit;,q : out bit);,end test1;,architecture body of test1 is,begin,process (,clk,),begin,if,rising_edge(clk,),then,q = d;,end if;,end process;,end body;,如何判断,CLK,的前沿?,rising_edge( ),Falling_edge( ),是在,ieee,库的,std_logic_,1164,程序包中预先定义好的两个布尔型函数。,Rising_edge(clk,),为,true,时表示,clk,上升沿出现,与,clkEVENT,AND,clk,=1,等效。,Falling_edge(clk,),为,true,时,表示,clk,下降沿,与,clkEVENT,AND,clk,=0,等效。,2.2 寄存器描述及其,VHDL,语言现象,2.2.1,D,触发器的,VHDL,描述,ENTITY dfftest2 IS,PORT (,clk,d,: IN bit;,q : OUT bit);,END dfftest2;,ARCHITECTURE,bhv,OF dfftest2 IS,SIGNAL q1 : bit ;,BEGIN,PROCESS (,clk,),BRGIN,IF (,clk,=1) THEN,q1 = d;,END IF;,q = q1 ;,END PROCESS;,END,bhv,;,利用进程的敏感信号与,IF,clk,=1 THEN,配合检测,clk,的上升沿,如何判断,CLK,的前沿?,2.2 寄存器描述及其,VHDL,语言现象,2.2.1,D,触发器的,VHDL,描述,entity dfftest3 is,port (,clk,d,: in bit;,q : out bit);,end dfftest3;,architecture,bhv,of dfftest3 is,signal q1 : bit ;,begin,process (,clk,d,),begin,if (,clk,=,1,) then,q1 = d;,end if;,q = q1 ;,end process;,end,bhv,;,此例中,d,clk,均为敏感信号,则在,clk,=1,期间,,d,的变化同样会启动进程,使输出,q,随,d,而变(可以变多次),而在,clk,=0,时,d,变化启动进程后直接跳过,IF,语句,,q,值保持不变,-,D,型锁存器。,2.2 寄存器描述及其,VHDL,语言现象,2.2.2,D,触发器,VHDL,描述的语言现象说明,1. 标准逻辑位数据类型,STD_LOGIC,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; -表示忽略。,2.2.2,D,触发器,VHDL,描述的语言现象说明,2. 设计库和标准程序包,3.,SIGNAL,信号定义和数据对象,【例 】,ARCHITECTURE,bhv,OF DFF1 IS,BEGIN,PROCESS (CLK),BEGIN,IF CLKEVENT AND CLK = 1,THEN Q = D ;,END IF;,END PROCESS ;,END ;,使用库和程序包的一般定义表式是:,LIBRARY ;,USE .,ALL ;,2.2.2,D,触发器,VHDL,描述的语言现象说明,4. 上升沿检测表式和信号属性函数,EVENT,关键词,EVENT,是信号属性,,VHDL,通过以下表式来测定某信号的跳变边沿:,EVENT,5. 不完整条件语句与时序电路,【例11】,ENTITY COMP_BAD IS,PORT( a1 : IN BIT;,b1 : IN BIT;,q1 : OUT BIT );,END ;,ARCHITECTURE one OF COMP_BAD IS,BEGIN,PROCESS (a1,b1),BEGIN,IF a1 b1 THEN q1 = 1 ;,ELSIF a1 b1 THEN q1 b1 THEN q1=1;,ELSE q1 = 0 ;,END IF;,END PROCESS ;,END,one;,图2-6 例12的电路图,LIBRARY IEEE;,USE IEEE.STD_LOGIC_1164.ALL;,ENTITY,jkdff,IS,PORT(pset,clk,clr,j,k,: IN STD_LOGIC;,q,qb:OUT,STD_LOGIC);,END,jkdff,;,ARCHITECTURE,rtl,OF,jkdff,IS,SIGNAL,q_s,qb_s,: STD_LOGIC;,BEGIN,PROCESS(pset,clr,clk,j,k,),BEGIN,IF (,pset,=0) THEN,q_s,=1;,qb_s,=0;,ELSIF (,clr,=0) THEN,q_s,=0;,qb_s,=1;,ELSIF (,clkEVENT,AND,clk,=1) THEN,IF (j=0) AND (k=1) THEN,q_s,=0;,qb_s,=1;,ELSIF (j=1) AND (k=0) THEN,q_s,=1;,qb_s,=0;,ELSIF (j=1) AND (k=1) THEN,q_s,=NOT,q_s,;,qb_s,=NOT,qb_s,;,END IF;,END IF;,q=,q_s,;,qb,=,qb_s,;,END PROCESS; END,rtl,;,阶段作业一,1.,在四选一数据选择器的基础上,引入逻辑位矢量概念,设计一个八位四选一数据选择器。即四选一,MUX,的四路输入都是,8,位的。,2.,设计一个六选一数据选择器。,2.2.3 实现时序电路的,VHDL,不同表达方式,【例13】,.,PROCESS (CLK),BEGIN,IF CLKEVENT AND (CLK=1) AND (CLKLAST_VALUE=0),THEN Q = D ; -,确保,CLK,的变化是一次上升沿的跳变,END IF;,END PROCESS ;,【例14】,.,PROCESS (CLK),BEGIN,IF CLK=1 AND CLKLAST_VALUE=0 -,同例5-13,THEN Q = D ;,END IF;,END PROCESS ;,2.2.3 实现时序电路的,VHDL,不同表达方式,【例15】,LIBRARY IEEE ;,USE IEEE.STD_LOGIC_1164.ALL ;,ENTITY DFF3 IS,PORT (CLK : IN STD_LOGIC ;,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) - CLK,的数据类型必须是,STD_LOGIC,THEN Q1 = D ;,END IF;,Q = Q1 ;,END PROCESS ;,END ;,2.2.3 实现时序电路的,VHDL,不同表达方式,【,例16,】,.,PROCESS,BEGIN,wait until CLK = 1 ; -,利用,wait,语句,Q = D ;,END PROCESS;,【例17,】,.,PROCESS (CLK),BEGIN,IF CLK = 1,THEN Q = D ; -,利用进程的启动特性产生对,CLK,的边沿检测,END IF;,END PROCESS ;,【,例18,】,.,PROCESS (CLK,D) BEGIN,IF CLK = 1 -,电平触发型寄存器,THEN Q = D ;,END IF;,END PROCESS ;,2.2.3 实现时序电路的,VHDL,不同表达方式,图 7 边沿型触发器时序波形,图8 电平触发型寄存器的时序波形,2.2.4 异步时序电路设计,.,ARCHITECTURE,bhv,OF MULTI_DFF IS,SIGNAL Q1,Q2 : STD_LOGIC;,BEGIN,PRO1: PROCESS (CLK),BEGIN,IF CLKEVENT AND CLK=1,THEN Q1 = NOT (Q2 OR A);,END IF;,END PROCESS PRO1;,PRO2:PROCESS (Q1),BEGIN,IF Q1EVENT AND Q1=1,THEN Q2 = D;,END IF;,QQ = Q2 ;,END PROCESS PRO2 ;,图9 例19综合的电路,【,例19】,LIBRARY,ieee,;,USE ieee.std_logic_1164.ALL;,USE,ieee.std_logic_unsigned.ALL,;,ENTITY cnt_10 IS,PORT(clk,ENA,clr:IN,std_logic;,CQ: BUFFER std_logic_vector(3,downto,0);,Y: OUT std_logic);,END cnt_10;,ARCHITECTURE A OF cnt_10 IS,BEGIN,Y=1 WHEN (CQ=1001) ELSE 0;,PROCESS(CLK,clr,),BEGIN,IF (,clr,=0) THEN CQ=0000;,ELSIF (,clkevent,AND,clk,=1) THEN,IF (ENA=1) THEN,IF (CQ=9) THEN CQ=0000;,ELSE CQ=,、,=,、,、,/=,、,AND,和,MOD,等,对相应的数据类型,integer,、,std_logic,、,std_logic_vector,的操作作了重载,即通过重新定义运算符的方式,允许不同数据类型之间用此运算符进行运算。,这是什么程序包?为何要用它?,LIBRARY,ieee,;,USE ieee.std_logic_1164.ALL;,USE,ieee.std_logic_unsigned.ALL,;,ENTITY cnt_10 IS,PORT(clk,ENA,clr:IN,std_logic;,CQ: BUFFER std_logic_vector(3,downto,0);,Y: OUT std_logic);,END cnt_10;,ARCHITECTURE A OF cnt_10 IS,BEGIN,Y=1 WHEN (CQ=1001) ELSE 0;,PROCESS(CLK,clr,),BEGIN,IF (,clr,=0) THEN CQ=0000;,ELSIF (,clkevent,AND,clk,=1) THEN,IF (ENA=1) THEN,IF (CQ=9) THEN CQ=0000;,ELSE CQ=CQ+1;,END IF; END IF; END IF;,END PROCESS; END A;,带使能、清零的10进制计数器,CQ,设成,buffer,是因为后面有:,CQ=CQ+1;,Y,是进位输出,当计数到时,,Y,为1,只要,clr,=0,就置零,与,clk,无关-异步清零,计到9后再来,clk,就回零,信号在进程结束后赋值,若9,就递增计数,十进制计数器时序图(注意异步清零),四位二进制计数器,LIBRARY,ieee,;,USE ieee.std_logic_1164.ALL;,USE,ieee.std_logic_unsigned.ALL,;,ENTITY cnt_10 IS,PORT(clk,ENA,clr:IN,std_logic;,CQ: BUFFER std_logic_vector(3,downto,0);,Y: OUT std_logic);,END cnt_10;,ARCHITECTURE A OF cnt_10 IS,BEGIN,Y=1 WHEN (CQ=1111) ELSE 0;,PROCESS(CLK,clr,),BEGIN,IF (,clr,=0) THEN CQ=0000;,ELSIF (,clkevent,AND,clk,=1) THEN,IF (ENA=1) THEN CQ=CQ+1;,END IF; END IF;,END PROCESS; END A;,把上例中到9回零的语句去掉:,IF(CQ=9),THEN,CQ=,“,0000,”,;,在将进位输出改到,“,1111,”,。就成了四位二进制计数器,LIBRARY,ieee,;,USE ieee.std_logic_1164.ALL;,USE,ieee.std_logic_unsigned.ALL,;,ENTITY cntm6 IS,PORT(clk,ENA,clr:IN,std_logic;,CQ:buffer std_logic_vector(3,downto,0);,y:OUT std_logic);,END cntm6;,ARCHITECTURE BHV OF cntm6 IS,BEGIN,y=1 WHEN (CQ=0101) ELSE 0;,PROCESS(CLK,clr,),BEGIN,IF,clr,=0 THEN CQ=0000;,ELSIF (,clkevent,AND,clk,=0)THEN,IF (ENA=1) THEN,IF (CQ=5) THEN CQ=0000;,ELSE CQ=CQ+1;,END IF;,END IF;,END IF;,END PROCESS;,END BHV;,后沿触发的六进制计数器,ENA-,使能端;,clr,-,异步清零;,LIBRARY,ieee,;,USE ieee.std_logic_1164.ALL;,USE,ieee.std_logic_unsigned.ALL,;,ENTITY cntm6 IS,PORT(clk,ENA,clr:IN,std_logic;,CQ:buffer std_logic_vector(3,downto,0);,y:OUT std_logic);,END cntm6;,ARCHITECTURE BHV OF cntm6 IS,BEGIN,y=1 when(CQ=0101)ELSE 0;,PROCESS(clk,),BEGIN,IF (,clkevent,AND,clk,=0)THEN,IF,clr,=0 THEN CQ=0000;,ELSIF(ENA=1)THEN,IF(CQ=5)THEN CQ=0000;,ELSE CQ=CQ+1;,END IF;,END IF;,END IF;,END PROCESS;,END BHV;,同步清零的六进制计数器,同步清零的六进制计数器时序图,异步清零的六进制计数器时序图,阶段作业二,1.,在,p388,十进制计数器的基础上,改造成为,:,具有异步清零端的十进制计数器;具有同步清零端的十进制计数器;具有同步预置数功能的十二进制进制计数器;带清零的六十进制计数器;带清零的,24,进制计数器。,2.2.5,VHDL,设计基本概念和语言现象小节,数据类型,数据对象,信号属性,时钟检测,VHDL,库,程序包,时序电路,异步时序,2.3 1位二进制全加器的,VHDL,设计,图10半加器,h_adder,电路图,图11 全加器,f_adder,电路图,2.3.1 半加器描述和,CASE,语句,absoco,0000,0110,1010,1101,表5-1 半加器,h_adder,逻辑功能真值表,1.,CASE,语句,CASE,语句的一般表式是:,CASE ,IS,When = ; . ; ;,When = ; . ; ;,.,END CASE ;,2. 标准逻辑矢量数据类型,STD_LOGIC_VECTOR,3. 并置操作符,以下是一些并置操作示例:,SIGNAL a : STD_LOGIC_VECTOR (3 DOWNTO 0) ;,SIGNAL d : STD_LOGIC_VECTOR (1 DOWNTO 0) ;,.,a=1,0,d(1),1;,元素与元素并置,并置后的数组长度为4,.,IF a,d = 101011 THEN . -,在,IF,条件句中可以使用并置符,2.3.1 半加器描述和,CASE,语句,在使用,STD_LOGIC_VECTOR,中,必须注明其数组宽度,即位宽,如:,B : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ;,或,SIGNAL A :STD_LOGIC_VECTOR(1 TO 4),2.3.1 半加器描述和,CASE,语句,【例20】,LIBRARY IEEE ;-,或门逻辑描述,USE IEEE.STD_LOGIC_1164.ALL;,ENTITY or2a IS,PORT (a, b :IN STD_LOGIC;,c : OUT STD_LOGIC );,END ENTITY or2a;,ARCHITECTURE one OF or2a IS,BEGIN,c = a OR b ;,END ARCHITECTURE fu1;,【例21】,LIBRARY IEEE; -,半加器描述(1),USE IEEE.STD_LOGIC_1164.ALL;,ENTITY adder IS,PORT (a, b : IN STD_LOGIC;,co, so : OUT STD_LOGIC);,END ENTITY adder;,ARCHITECTURE fh1 OF adder is,BEGIN,so = NOT(a XOR (NOT b) ;,co = a AND b ;,END ARCHITECTURE fh1;,LIBRARY IEEE; -,【例22,-,半加器描述(2),USE IEEE.STD_LOGIC_1164.ALL;,ENTITY h_adder IS,PORT (a, b : IN STD_LOGIC;,co, so : OUT STD_LOGIC);,END h_adder;,ARCHITECTURE fh1 OF h_adder is,SIGNAL Q : STD_LOGIC_VECTOR(1 DOWNTO 0) ;,BEGIN,Q so=0; co so=1; co so=1; co so=0; co NULL ;,END CASE; END PROCESS; END fh1 ;,【例22】,. -半加器描述(3),SIGNAL,abc,cso,: STD_LOGIC_VECTOR(1 DOWNTO 0 );,BEGIN,abc,cso,cso,cso,cso,=10 ;,END CASE;,END PROCESS;,END ARCHITECTURE fh1;,LIBRARY IEEE; -,例23】,1,位二进制全加器顶层设计描述,USE IEEE.STD_LOGIC_1164.ALL;,ENTITY f_adder IS,PORT (,ain,bin,cin,: IN STD_LOGIC;,cout,sum,: OUT STD_LOGIC );,END ENTITY f_adder;,ARCHITECTURE fd1 OF f_adder IS,COMPONENT h_adder,PO
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!