数字系统设计:第三章 VHDL语言基础_第1页
数字系统设计:第三章 VHDL语言基础_第2页
数字系统设计:第三章 VHDL语言基础_第3页
数字系统设计:第三章 VHDL语言基础_第4页
数字系统设计:第三章 VHDL语言基础_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

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

文档简介

第三章VHDL语言基础本章目录VHDL概述VHDL程序的基本结构VHDL程序的主要构件VHDL数据类型及运算符VHDL数据对象VHDL基本语句测试基准VHDL程序的其他组件结构体的描述方法VHDL概述VHDL概述什么是VHDLVHDL—Very-High-SpeedIntegratedcircuitHardwareDescriptionLanguageVHDL的起源及发展80年代初,由美国国防部在实施超高速集成电路(VHSIC)项目时开发的1987年,IEEE协会批准为IEEE工业标准,称为IEEE1076-19871993年,被更新为93标准,IEEE1076.931996年,IEEE1076.3称为综合标准VHDL概述VHDL的用途主要用于描述字系统的结构、行为、功能和接口使用VHDL的目的把电子电路的设计意义以文字或文件的形式保存起来,以便其它人能方便地了解电路的设计意义VHDL与verilogHDL的比较相同点:都是主要的硬件描述语言

都能以文本形式抽象表示电路的行为和结构

都可以从系统行为级,寄存器传输级和门级描

进行电路描述不同点语法差异,verilog是类C语言,简单易用,

而VHDL语句较为晦涩,使用难度大VHDL侧重于系统描述,更适合系统级设计

Verilog侧重于电路级描述,更适合电路设

计VHDL特点系统硬件描述能力强与器件无关,与工艺无关IEEE工业标准方法灵活,技术齐全可读性好VHDL具有硬件特征,而且是并行执行方式。VHDL概述举例:二路选择器描述的变化二路选择器模块:sel=0时,q=d0;sel=1时,q=d1。传统的描述方式:用与门、非门、或门等具体底层器件来组成,使用图形输入法。缺点:硬件电路设计复杂,需要先写出逻辑表达式或真值表,并进行化简。VHDL概述举例:二路选择器描述的变化VHDL描述方式:使用文本输入的方法。设计电路优点:可读性好,设计简单,具体电路由软件优化。LIBRARYIEEE;USEIEEE.std_logic_1164.all;ENTITYMUX2IS

PORT(d0,d1:INstd_logic;sel:INstd_logic;q:OUTstd_logic);ENDENTITY;ARCHITECTUREbehavOFMUX2ISBEGIN

PROCESS(d0,d1,sel)BEGIN

IFsel=‘0’THENq<=d0;

ELSIFsel=‘1’THENq<=d1;

ELSEq<=‘Z’;

ENDIF;ENDPROCESS;ENDbehav;VHDL程序的基本结构VHDL程序的基本结构一个完整的VHDL程序包括库的调用,程序包的调用,实体说明和结构体4个部分。另外还可包括配置部分库的调用程序包的调用实体描述结构体描述用于说明设计系统的外部接口信息,具有唯一性相当于操作系统中的目录描述实体的行为、功能或电路结构类似于高级语言的include语句VHDL的基本结构配置描述层间或实体与结构体的关系Example库的调用程序包的调用实体描述结构体描述VHDL的基本结构LIBRARYIEEE;USEIEEE.std_logic_1164.all;ENTITYMUX2ISPORT(d0,d1:INstd_logic;

sel:INstd_logic;

q:OUTstd_logic);ENDENTITY;ARCHITECTUREbehavOFMUX2ISBEGINPROCESS(d0,d1,sel)

BEGINIFsel=‘0’THEN

q<=d0;ELSIFsel=‘1’THEN

