VHDL快速入门_第1页
VHDL快速入门_第2页
VHDL快速入门_第3页
VHDL快速入门_第4页
VHDL快速入门_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

盛建伦jlsheng,1,习题参考答案,1-14,(1),(2),(3),(4),(5),(6),盛建伦jlsheng,2,习题参考答案,1-16,(1),盛建伦jlsheng,3,习题参考答案,1-16,(2),盛建伦jlsheng,4,习题参考答案,1-16,(3),盛建伦jlsheng,5,习题参考答案,1-16,(4),1-19输入A、B、C、D是一个十进制数X的8421BCD码,当X为奇数时,输出Y为1,否则Y为0。,习题参考答案,真值表,如果不利用约束项化简,1-19输入A、B、C、D是一个十进制数X的8421BCD码,当X为奇数时,输出Y为1,否则Y为0。,习题参考答案,真值表,如果利用约束项化简,盛建伦jlsheng,8,数字逻辑,DigitalLogic,青岛理工大学,广义双语教学课程,211.64.192.58,盛建伦jlsheng,9,硬件描述语言VHDL基础,VHDL(非常高速集成电路硬件描述语言)是由美国国防部支持的一项研究计划,于1983年创建,目的是以文字化方法描述电子电路与系统。1987年,VHDL成为IEEE标准,即IEEE1076标准,1993年修改为IEEE1164标准,1996年,IEEE又将电路合成的标准程序与规格加入到VHDL语言中,称为1076.3标准。之后,又有1076.4标准和1076.6标准。,VeryHighspeedIntegratedCircuitHardwareDescriptionLanguage,VHDL用语言的方式而非图形等方式描述硬件电路,容易修改,容易保存。特别适合于设计组合逻辑电路和状态机:译码器、编码器、加法器、多路选择器、地址译码器、计数器、.,附录A,盛建伦jlsheng,10,VHDL程序基本结构,VHDL语言通常包含实体(Entity),结构体(Architecture),配置(Configuration),包集合(Package),和库(Library)五部分。,库是专门存放预编译程序包的地方。,其中实体用于描述所设计的系统的外部接口信号;,配置语句安装具体元件到实体结构体对,可以被看作是设计的零件清单;,结构体用于描述系统内部的结构和行为;建立输入和输出之间的关系;,包集合存放各个设计模块共享的数据类型、常数和子程序等;,盛建伦jlsheng,11,VHDL程序设计基本结构,盛建伦jlsheng,12,VHDL主要用于描述设计系统的结构、行为、功能和接口。,器件或子系统ARCHITECTUREProcessProcessSequentialProcessCombinationalProcesscomponentPorts,它将一个设计(元件、电路、系统)分为:,外部(可视部分、端口),内部(不可视部分、内部功能、算法)。,VeryHighspeedIntegratedCircuitHardwareDescriptionLanguage,盛建伦jlsheng,13,一、信号(signal)的含义和信号的两种最常用类型:std_logic和std_logic_vector,VHDL入门需掌握的基本知识,二、四种常用语句的基本用法赋值语句、if语句、case语句和process语句,三、实体(entity)、结构体(architecture)以及一个实体和一个结构体组成的设计实体。,四、层次结构的设计掌握元件(component)语句和端口映射(portmap)语句。,五、库(library)和程序包(package)的基本使用。,有了以上入门知识,就能够做一般的设计了。,盛建伦jlsheng,14,库(library)和程序包(package),库(Library)用于存放预先编译好的程序包(Package),,作用:,程序包中定义了数据集合体、逻辑操作和元件等。主要是声明在设计或实体中将用到的常数,数据类型,元件及子程序等。,任何一种设计都要充分利用前人已有的成果,公用的资源要尽可能使用;自己已经设计好的资源也要尽量利用起来,程序包(package)和库(library)就是一些可以公用的资源,是设计实体的一个重要组成部分。,盛建伦jlsheng,15,库(library),设计库对当前设计是可见的,默认的,无需用library子句和use子句说明的库。,VHDL的库分为两种,一种是设计库,一种是资源库。,库是用来放置可编译的设计单元的地方。VHDL中的常用库有:STD库、WORK库、IEEE库和用户定义库。,Std和work这两个库是设计库。,盛建伦jlsheng,16,VHDL的标准库。库中存放有称为“standard”的标准包集合,其中定义了多种常用的数据类型,均不加说明可直接引用。,库(library),STD库,常用的资源库。IEEE库包含经过IEEE正式认可的STD_LOGIC_1164包集合和某些公司提供的一些包集合,如STD_LOGIC_ARITH(算术运算库)、STD_LOGIC_UNSIGNED等。,WORK库是现行作业库。设计者所描述的VHDL语句不需要任何说明,将都存放在WORK库中。WORK库对所有设计都是隐含的,因此在使用该库时无需进行任何说明。,IEEE库,WORK库,盛建伦jlsheng,17,库(library),用户定义库,用户定义库简称用户库,是由用户自己创建并定义的库。,除了IEEE标准资源库外,各可编程器件厂家的EDA软件提供自己独特的资源程序包。由于这些程序包是为它们制造的器件服务的,往往更有针对性。Qartus中提供了一个LPM库,库中有许多称之为MegaFunctions的功能强大的函数。,设计者可以把自己经常使用的非标准(一般是自己开发的)包集合和实体等汇集在一起定义成一个库,作为对VHDL标准库的补充。,用户定义库在使用时同样要首先进行说明。,盛建伦jlsheng,18,库(library),除了STD库和WORK库之外的其它库均为资源库。,使用资源库中的元件和函数之前,需要使用library子句和use子句予以说明。,没有说明的库中的元件不能使用。,library子句和use子句总是放在设计实体的最前面(可以放在注释之后)。,如果一个设计实体中使用了某个库中的元件和函数,就要使用相应的library子句和use子句。,library子句的作用是使该库在当前文件中“可见”。,盛建伦jlsheng,19,library子句说明使用哪个库,它的格式是library库名1,库名2,库名n;,库(library),std库和work库是设计库,在任何设计文件中隐含都是“不可见”的,不需要特别说明。也就是说,每一个设计文件中总是隐含下列不可见的行:librarystd,work;usestd.standard.all;,use子句说明使用哪个库中的哪个程序包中的元件或者函数。它的格式是:use库名.程序包名.all;,这些是不用在程序里写的,盛建伦jlsheng,20,程序包(package),程序包是一种使包体中的类型、常量、元件和函数对其他模块(文件)是可见、可以调用的设计单元。,程序包是公用的存储区,在程序包内说明的数据,可以被其它设计实体使用。程序包由包头和包体两部分组成。,盛建伦jlsheng,21,VHDL语言要素,盛建伦jlsheng,22,VHDL数据对象,数据对象(DataObjects):,凡是可以被赋予一个值的对象称为数据对象,数据对象用于传递信号。,例:,数据对象值的类型,数据对象类型,数据对象名,盛建伦jlsheng,23,信号和变量,信号(signal),变量(variable),是硬件中物理连线的抽象描述,信号在元件的端口连接元件以及在元件内部各部分之间的连接。,在硬件中没有类似的对应关系,它们主要用于保存中间结果。例如作为数组的下标。,常量代表数字电路中的电源、地、恒定逻辑值等常数。,常量(Constant),盛建伦jlsheng,24,信号在逻辑电路设计中最常用的数据类型,在VHDL中有10种数据类型,但是在逻辑电路设计中最常用的是std_logic和std_logic_vector提供的数据类型。,std_logic类型分为布尔(boolean)型、位(bit)型、位矢量(bit_vector)型。,std_logic有9种状态,常用的是三种状态:,1高电平0低电平z高阻,高阻状态是为了总线的描述,盛建伦jlsheng,25,信号说明,一个信号只有经过说明后才能使用。用VHDL进行设计就是写一系列语句。信号说明形式如下:,一个语句用分号结束。,Signalclock,T1,T2:std_logic;,Signal信号名:数据类型:=设定值;,SignalA:Std_logic_vector(3Downto0):=“0000”;,例如:,Signalr0,r1,r2,r3:std_logic_vector(15downto0);,Signalr0,r1,r2,r3:std_logic_vector(0upto15);,设定值,可选项,盛建伦jlsheng,26,(1)说明位置不同,信号通常在实体、结构体和程序包中说明,变量一般在进程、过程和函数语句中说明;,信号与变量的区别,(2)赋值运算符不同,信号用“=”符号进行赋值,变量用“:=”符号赋值;,(3)延迟不同,信号的赋值存在延迟,变量的赋值是直接的,没有任何延迟时间。,从信号说明看不出一个信号是组合逻辑还是时序逻辑(例如寄存器),这与ABEL语言是不同的。,盛建伦jlsheng,27,VHDL操作符,VHDL操作符:,逻辑操作符,算术操作符,符号操作符,关系操作符,盛建伦jlsheng,28,逻辑运算符,-signala,b:std_logic;-signalc,d:std_logic_vector(7downto0);,有7种逻辑运算符:,NOT、OR、AND、NAND、NOR、XOR、XNOR。,说明:-是注释开始的标志,这些signal语句的存在只是为了说明这些信号的类型,供阅读方便使用。,两个进行逻辑运算的信号,类型必须相同。例如,aandbaorbnota,正确,canddcxordnotc,正确,aandc,错误,常用的为前三种。,盛建伦jlsheng,29,不等于(aandb)or(candd),逻辑运算符,例如:,aandborcandd,等于(aandb)orc)andd,这些逻辑运算符,not优先级最高,其他的优先级相同。因此运算时按由左到右的顺序展开。运算时要注意加括号。,NOT、OR、AND、NAND、NOR、XOR、XNOR。,能进行逻辑运算的数据类型:bit、bit_vector、boolean,std_logic、std_logic_vector,盛建伦jlsheng,30,Signala,b,c,d:std_logic_vector(3downto0);,Signale,f,g,h:std_logic_vector(1downto0);,d=aandbandc;,d=aorborc;,d=axnorbxnorc;,h=enorfnorg;,h=(enorf)norg;,d=(enorf)norg;,例,盛建伦jlsheng,31,算术运算符,a+ba+1,常用的算术运算符有:+-,-USEieee.Std_logic_arith.ALL;-signala,b:std_logic_vector(15downto0);,字符串必须用双引号括起来,字符类型通常用单引号引起来,字符类型区分大小写,,a+01,求和运算符、求积运算符、符号运算符、混合运算符、移位运算符,VHDL中的求和运算符包括加减运算和并置运算,操作数的数据类型为整型。,例,VHDL语句不区分大小写,盛建伦jlsheng,32,并置运算符-signalc,d:std_logic_vector(2downto0);aand(1,Signalb:std_logic_vector(2downto0);,Signalc:std_logic_vector(1downto0);,bc,a=bc,例:,并置运算符-signald,e,q:std_logic_vector(3downto0);,=是信号赋值符,=左右两边数据类型必须相同,数据长度必须相同。,1、信号赋值语句,由于信号是物理量,因此赋值有延迟时间。如第二个语句就是一个或门,因此,信号d”或“q后到e有延迟时间。,信号赋值语句的语法格式为:目标信号名=表达式(设定值);,c=not(aandb);e=dorq;,盛建伦jlsheng,38,-variablex,y,z:integerrange0to255;x:=0;y:=132;z:=x;,赋值语句,2、变量赋值语句,:=是变量赋值符。:=左右两边的数据类型必须相同。由于变量没有相对应的明确的物理量,因此变量赋值没有时间延迟。,盛建伦jlsheng,39,3.并行赋值语句,(1)条件赋值语句,格式:,目标信号=表达式1WHEN条件1ELSE,表达式2WHEN条件2ELSE,表达式N-1WHEN条件N-1ELSE,表达式N;,盛建伦jlsheng,40,3.并行赋值语句,y0=1whena0=0anda1=0else0;,(1)条件赋值语句,例:用条件赋值语句描述2-4译码器的功能,signala0,a1:std_logic;-输入signaly0,y1,y2,y3:std_logic;-输出,y1=1whena0=1anda1=0else0;,y2=1whena0=0anda1=1else0;,y3=1whena0=1anda1=1else0;,盛建伦jlsheng,41,并行赋值语句,(2)选择赋值语句,格式:,目标信号=信号表达式1WHEN选择条件1,,信号表达式2WHEN选择条件2,,WITH选择条件表达式SELECT,信号表达式NWHEN选择条件N;,盛建伦jlsheng,42,并行赋值语句,(2)选择赋值语句,signals:std_logic;-输出signalm:std_logic_vector(1downto0);-输入,withmselect,例:用选择赋值语句描述异或门的功能,sb)THENoutb)THENout=1;ELSEout=0;ENDIF;,2、二选一if语句,例,盛建伦jlsheng,46,例:一个8位二选一数据选择器,用于二选一控制的if语句,-signalsel:std_logic;-signala,b,c:std_logic_vector(7downto0);,ifsel=1thenc=a;elsec=b;endif;,盛建伦jlsheng,47,第三种IF语句,If条件1Then若干语句;Elsif条件2Then若干语句;else条件nThen若干语句;Endif;,语句格式,3、多选一if语句,盛建伦jlsheng,48,例:,Process(A)BeginIfA=”00”thenf=D0;elsifA=”01”thenf=D1;elsifA=”10”thenf=D2;elsef=D3;endif;endprocess;,多选一if语句,盛建伦jlsheng,49,process语句,process语句通常称为进程语句,本质上它描述了一个功能独立的电路块。,在VHDL中,所有的并行执行语句都代表功能独立的电路块,而所有顺序执行语句则是用于描述电路块的功能。,process语句有许多变种,这里只介绍最基本的形式。,流程控制语句,process语句是个并行执行的语句,但是process语句内部的语句要求是顺序执行语句。它是VHDL程序中,描述硬件并行工作的最重要最常用的语句。,50,Process语句的书写格式是:进程名:process(敏感信号1,敏感信号2,敏感信号n)若干变量说明语句begin若干顺序执行语句endprocess进程名;,process语句,用方括号括起来的部分是可选的,第一个进程名以冒号结束,和关键字process隔开,它是可选的,可要可不要,对硬件电路没有影响。但建议最好加上进程名,加上进程名等于给这块功能独立的电路加了个标记,增强可读性。,process语句中,begin之前的若干变量说明语句也是可选的。如果该process语句中需要使用变量,则需要在begin之前予以说明。这些被说明的变量只对该进程语句起作用,只能在该process语句中使用。,敏感信号表,盛建伦jlsheng,51,process语句中有个敏感信号表,各敏感信号之间用逗号分开。最后一个敏感信号后面是括号,不需要跟一个逗号。,process语句,所谓敏感信号就是指当它的状态发生变化时,启动process语句执行。由于process语句代表一块功能独立的电路,它的某些输入信号的状态变化,势必引起电路输出的变化,这些立即引起(当然要经过短暂的时间延迟)输出信号状态变化的信号就是敏感信号。,变量不是真正的物理量,因此不能出现在敏感信号表中。在process语句中只作为输出存在的信号(出现在信号赋值符“=”的左边),不能作为敏感信号。,既出现在信号赋值符“=”的左边,又出现在信号赋值符“=”右边的信号,可以出现在敏感信号表中,这是因为这些信号既作为这块电路的输出,又是电路内部的反馈信号。,盛建伦jlsheng,52,在process语句的书写格式中,在begin和endprocess之间的若干顺序执行语句用于描述该process语句所代表的电路块的功能。,process语句,在前面介绍if语句时,用if语句描述了二选一选择器和多选一选择器。,但是由于if语句是顺序执行语句,因此不能代表一块功能独立的电路,只能成为一块功能独立电路的一部分。需要对前面的if语句进行改造,使之成为一块功能独立的电路(能并行执行)。,改造的方法之一就是将if语句放在process语句中。,盛建伦jlsheng,53,-signalsel:std_logic;-signala,b,c:std_logic_vector(15downto0);mux2to1:process(sel,a,b)beginifsel=0thenc=a;elsec=b;endif;endprocess;,process语句,例:二选一选择器,注意,本例中使用了进程名,不过在endprocess之后没有书写进程名。,敏感信号表中有3个输入信号,盛建伦jlsheng,54,case语句,case语句是顺序执行语句,常用来描述总线的行为、编码器和译码器的结构以及状态机等等。case语句可读性好,非常简洁。case语句的书写格式为,流程控制语句,case条件表达式iswhen条件表达式值1=若干顺序执行语句when条件表达式n=若干顺序执行语句whenothers=若干顺序执行语句endcase;,盛建伦jlsheng,55,在case语句中,某一个条件表达式满足时,就执行它后面的顺序执行语句。,case语句,if语句的执行是按顺序执行,各条件有不同的优先级;,case语句各条件表达式值之间不存在不同的优先级,它们是同时执行的,执行的顺序与各条件表达式值的书写顺序无关。,case语句中条件表达式的值须一一列举,不能遗漏;如果不需要一一列举,则用others代替。,case语句和if语句在许多情况下完成的功能是相同的,在这些情况下,用case语句描述比用if语句描述更清晰、更简洁。,盛建伦jlsheng,56,-signalsel:std_logic_vector(1downto0);-signala,b,c:std_logic;process(a,b,sel)beginselccnull;endcase;endprocess;,case语句,本例中出现的“null;”是个什么也不做的空语句。,例:2输入与非门,本例中,首先将与非门输入信号a和b并置,生成一个2位的std_logic_vector信号sel。,信号c是与非门的输出。,第一个when中的“|”代表或者,即三个条件中的任何一个满足,都执行c=1语句。,实际上与非门一般不这样设计。常用的设计方法是:c=not(aandb);,盛建伦jlsheng,57,设计实体,在VHDL的设计中,基本设计单元是设计实体。,实体描述了该设计实体对外的接口;结构体描述了设计实体内部的性能;程序包存放各设计实体能共享的数据类型、常数和子程序等等,库中存放已编译好的实体、结构体、程序包和配置。配置描述了实体与构造体之间的连接关系。,一个设计实体最多由5部分构成:实体(entity),一个或者几个结构体(architecture),使用的库(library)和程序包(pachage),配置(configuration)。,这里仅讨论含有一个结构体的设计实体,绝大多数设计实体都是仅含一个结构体的设计实体。一个实体-结构体“对”共同定义一个电路模型。,盛建伦jlsheng,58,设计实体,盛建伦jlsheng,59,实体(entity),实体由实体(entity)语句说明。实体语句又称为实体说明(entitydeclaration)语句。实体语句的作用是定义设计实体对外的信号。entity语句的书写格式如下:,entity实体名isgeneric(类属参数表);port(端口信号表);实体说明部分;begin实体语句部分;end实体名;,最常用的形式是:entity实体名isport(端口信号表);end实体名;,盛建伦jlsheng,60,port(端口)语句的书写格式是:port(端口名,端口名:模式数据类型;端口名,端口名:模式数据类型;端口名,端口名:模式数据类型);,实体(entity),实体中的每一个输出/输入被称为一个端口。一个端口实际上是一个信号,因为这些信号负责设计实体与外部的接口,因此称为端口。如果设计实体是一个封装起来的元件,那么端口相当于元件的引脚(pin)。,跟普通信号有两点不同:一是端口一定是信号,因此在说明时省略了关键字signal,二是在说明普通信号的信号说明语句中的信号没有说明方向,端口由于是设计实体与外部的接口,因而是有方向的。,盛建伦jlsheng,61,例:,实体(entity),port(reset,cs:instd_logic;rd,wr:instd_logic;a1,a0:instd_logic;pa,pb:inoutstd_logic_vector(7downto0);pcoutstd_logic_vector(15downto0);,port(端口)语句的书写格式:port(端口名,端口名:模式数据类型;端口名,端口名:模式数据类型);,注意:pc信号一行最后不以分号结束,盛建伦jlsheng,62,端口的模式用来说明信号通过端口的方向和通过方式,这些方向都是相对该设计实体而言的。例如,in模式对设计实体就是输入。有下列几种模式:,实体(entity),in流入设计实体,输入,out从设计实体流出,输出,inout双向端口,即可输入,又可输出,buffer缓存,能用于内部反馈的输出,盛建伦jlsheng,63,out模式和buffer模式的区别在于out端口不能用于设计实体的内部反馈。buffer端口能够用于设计实体的内部反馈。,实体(entity),(a)q1的模式是out,(b)q1的模式是buffer,盛建伦jlsheng,64,结构体(architecture),结构体描述设计实体内部的特性。结构体的书写格式如下:,architecture结构体名of实体名is内部信号,常量,数据类型,函数等的定义;begin若干并行执行语句end结构体名;,实体名一定要与本结构体对应实体的实体名完全一致。architecture后面的结构体名要与end后的结构体名完全一致,而不是与实体名一致。结构体名可以随便起,因为别的地方很少用到结构体名。,结构体内要求使用并行执行语句。,类似if之类的顺序执行语句,只要将它们放在进程语句process语句之内即可。process语句是并行执行语句。,盛建伦jlsheng,65,前面已经说明了并行语句和顺序执行语句的区别。,结构体(architecture),并行执行语句代表一个独立的功能电路,因此它一定有明确表示或者隐含表示的输入、输出信号,如process语句中敏感信号表中的信号不是输入信号就是反馈信号。,而顺序执行语句只用于描述电路的功能一般很难判断输入输出信号,因此不能代表一个独立的功能电路,例如从一个if语句中判断输入输出信号就比较难。,盛建伦jlsheng,66,结构体有3种描述方式:行为描述、结构描述和数据流描述。,结构体(architecture),(1)行为描述描述该设计实体的功能,即该单元能做什么。,(2)结构描述描述该设计实体的硬件结构,即该设计实体的硬件是如何构成的。,(3)数据流方式以类似于寄存器传输级的方式描述数据的传输和变换。主要使用并行执行的信号赋值语句,既显式表示了设计实体的行为,也隐式表示了设计实体的结构。,其实初学者不用太钻研各种描述方式的定义,只要能正确描述设计实体的内部特性即可。,盛建伦jlsheng,67,结构体内部要求使用并行执行的语句,这是十分重要的。每个并行执行语句都是一块独立的电路。,结构体(architecture),像与非门这种简单的电路通过信号赋值语句很容易做到,但是像16位寄存器用简单的信号赋值语句就无法实现,因此process语句在结构体内得到了大量的应用。

温馨提示

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

评论

0/150

提交评论