q<=d1;ELSEq<=‘Z’;ENDIF;ENDPROCESS;ENDbehav;二路选择器的VHDLVHDL的主要构件VHDL程序的主要构件VHDL程序的基本构件包括库、包,配置,实体,结构体、块、子程序(函数和过程)主要构件库、程序包、实体、结构体,配置VHDL的主要构件1.库库(Library)是编译后数据的集合,是存放预先完成的程序包和数据集合体的仓库。LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;USEIEEE.std_logic_unsigned.ALL;Example:常用的库:STD库(默认库)IEEE库,WORK库(默认库),面向ASIC的库,用户自定义库使用格式:LIBRARY库名VHDL的主要构件:库STD库(默认库)库中的程序包为:standardSTD库符合VHDL语言标准,是默认库,在应用中不必像IEEE库那样显式使用STD库内定义了最基本的数据类型:Bit、bit_wector、Boolean、Integer、Real、Time并支持这些数据类型的所有运算符函数IEEE库IEEE库是VHDL设计中最常见的库,由于该库中的程序包并非符合VHDL语言标准,因此在使用时必须显示表达IEEE库内定义了四个常用的程序包:std_logic_1164(std_logictypes&relatedfunctionsStd_logic_arith(arithmeticfunctions)Std_logic_signed(signedarithmeticfunctions)Std_logic_unsigned(unsignedarithmeticfunctions)VHDL的主要构件:库LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;USEIEEE.std_logic_unsigned.ALL;Example:IEEE库四个常用的程序包:std_logic_1164包含了一些标准逻辑电平所需数据类型和函数的定义。常用的两个数据类型:STD_LOGIC和STD_LOGIC_VECTORStd_logic_arith扩展了三个数据类型UNSIGNED,SIGNED和SMALL_INT,并为其定义了相关的算术运算符和转换函数Std_logic_signed和Std_logic_unsigned重载了可用于INTEGER型和STD_LOGIC及STD_LOGIC_VECTOR型混合运算的运算符,并定义了不同数据类型间的转换函数VHDL的主要构件:库WORK库(默认库)WORK是用户现行设计的工作库,用于存放用户设计和定义的一些设计单元和程序包。该库满足VHDL语言标准,在实际调用中不需要显示调用VHDL的主要构件:库包集合包集合说明就像C语言中的include语句一样,用来单纯地罗列VHDL语言中所要用到的信号定义、常数定义、数据类型、元件语句、函数定义和过程定义等VHDL的主要构件:包Example:USEIEEE.STD_LOGIC_1164.ALL该语句表示在程序中要使用名为STD_LOGIC_1164的包集合中的所有定义或说明项VHDL的主要构件:包在VHDL中,同样的语句,使用不同的库或不同的包,所生成的电路,可能会逻辑相同,电路不同LIBRARYSTD;USESTD.STD_LOGIC.ALL;USESTD.STD_ttl.ALL;ENTITYnand2IS...ENDnand2;LIBRARYSTD;USESTD.STD_LOGIC.ALL;USESTD.STD_ttloc.ALL;ENTITYnand2

IS...ENDnand2;生成一般的与非门生成集电极开路的与非门VHDL的主要构件:实体实体(ENTITY)包括实体名,类属参数说明,端口说明三部分,由保留字“ENTITY”引导ENTITY实体名

IS [类属参数说明];

[端口说明];END [ENTITY][实体名];使用格式:注意:实体名不能以数字开头,不能与保留字相同实体名应尽可能表达功能上含义实体结束以“ENDENTITY”或“END实体名”结束VHDL的主要构件:实体ENTITY实体名

IS [类属参数说明];

[端口说明];END [ENTITY][实体名];类属参数说明常用于说明静态信息,如器件延迟由保留字GENERIC引导。格式如下:GENERIC(常数名:数据类型:=设定值);例如:GENERIC(m:time:=1ns);端口说明(重点讲解双向口)端口说明是一个设计实体界面的描述,提供外部接口信息。由保留字PORT引导格式如下:PORT(端口名:端口方向数据类型)

例如:PORT(d0:INstd_logic;);VHDL的主要构件:实体Example:写出如下器件的实体描述ENTITYmy_designISPORT(d:INstd_logic_vector(15DOWNTO0);

clk,reset,oe:INstd_logic;

q:OUTstd_logic_vector(15DOWNTO0);

ad:INOUTstd_logic_vector(15DOWNTO0);

int:BUFFERstd_logic;

as:OUTstd_logic);ENDmy_design;给几个练习VHDL的主要构件:结构体注意:结构体名应有明确的意义定义语句只对本结构体有效结构体里面的语句是并行的结构体(ARCHITECTURE)是设计实体的具体描述,指明设计实体的具体行为、所用元件及连接关系。由定义说明和具体功能描述两部分组成。使用格式:ARCHITECTURE

结构体名

OF实体名

IS[定义语句]信号(signal);

常数(constant);

数据类型(type);

函数(function);

元件(component)等;BEGIN[并行处理语句];END结构体名;VHDL的主要构件:结构体Example:半加器半加器电路是指对两个输入数据位进行加法,输出一个结果和进位。VHDL的主要构件:结构体Example:半加器半加器电路是指对两个输入数据位进行加法,输出一个结果和进位。LibraryIEEE;Useieee.std_logic_1164.all;Entityhalf_adderisport(X,Y:inbit;sum,carry:outbit);endhalf_adder;Architecturedataflowofhalf_adderisbegin--并行处理语句

sum<=XxorYafter10ns;carry<=XandYafter10ns;Enddataflow;实现程序VHDL的主要构件:结构体Example:半加器半加器电路是指对两个输入数据位进行加法,输出一个结果和进位。注意:仿真结果某一时刻的输出并非我们期待中的结果,这是因为我们使用的是时序仿真,考虑了器件的延时,后面的章节将会介绍功能仿真和时序仿真仿真结果VHDL的主要构件:结构体行为描述:描述输入与输出之间的转换行为,不包含内部的电路元件、电路的结构信息,一般将结构体命名为“behav”数据流描述既表示行为,又隐含着结构;体现数据的流动路径和方向,一般将结构体命名为“dataflow”结构描述法描述电路元件与它们之间的连接关系,一般将结构体命名为“stru数据类型结构体的描述方法VHDL的主要构件:结构体结构体的描述方法——全加器的行为描述architecturebehavofFAisbeginprocess(x,y,ci)variablen:integer;constantsum_vector:std_logic_vector(0to3):=“0101”;constantcarry_vector:std_logic_vector(0to3):=“0011”;beginn:=0;ifx=’1’thenn:=n+1;endif;ify=‘1’thenn:=n+1;endif;ifci=’1’thenn:=n+1;endif;s<=sum_vector(n);co<=carry_vector(n);endprocess;endbehav;libraryieee;useieee.std_logic_1164.all;entityFAisport(x,y,ci:instd_logic;s,co:outstd_logic);endFA;VHDL的主要构件:结构体结构体的描述方法——全加器的RTL方式libraryieee;useieee.std_logic_1164.all;entityFAisport(x,y,ci:instd_logic;s,co:outstd_logic);endFA;architecture

dataflow

ofFAisbegins<=xXORyXORci;co<=(xANDy)OR(xANDci)OR(yANDci);enddataflow;VHDL的主要构件:结构体结构体的描述方法——两种描述方式的仿真两种描述方式的仿真结果如下图,其中左图为用行为描述方式实现的全加器;右图为用RTL方式描述的全加器VHDL的主要构件:结构体结构体的描述方法——全加器的结构描述方式Architecturestructureoffull_adderisSignaltemp_sum:bit;--定义语句

Signaltemp_carry1:bit;Signaltemp_carry2:bit;Componenthalf_adderPort(X,Y:inbit;sum,carry:outbit);Endcomponent;

Componentor_gatePort(in1,in2:inbit;out1:outbit);Endcomponent;Begin--并行语句U0:half_adderPortmap(X=>A,Y=>B,sum=>temp_sum,carry=>temp_carry1);U1:half_adderPortmap(X=>temp_sum,Y=>carry_in,sum=>AB,carry=>temp_carry2);U2:or_gatePortmap(in1=>temp_carry1,in2=>temp_carry2,out1=>carry_out);Endstructure;LibraryIEEE;Usestd_logic_1164.all;Entityfull_adderis Port(A,B,carry_in:inbit;AB,carry_out:outbit);Endfull_adder;层次化设计VHDL的主要构件:配置配置作用设计实体仿真时,利用配置语句来选择不同的结构体,使其与要设计的实体相对应,从而进行性能的对比试验以得到性能最佳的结构体使用格式:CONFIGURATION配置名

OF

实体名

IS[语句说明];END

配置名;配置语句描述层与层之间的连接关系和实体与结构体之间的连接关系VHDL的主要构件:配置LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYexampleISPORT(a:INstd_logic;b:INstd_logic;y:OUTstd_logic);ENDexample;ARCHITECTUREand2_arcOFexampleISBEGINPROCESS(a,b)BEGINy<=aANDb;ENDPROCESS;ENDand2_arc;ARCHITECTUREor2_arcOFexampleISBEGINPROCESS(a,b)BEGINy<=aORb;ENDPROCESS;ENDor2_arc;ARCHITECTURExor2_arcOFexampleISBEGINPROCESS(a,b)BEGINy<=aXORb;ENDPROCESS;ENDxor2_arc;配置语句:设计时设计多个实体,以供配置选择VHDL的主要构件:配置CONFIGURATIONand2_cfgOFexampleISFORand2_arcENDFOR;ENDand2_cfg;CONFIGURATIONor2_cfgOFexampleISFORor2_arcENDFOR;ENDor2_cfg;CONFIGURATIONxor2_cfgOFexampleISFORxor2_arcENDFOR;ENDxor2_cfg;将example配置成与门将example配置成或门将example配置成异或门VHDL数据类型及运算符VHDL数据类型及运算符VHDL中定义的10种标准数据类型数据类型含义整数整数占4B,范围为-2,147,483,647~2,147,483,647实数浮点数,范围位-1.0E+38~1.0E+38自然数,正整数整数的子集(自然数:大于等于0的整数,正整数:大于0的整数)位逻辑“0”或“1”位串多个位串在一起(也称位矢量)字符ASCII码字符字符串字符数组(也称字符矢量)布尔量逻辑“真”或逻辑“假”时间时间单位,如fs、ps、ns、μs、ms、sec、min、hr等错误等级NOTE,WARNING,ERROR,FAILUREVHDL数据类型及运算符VHDL中定义的10种标准数据类型数据类型用途整数不能按位操作,不能进行逻辑运算常用于表示系统总线宽度实数用于表现电源供电电压或算法研究自然数,正整数一般在定义时需要区间约束位表示一个信号的值,用单引号括起来位串可以看作位的数组,用双引号括起来字符与语句不区分大小写不同,字符区分大小写字符串常用于程序仿真的提示或结果的说明等场合布尔量常用于信号的状态,总显得控制权仲裁情况时间用于定义信号延时等,一般用于仿真错误等级在仿真中,提示程序的状态VHDL数据类型及运算符VHDL中定义的10种标准数据类型约束区间说明:

INTEGERRANGE100DOWNTO1 BIT_VECTOR(3DOWNTO0) REALRANGE2.0TO30.0注意:字符要区分大小写,比如高阻状态是‘Z’,而不是‘z’。VHDL数据类型及运算符用户自定义数据类型:根据电路设计需求,用户自定义合适的数据类型使用格式TYPE数据类型名

IS数据类型定义

OF基本数据类型或

TYPE数据类型名

IS数据类型定义常用的用户自定义类型:枚举类型、子类型、整数类型和实数类型、数据类型和记录类型VHDL数据类型及运算符(1)枚举类型:把类型中的各个元素都罗列出来,如在状态机中的状态一般就采用枚举类型定义Example:TYPEweekIS(sum,mon,tue,wed,thu,tri,sat);(3)整数类型和实数类型:由于范围太大,综合器无法综合,所以给它们定义一个范围Example:SUBTYPEnatural

ISintegerrange0tointeger’high(2)子类型SUBTYPE:由TYPE所定义的原数据类型的子集Example:TYPEpercentISINTEGERRANGE-100TO100VHDL数据类型及运算符(4)数组类型:将相同数据类型的数据集合在一起形成一个新的数据类型。(5)记录类型:将不同数据类型的数据和数据名组合在一起而形成新客体Example:TYPE数组名

ISARRAY(数组范围)OF

数组类型;

TYPE记录类型名

ISRECORD

元素名:元素数据类型;

元素名:

元素数据类型;

…ENDRECORD;ExampleVHDL数据类型及运算符数据类型转换:VHDL中的数据类型可以通过IEEE库中的类型转换函数进行强制性转换。程序包函数名功能STD_LOGIC_1164TO_STDLOGICVECTOR(A)由BIT_VECTOR转换为STD_LOGIC_VECTORTO_BITVECTOR(A)由STD_LOGIC_VECTOR转换为BIT_VECTORTO_STDLOGIC(A)由STD_LOGIC转换STD_LOGICTO_BIT(A)由STD_LOGIC转换BITSTD_LOGIC_ARITHCONV_STD_LOGIC_VECTOR(A,n)(n为位长)由INTEGER,UNSIGNED,SIGNED转换STD_LOGIC_VECTORCONV_INTEGER(A)由UNSIGNED,SIGNED转换为INTEGERSTD_LOGIC_UNSIGNEDCONV_INTEGER(A)由STD_LOGIC_VECTOR转换为INTEGERVHDL数据类型及运算符VHDL中的运算符主要分为算术运算符、逻辑运算符、关系运算符和其他运算符等四类。运算符:与其他计算机高级语言一样要注意各运算符的优先级VHDL数据类型及运算符运算符:VHDL中的运算符主要分为算术运算符、逻辑运算符、关系运算符和其他运算符等四类。与其他计算机高级语言一样要注意各运算符的优先级VHDL的数据对象VHDL的数据对象数据对象:在VHDL语言中,可以赋值的客体称为对象。包括常量、变量和信号。数据对象

常量:定义在设计中不变化的值变量:定义在进程或子程序中的变化量信号:对应硬件内部实实在在的连线VHDL的数据对象常量:指定义在设计描述中不变化的值,是一个全局量。使用格式用途:在实体、结构体、程序包、函数、过程、进程中保持静态数据,以改善程序的可读性,使修改程序变得更容易。ExampleCONSTANTVCC:real:=5.0

--指定电源电压CONSTANT

delay:time:=10ns

--某信号的延迟CONSTANT

fbus:bit_vector:=“0101”--总线上的数据向量CONSTANT常数名:数据类型:=表达式VHDL的数据对象变量:变量是定义进程或子程序(包括函数和过程)中的变化量。VARIABLE

变量名:数据类型:=初始值使用格式用途:用于计算或暂存中间数据,是一个局部量VARIABLEtime::integerRANGE0TO6--进程中代表次数的变量Example注意:变量的赋值是立即生效的。VHDL的数据对象信号:信号对应着硬件内部实实在在的连线使用格式用途:在元件间起着互联作用,或作为一种数据容器,以保留历史值和当前值SIGNAL信号名:数据类型:=表达式“:=”表示对信号的赋初值,一般不产生延时。“<=”表示信号的代入赋值,有延时。注意:VHDL的数据对象使用变量和信号的比较信号是实体间动态交换数据的手段,用信号对象把实体连接在一起形成模块;实体说明,结构体说明都能说明信号。

变量用于进程语句和子程序中中间的数据存储。信号赋值有延迟;而变量赋值没有延迟。

信号除当前值外有许多信息(历史信息,波形值);而变量只有当前值。进程对信号敏感,对变量不敏感。信号可以是多个进程的全局信号;而变量只在定义它的进程中可见。信号是硬件中连线的抽象描述,功能是保存变化的数据值和连接子元件,信号在原件的端口连接元件;变量在硬件中没有对应关系,而是用于硬件特性的高层次建模所需要的计算中。在描述中,信号的赋值不会立即生效,而是要等待一个delta延迟后才会变化,否则该信号的值在delta延迟之前仍是原来的值。VHDL的数据对象使用变量和信号的比较——六分频器libraryieee;useieee.std_logic_1164.all;entityfrequenciesis port(clk:instd_logic; q:outstd_logic);endfrequencies;architecturebehavoffrequenciesisbeginprocess(clk)

variabletime:integerrange0to6;

begin ifrising_edge(clk)then

time:=time+1;

if

time=6

then

q<='1';

time:=0;

else q<='0'; endif; endif; endprocess;endbehav;此例为6分频器,其中time为变量。由于变量赋值是马上生效的,因此从例子中可以看出time置零是在time为6时发生的。VHDL的数据对象使用变量和信号的比较——六分频器此例也为6分频器。其中time为信号。由于信号赋值是具有一定的延时性,因此从例子中比较time和5的大小时,语句time<=time+1还未生效,time的值是上次进程结束时的结果。libraryieee;useieee.std_logic_1164.all;entityfrequenciesis port(clk:instd_logic; q:outstd_logic);endfrequencies;architecturebehavoffrequenciesissignaltime:integerrange0to5;beginprocess(clk) begin ifrising_edge(clk)then

time<=time+1; iftime=5then

q<='1';

time<=0;

else q<='0'; endif; endif; endprocess;endbehav;VHDL的数据对象使用变量和信号的比较——六分频器的仿真time为变量:time为信号可以看出两种方法是等价的。VHDL的数据对象——小结变量常定义在进程与子程序中,用于保存运算的中间临时数

据,或作为循环语句中的循环变量,其赋值立即发生。(:=)常量用于保存静态的数据(:=)。信号有明显的连线或容器的对应关系,具有输出波形,对其

赋值需要延迟时间(<=),在进程间或子程序间具有信息传递功

能。注意对象定义的所在位置及适用区域的对应关系VHDL基本语句VHDL基本语句VHDL语言与高级程序语言最大的不同就是VHDL语言是并发执行的,但是VHDL的基本语句包括顺序语句和并行语句。顺序语句不能直接用在结构体中,需要用process进行“封装”VHDL中,不区分大小写,使用“--”表示注释VHDL基本语句-并行语句并行语句:并行执行,其执行方式与书写顺序无关并行语句常包括以下七种:赋值语句、条件赋值语句、选择信号赋值语句、进程语句、元件例化语句、生成语句、子程序调用语句串行执行结果:a=2,b=3并行执行结果:a=2,b=2a<=b+1;b<=a+1;假设信号原始值为a=1;b=1;对于以下两种书写格式,执行结果如下:b<=a+1;a<=b+1;串行执行结果:a=3,b=2并行执行结果:a=2,b=2VHDL基本语句-并行语句赋值语句:将一个值或一个表达式的运算结果传递给某一数据对象使用格式:赋值目标赋值符号赋值源Example:q<=“0010000”;注意:信号赋值符号为“<=”;变量和常量的赋值符号为“:=”VHDL基本语句-并行语句条件赋值语句:根据执行条件,将一个值或表达式的的运算结果赋给赋值目标使用格式:注意:每一个子句结尾没有任何标点,只有最后一句有分号赋值目标<=表达式WHEN

赋值条件ELSE

表达式WHEN

赋值条件ELSE

表达式;Example:z<=aWHEN

p1=‘1’

ELSE

b

WHEN

p2=‘1’

ELSEc;VHDL基本语句-并行语句选择信号赋值语句:根据选择值的匹配,将一个值或表达式的的运算结果赋给赋值目标使用格式:注意:选择信号赋值语句的每一个子句结尾是逗号,最后一句是分号。WITH选择表达式

SELECT赋值目标<=

表达式WHEN

选择值,

表达式WHEN选择值;Example:WITHinstructionSELECTdata<=data1ANDdata2WHEN“000”,

data1ORdata2WHEN“001”,

‘Z’WHENOTHERS;VHDL基本语句-并行语句进程语句:本身是一个并行语句,内部是由顺序语句组成使用格式:注意:进程启动有两种方式:敏感列表和wait语句[标号]PROCESS

内部变量的说明;BEGIN

顺序语句;ENDPROCESS;VHDL基本语句-并行语句进程语句Example:D触发器:LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYD_FFISPORT(reset,clk,d:INstd_logic;

q:OUTstd_logic);ENDD_FF;ARCHITECTUREbehavOFsampleISBEGINPROCESS(reset,clk,d)BEGINIFreset=‘1’

THENq<=‘0’;ELSIFclk’eventandclk=‘1’THENq<=d;ENDIF;ENDPROCESS;ENDbehav;在此例中,PROCESS由敏感参数表中的reset、clk或d启动。当敏感信号发生变化时,进程执行VHDL基本语句-并行语句进程语句中用wait语句启动在此例中,PROCESS由waiton语句启动,当等待到in1,in2信号发生变化时,进程再次执行。LIBRARYIEEE;USE

IEEE.std_logic_1164.ALL;ENTITY

sample

IS

PORT

(in1,in2:IN

std_logic;

output:OUTstd_logic);END

sample;ARCHITECTURE

behav

OFsample

ISBEGINPROCESS

BEGINoutput<=in1ORin2waitonin1,in2

ENDPROCESS;ENDbehav;VHDL基本语句-并行语句进程语句的特点:进程本身是并行语句,一个结构体可以包含多个进程已列出敏感量的进程不能使用wait语句进程语句的启动只能是信号的变化当一个进程执行结束后,先挂起来,一直到有新的启动信号变化为止VHDL基本语句-并行语句元件例化语句:将预先设计好的元件与当前设计实体中的指定端口相连接使用格式:注意:元件例化语句由两部分组成,前一部分是把一个现成的设计实体定义为一个元件,第二部分则是此元件与当前设计实体中的连接说明。COMPONENT

元件名IS

GENERIC(类属表);

PORT(端口名表);ENDCOMPONENT;例化名:元件名GENERICMAP(…);

PORTMAP([端口名=>])连接端口名,…);VHDL基本语句-并行语句元件例化语句——Example:4输入与门LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;ENTITYand4IS

PORT(ina,inb,inc,ind:INbit;q:OUT

bit);ENDand4;ARCHITECTUREstruOFand4ISCOMPONENTand2IS--定义已经设计好的元件PORT(a,b:INbit;c:OUTbit);ENDCOMPONENT;SIGNALU0_C,U1_C:bit;BEGINU0:and2PORTMAP(ina,inb,U0_C);U1:and2PORTMAP(inc,ind,U1_C);U2:and2PORTMAP(U0_C,U1_C,q)ENDstru;VHDL基本语句-并行语句生成语句:根据某些条件,复制一组完全相同的并行元件或设计单元电路结构使用格式:[标号:]FOR循环变量

IN取值范围GENEATE

说明部分; BEGIN

并行语句; ENDGENERATE[标号];[标号:]IF条件

GENERATE

说明部分; BEGIN

并行语句; ENDGENERATE[标号];VHDL基本语句-并行语句子程序调用语句:调用其它程序,在执行完程序后返回需要的数据使用格式:注意:子程序的调用语句包括了过程调用语句和函数调用语句格式:过程名([形参名=>]实参表达式,…);Example:ARCHITECTUREbehavOFexampleIS

PROCEDUREadder(SIGNALa,b:INstd_logic;SIGNALsum:OUTstd_logic);

…ENDPROCEDURE;BEGIN

adder(a1,b1,sum1);

…ENDbehav;VHDL基本语句-顺序语句顺序语句:顺序语句是指执行(指仿真执行)顺序和书写顺序一致的语句。顺序语句只能出现在进程和子程序中。注意:顺序仅仅指语句执行的顺序性,并不意味着顺序语句对应的硬件逻辑行为也具有相同的顺序性。VHDL基本语句-顺序语句IF语句:IF语句是一种流程控制语句,判断条件有先后次序,而且允许条件涵盖不完整IF

条件

THEN

顺序语句;ENDIF;IF

条件

THEN

顺序语句;

ELSE

顺序语句;

ENDIF;IF条件

THEN

顺序语句;

ELSIF

条件

THEN

顺序语句;

ELSE

顺序语句;

ENDIF;使用格式VHDL基本语句-顺序语句IF语句——Example:注意:IF语句与并行语句中的when…else条件赋值语句具有类似功能,可互换IFen=‘1’

THENC<=B;ENDIF;IFsel=‘1’

THENC<=A;ELSEC<=B;ENDIF;IFreset=‘0’

THENq<=‘0’;ELSIFclk’eventANDclk=‘1’

THENq<=d;ENDIF;IFsel=‘1’

THENC<=A;ELSEC<=B;ENDIF;C<=AWHENsel=‘1’

ELSEB;

VHDL基本语句-顺序语句CASE语句:CASE语句与IF语句类似,也是一种流程控制语句使用格式CASE表达式

ISWHEN选择值=>处理语句;…ENDCASE;注意:CASE语句的选择值必须在表达式的取值范围内CASE语句的所有选择条件具有相同的优先权,不能有相同选择值的条件句出现。未能完全覆盖表达式的取值,则最末的选择值必须用“OTHERS”不想执行任何操作,可用保留字“NULL”描述VHDL基本语句-顺序语句CASE语句——Example:注意:CASE语句与并行语句中的WITH…SELECT语句具有类似的功能,可互换。CASEselISWHEN0=>y<=d0;WHEN1=>y<=d1;WHENOTHERS<=NULL;ENDCASE;WITHselSELECTy<=d0WHEN0,

d1WHEN1,

UNAFFECTEDWHENOTHERS,ENDCASE;VHDL基本语句-顺序语句LOOP语句:重复执行语句若干次或指导满足退出循环的条件为止使用格式[标号]:LOOP

顺序处理语句;ENDLOOP[标号];[标号]:FOR

循环标量IN

离散范围LOOP

顺序处理语句;ENDLOOP[标号];[标号]:WHILE

条件

LOOP

顺序处理语句;ENDLOOP[标号];注意:与高级程序语言不同,里面的循环变量是不用定义说明的。VHDL基本语句-顺序语句EXIT语句和NEXT语句:EXIT语句和NEXT语句都是LOOP语句的内部循环控制语句执行EXIT后,跳到循环体结束处,立即退出循环执行NEXT语句后,跳到循环体开始处,有条件或无条件终止当前循环迭代并开始下一循环VHDL基本语句-顺序语句其它顺序语句:等待语句WAIT:返回语句RETURN返回语句只能用于子程序。执行后无条件结束子程序的执行。空操作语句NULL常用于CASE语句中,利用NULL来排除一些不用的条件。WAIT;WAITON信号表;WAITUNTIL条件表达式;WAITFOR时间表达式;VHDL基本语句-属性描述语句VHDL中具有属性的项目包括:类型、子类型、过程、函数、信号、变量、常量、实体、结构体、配置、程序包、元件和语句标号等,属性就是这些项目的特性。常用综合器支持的属性有:LEFT、RIGHT、HIGH、LOW、RANGE、REVERSE_RANGE、LENGTH、EVENT、STABLE。预定义描述语句格式:属性对象’属性名VHDL基本语句-属性描述语句1.信号类属性:EVENT表示信号发生率动作,STABLE表示无事件发生NOTclock`STABLEANDclock=‘1’;--检测时钟上升沿clock`EVENTANDclock=‘1’;--检测时钟上升沿2.数据区间类属性:对属性项目取值区间进行测试,返回内容是一个区间。如RANGE和REVERSE_RANGESIGNALvector:Instd_logic_vector(0TO7);FORIINvector`RANGELOOP--等同于FORIIN0TO7LOOPFORIINvector`REVERSE_RANGELOOP--等同于FORIIN7DOWNTO0LOOPVHDL基本语句-属性描述语句3.数值类属性:·LEFT、`RIGHT、`HIGH及`LOW这些属性函数主要用于对属性测试目标的数值特性进行测试4.数组属性:·LENGTH这个函数用于对数组宽度或元素个数进行测定5.用户自定义属性:属性与属性值的定义格式如下:ATTRIBUTE属性名:数据类型;ATTRIBUTE属性名OF对象名:对象类型IS值TYPEarray1ARRAY(0TO7)OFbit;SIGNALwth:Integer;……wth<=array1`Length;--wth=8;VHDL测试基准测试基准:一旦设计者描述了一个设计,必须对其进行验证,一检查是否符合设计规范。最常用的方法是在模拟时施加输入激励信号。另外一种方法是用VHDL写一个测试模型发生器和要检查的输出。成为测试基准(TestBench)测试基准的用法将在仿真一节详细介绍VHDL程序的其它构件VHDL程序的其它构件块块(BLOCK)是VHDL中的一种划分机制,它允许设计者将一个模块划分成数个区域注意:BLOCK方式的划分结构只是形式上的,在综合后硬件结构的逻辑层次不会增加,跟元件例化是不同的块标号:BLOCK[(防护表达式)]

接口说明

类属说明 <块说明部分>;BEGIN

<并行语句>END BLOCK[块标号];VHDL程序的其它构件——块块——examplelibraryieee;useieee.std_logic_1164.all;entityexample3isport(d,clk:inbit;q,qb:outbit);endexample3;architecturelatch_busofexample3isbeginb1:block(clk=‘1’)--()是防护表达式为布尔型

beginq<=guardeddafter5ns;--由保留字guarded引导防护语句

qb<=not(d)after7ns;endblockb1;endlatch_bus;VHDL程序的其它构件——块块——example仿真分析:防护条件为真时,防护表达式才起作用,而对非防护表达式不起作用VHDL程序的其它构件函数在VHDL中有多种函数形式,包括用户自定义的函数和库中现成的具有专用功能的预定义函数注意:参数表可以使信号或常数,参数表需要放在关键字CONSTANT或SIGNAL之后如果没有特别说明,默认为常数FUNCTION函数名(参数表)RETURN数据类型;FUNCTION函数名(参数表)RETURN数据类型

IS

[说明部分];BEGIN

顺序语句;END函数名;VHDL程序的其它构件——函数函数——examplelibraryieee;useieee.std_logic_1164.all;entityfuncisport(a:inbit_vector(0to2); m:outbit_vector(0to2));endfunc;architecturedemooffuncisfunctionsam(x,y,z:bit)returnbitisbeginreturn(xandy)ory;endsam;beginprocess(a)begin

m(0)<=sam(a(0),a(1),a(2));m(1)<=sam(a(2),a(0),a(1));m(2)<=sam(a(1),a(2),a(0));

endprocess;enddemo;VHDL程序的其它构件——函数函数——example仿真注意:如果将一个已编制好的函数并入程序包,函数首必须放在程序包的说明部分,而函数体需放在程序包的包体内。如果只在一个结构体中定义并调用函数,则仅需函数体。VHDL程序的其它构件——过程过程过程(PROCEDURE)与函数一样,也有两部分组成,过程首和过程体过程参数表中的参数需要IN、OUT、INOUT定义其工作模式。如果一个过程是在进程中调用,且这个进程已列出敏感参数表,则不能在此过程中使用WAIT语句。PROCEDURE过程名(参数表);PROCEDURE过程名(参数表)IS

[定义语句];BEGIN

[顺序语句];END过程名;VHDL程序的其它构件函数和过程的异同点两者都可用于数值计算、类型转换、或有关设计中的描述;两者里面都必须是顺序语句,并且不能说明信号过程参数表一般要定义参量的流向模式,如果没有指定,默认为IN过程中可以有WAIT语句(但综合器一般不支持),函数中不能过程有多个返回值,函数只有一个返回值;VHDL程序的其它构件程序包程序包(PACKAGE)是一种使已定

温馨提示

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

评论

0/150

提交评论