已阅读5页,还剩194页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程简介,数字系统与VHDL程序设计语言,引例:,VHDL原理:,VHDL语言,非常高速硬件描述语言,也就是一种硬件(数字电路)设计语言.其最大特点是对电路的行为与结构进行高度抽象化规范化,并对设计进行模拟验证与综合优化,使分析和设计高度自动化。,支持VHDL语言的软件平台,Max+PlusII,由软件设计到硬件实现之间的媒介,CPLD/FPGA(可编程器件),在Max+PlusII编写VHDL程序,存盘(文件名为实体名,后缀为.VHD),编译,软件仿真,管脚安排,下载,由软件设计到硬件实现的流程,基本顺序语句(1)Process语句(2)If-Else语句(3)Case-When语句(4)Null语句(5)Waituntil语句(6)变量赋值语句(7)For-Loop语句(8)过程调用语句,基本的并行语句(1)直接赋值语句(2)Process语句(3)When-Else(4)With-Select-When(5)元件例化语句(6)For-Generate,常用数字电路回顾,(1)编码器,输入信号,输出信号,使能端口,注:EN为1时编码器工作,举例,参看EWB辅助电路,(2)译码器,1111,译码器,VHDL与数字电路设计,引言VHDL简介,一、由来VHDL是VeryHighspeedIntegratedCircuitHardwareDescriptionLanguage(非常高速集成电路硬件描述语言)的英文缩写。它是由美国国防部支持的一项研究计划,于1983年创建,目的是以文字化方法描述电子电路与系统。至今VHDL约有40年的发展历史,1987年,VHDL成为IEEE标准,即IEEE1076标准,1993年修改为IEEE1164标准,1996年,IEEE又将电路合成的标准程序与规格加入到VHDL语言中,称为1076.3标准。之后,又有1076.4标准和1076.6标准。,第一章VHDL的程序结构和软件操作,1-1VHDL程序的基本结构,1-2软件操作Max+plus的操作,第一章VHDL的程序结构和软件操作,1-1VHDL程序的基本结构,(1)LIBRARY和PACHAGE的声明部分,作用:库(Library)是用于存放预先编译好的程序包(Package),程序包中定义了数据集合体、逻辑操作和元件等。主要是声明在设计或实体中将用到的常数,数据类型,元件及子程序等。,使用格式:LIBRARY库名;,USE库名.程序包名.All;,(2)ENTITY定义作用:定义本设计的输入/出端口,即定义电路的外观,即I/O接口的类型和数量使用格式:,端口名:端口模式数据类型;);,ENTITY实体名Is,End实体名;,格式:,Port(端口名:端口模式数据类型;,(3)ARCHITECTURE定义作用:定义实体的实现。即电路的具体描述,说明电路执行什么动作或实现功能。,ARCHITECTURE结构体名Of实体名Is,Begin描述语句;End结构体名;,使用格式:,在Max+plus系统中有4个库能支持VHDL语言,它们分别是Std库、IEEE库、Altera库和Lpm库。Std库和IEEE库提供基本的逻辑运算函数及数据类型转换函数等。IEEE库中的程序包std_logic_1164定义了std_logic和std_logic_vector等数据类型。,举例:,设计一个与门电路,逻辑符号,真值表,LibraryIEEE;Usestd.standard.all;Entityand2isPort(A:inbit;B:inbit;Y:outbit);Endand2;,-首先定义输入输出端口名字,模式(Mode),信号类型,-注意最后语句的分号在括号外,实体定义:,ArchitectureNaofand2isBeginY=0whena=0andB=0else0whenA=1andB=0else0whenA=0andB=1else1;EndNa,结构体定义:,端口模式有以下几种类型:IN;OUT;INOUT;BUFFER。,ArchitectureNbofand2isBeginc=1whena=1andb=1else0;EndNb;,以上结构体表达何种电路?,一个实体可以有几个结构体,即结构体的定义可以有不同的形式,结论:,1-2软件操作Max+plus的操作,1-2-1建立和编写一个VHDL语言的工程文件,1-2-2VHDL程序的编译,1-2-3VHDL语言程序的仿真,1-2-4芯片的时序分析,1-2-5安排芯片脚位,1-2软件操作Max+plus的操作,1.Max+plus开发工具是美国Altera公司自行设计的一种软件工具,其全称为MultipleArrayMatrixandProgrammableLogicUserSystem。它具有原理图输入和文本输入(采用硬件描述语言)两种输入手段,利用该工具所配备的编辑、编译、仿真、综合、芯片编程等功能,将设计电路图或电路描述程序变成基本的逻辑单元写入到可编程的芯片中(如FPGA芯片),作成ASIC芯片。它是EDA设计中不可缺少的一种工具。,2.软件安装,我们通过范例介绍:利用Max+plus系统,(1)如何编写VHDL程序(使用TextEditor);,(2)如何编译VHDL程序(使用Compiler);,(3)如何仿真验证VHDL程序(使用WaveformEditor,Simulator);,(4)如何进行芯片的时序分析(使用TimingAnalyzer);,(5)如何安排芯片脚位(使用FloorplanEditor);,(6)如何下载程序至芯片(使用Programmer)。,1-2-1建立和编写一个VHDL语言的工程文件,首先启动Max+plus系统,启动后系统进入主菜单画面,在主菜单上有5个选项,分别是:Max+plus、File、Assign、Options和Help。,(1)打开文本编辑器;用鼠标点击File选项,点击子菜单中的New选项,接着屏幕会出现New的对话框。在对话框内有4种编辑方式:图形编辑、符号编辑、文本编辑和波形编辑。VHDL文件属于文本,那么应该选择文本编辑方式,点击OK按钮,屏幕上将出现一个无名的编辑窗口,则系统进入文本编辑状态。,(2)在编辑窗口中进行编辑输入,输入相应的描述语句。,(3)存盘。(a我们编辑的VHDL文件扩展名为vhd;b保存的文件名必须和所定义的实体名相同。c文件存盘的目录不应是根目录或桌面,建议存放在Max2work或Maxplus2目录,或其子目录。),以与门的设计为例讲述具体过程,1-2-2VHDL程序的编译,(1)若文件没有打开,需首先打开要编译的VHDL文件;,(2)将目前的文件设置成工程文件;点击File选项,光标移到子菜单的Project项停留几秒钟,屏幕上会出现下一级菜单,点击SetProjecttoCurrentFile,(3)打开编译器;点击主菜单MAX+plus/Compiler选项,屏幕上就出现编译对话框。,(4)开始编译;完成了上述编译前的准备及必要的设置工作,点击编译对话框中的Start按钮,编译即开始。,以与门的设计为例讲述具体过程,1-2-3VHDL语言程序的仿真,仿真是为了验证我们所编写的VHDL程序的功能是否正确。,(1)首先生成仿真波形文件,(a)打开波形编辑器;点击主菜单的MAX+plus/WaveformEditor选项,就可在屏幕上显示波形编辑器窗口。在未输入信号名以前,整个窗口是空白的。,(b)确定仿真持续时间(File/EndTime)。,(c)选则输入输出端口名;,(d)编辑输入信号波形;,(e)信号波形编辑完成后,需存盘为仿真使用,文件名采取默认方式即可。,(2)打开仿真器;点击主菜单MAX+plusSimulator项,此时弹出Simulator对话框。点击对话框的Start按钮,仿真即开始。在仿真结束后打开仿真波形文件(点击右下角的OpenSCF按钮)即可以显示仿真结果。,(以与门的设计为例讲述具体过程),1-2-4芯片的时序分析,仿真结果从波形上来看,很难给出定量的信号延迟关系,这一点时序分析却能直观地用表来进行显示。,(1)选择要下载的器件型号;,(2)需要再编译一次。,(点击主菜单的Assign/Device项得到Device对话框),(3)打开时序仿真器;,(点击TimingAnalyzer选项),(4)最后点击Start按钮后,时序分析器开始启动。,(以与门的设计为例讲述具体过程),1-2-5安排芯片脚位,为了将程序下载到芯片,需安排芯片脚位。,(1)打开芯片脚位设置器;,(MAX+plus/FloorplanEditor),(2)将实体定义的端口名字和下载芯片的管脚进行具体对应;,(3)最后再进行一次编译。,教学演示片,第二章VHDL语言要素,2.1VHDL语言规则,数字型文字、字符串文字、标识符、下标名、段名,2-2数据类型,数据类型分类:逻辑信号类型和数值信号类型。,2-2-1逻辑数据类型,(1)布尔代数(Boolean)型,定义位置:在std库的standard程序包中进行定义。,信号形式:FALSE,TRUE,(2)位(Bit),定义位置:在std库的standard程序包中进行定义。,信号形式:0,1,(低电位,高电位),编码器:,输入信号,输出信号,(3)位数组类型(Bit_Vector),定义位置:在std库的standard程序包中进行定义。,例:,SignalA:bit_vector(0to7);,SignalB:bit_vector(2downto0);,输入信号,输出信号,(4)标准逻辑型(Std_Logic),定义位置:在IEEE库的std_logic_1164程序包中进行定义,可以看出,这个“标准逻辑”信号定义,比“位即bit”信号对于数字逻辑电路的逻辑特性描述更完整、更真实。所以在VHDL的程序里,对于逻辑信号的定义,通常都是采用这个“标准逻辑”信号形式。,使用这类数据信号,必须包含下面两条声明语句:,LibraryIEEE;UseIEEE.std_logic_1164.all;,(5)标准逻辑数组类型(Std_Logic_vector),定义位置:在ieee库的std_logic_1164程序包中进行定义。,Bit_Vector与Std_Logic_vector的区别在于数组的每一位前者为BIT型(0,1)后者为Std_Logic型,2-2-2数值数据类型,(1)整数(Integer)定义位置:在std库的standard程序包中进行定义。即数值范围为-231231。,(2)无符号(Unsigned)和有符号(Signed)类型,定义位置:有符号(Signed)和无符号(Unsigned)逻辑信号定义在库IEEE的程序包std_logic_arith中。,有符号类型数据代表有符号数值,即可以是正数,0,负数;编译器将有符号数类型作为一个补码的二进制数,最左边的位为符号位。,无符号类型数据代表无符号数值,即代表0或正数;最左边的位为最高位。如:Unsigned(“0110”)代表;,+6,+10,Unsigned(“1010”)代表,如:signed(“0110”)代表+6;signed(“1010”)代表,-2。,libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;entitydataisport(a,b:inunsigned(3downto0);-相应改为a,b:insigned(3downto0);c:outstd_logic);enddata;architecturem1ofdataisbeginc=1whenabelse0;endm1;,useieee.std_logic_1164.all;?useieee.std_logic_arith.all;?列举a、b具体值?,当定义成无符号数据类型时,若a=”1000”,b=0001,即a=8,b=1则结果,另外:还有其他positive,natural,real数据类型以及用户自定义数据类型等。这些数据类型各有特点,以后用到再行讲解,c=1。,c=0;,当定义成有符号数据类型时,若a=”1000”,b=0001,a=-8,b=1,则结果,2.3VHDL数据对象,数据对象(DataObjects):,凡是可以被赋予一个值的对象称为数据对象,,数据对象用于传递信号。,例:,数据对象名,数据对象类型,数据对象值的类型,2-3-1信号,信号数据对象,代表电路内部传输线路线路,其在元件之间起互连作用,信号数据对象的定义格式为:Signal信号名:数据类型:=设定值;,如:SignalA:Std_logic_vector(3Downto0):=“0000”;,注意:由于MaxplusII系统往往会忽略信号对象定义时所赋初始值,建议在结构体中用赋值语句完成对信号的赋值。,信号赋值语句的语法格式为:目标信号名=表达式(设定值);,A=“1010”,2-3-2变量,它用于对中间数据的临时存储,并不一定代表电路的某一组件。,变量数据对象的定义格式为:Variable变量名:数据类型:=设定值;,如:Variablea:integer:=0;,变量赋值语句的语法格式为:目标变量名:=表达式(设定值);,注意:由于MAXPLUSII系统往往会忽略变量对象定义时所赋初始值,建议在结构体中用赋值语句完成对变量的赋值。,如:a:=b+c;,常数的定义格式为:Constant常数名:数据类型:=表达式;,如:ConstantD1:Integer:=3;ConstantD2:Std_Logic_Vector(D1Downto0):=”0000”;,注意:常数数据对象定义的同时进行赋值。赋值符号为“:=”,2-3-3常数,2-3-4信号、变量、常数对比,一、定义,SignalA:std_logic;,VariableA:std_logic_vector(7downto0);,ConstantA:integer:=6;,二、赋值及赋值时刻,A=“1010”;(延时),A:=“1010”;(立刻),三、定义区域,信号:实体、结构体、程序包,变量:进程、子程序,常数:实体、结构体、程序包、块、进程、子程序,四、适用范围,信号:实体、结构体、程序包,变量:定义了变量的进程、子程序的顺序语句中,常数:视其定义的位置而定,若常数定义在实体中,适用范围是实体所对应的有结构体。若常数定义在结构体中,适用范围就是本结构体。,执行结果为:,x=cxorb,y=cxorb,执行结果为:,x=cxora,y=cxorb,练习:,1定义信号A1,A2,A3,A4,A5,A6,A7,A8,其中每一位信号均为标准逻辑型,2.定义信号B,其数据类型为标准逻辑型。,3.定义信号C,数据类型为整数型。,4.给A、B赋值,其中A的值为11001101;B的值为0。,LibraryIEEE,Useieee.std_logic_1164.all,SignalA:std_logic_vector(1to8),SignalB:std_logic,SignalC:integer,LibraryStd,Usestd.standard.all,A=“11001101”,B=0,2.4VHDL操作符,VHDL操作符:逻辑、算术、符号、关系操作符。,2.4.1逻辑运算符,一、分类及功能,And(与),Or(或),Not(非),Nand(与非),,Nor(或非),Xor(异或),Xnor(同或)。,二.用法,1.操作数的数据类型必须符合操作符的要求,能进行逻辑运算的数据类型:bit、bit_vector、boolean,std_logic、std_logic_vector,例,Signala,b,y:std_logic;,Signalc,d,z:integer;,y=aandb;,z=candd;,2.表达式中有多个运算符时一般要加括号,表达式中有多个运算符时一般要加括号,但and、or、xnor除外,例,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;,3.运算符两侧的操作数要对称,d=(enorf)norg;,LibraryIEEE,USEIEEE.STD_LOGIC_1164.ALL;,ENTITYlitiIS;,PORT(a,b,c,d:INSTD_LOGIC;,e:outSTD_LOGIC);,ENDliti;,ACHITECTUREAA1OFlitiIS,BEGIN,e=(aandb)ortmp;,Signaltmp:std_logic;,tmp=cxord;,ENDAA1;,2.4.2关系运算符,=(等于),/=(不等于),(大于),,=(大于等于)。,注,1.等于和不等于的操作对象可以是任何数据类型构成的操作数。,2.其它关系运算符对数据类型有一定的限制。(整数,枚举型),3.=、/=在实现硬件电路时比其它的关系运算符对芯片的利用率要高,ENTITYmy1is,PORT(a,b:inbit_vector(0to3),m:outboolean);,ENDmy1;,ARCHITECTUREa1ofmy1,BEGIN,m=(a=b);,ENDa1;,ENTITYmy1is,PORT(a,b:inbit_vector(0to3),m:outboolean);,ARCHITECTUREa1ofmy1,BEGIN,m=b);,ENDa1;,以上两程序最终所实现的硬件电路见课本P78,ENDmy1;,2.4.3算术运算符,一、分类及功能,求和运算符、求积运算符、符号运算符、混合运算符、移位运算符,二.运用,1.求和运算符,VHDL中的求和运算符包括加减运算和并置运算,操作数的数据类型为整型。,例1:,Variablea,b,c,d,e,f:integerrange0to255;a:=b+c;d:=ef;,例2:,Signala:std_logic_vector(4to0);,Signalb:std_logic_vector(2to0);,Signalc:std_logic_vector(1to0);,a=bc,2.移位运算符,移位运算所对应的数据类型为一维数组,其中的元素维bit、boolean,例:,Variablea1:std_logic_vector(3to0);,a1:=“1011”;,a1SLL1;,a1=0110,a1SLL2;,a1=1100,a1ROL1;,a1=0111,3.其它,略,二、应用现在VHDL已成功地应用于ASIC自动设计的模拟验证和综合优化等方面。VHDL是以文字的方式设计电路,在应用上,目前VHDL语言还仅限于数字电路的开发和设计。,三、VHDL和电路图设计方式比较VHDL与电路图设计电路的方式不同,主要有如下几方面的优越性:(1)易于修改;(2)设计能力更强;(3)VHDL语言很方便:独立于器件设计;相同的程序代码可以用于不同厂家生产的器件。,VHDL操作符复习回顾,一、逻辑运算符,And(与),Or(或),Not(非),Nand(与非),,Nor(或非),Xor(异或),Xnor(同或)。,能进行逻辑运算的数据类型:bit、bit_vector、boolean,std_logic、std_logic_vector,二、关系运算符,=(等于),/=(不等于),(大于),,=(大于等于)。,1.等于和不等于的操作对象可以是任何数据类型构成的操作数。,2.其它关系运算符对数据类型有一定的限制。(整数,枚举型),三、算术运算符,求和运算符、求积运算符、符号运算符、混合运算符、移位运算符,VHDL中的求和运算符包括加减运算和并置运算,操作数的数据类型为整型。,Signala:std_logic_vector(4downto0);,Signalb:std_logic_vector(2downto0);,Signalc:std_logic_vector(1downto0);,bc,a=bc,VariableA:std_logic_vector(6downto0);,A:=“10110001”;,ASLL1;,AROL1;,第三章VHDL顺序语句,一、顺序语句概念,顺序语句的特点是,每一条顺序语句的执行顺序是与它们的书写顺序基本一致的。顺序语句只能出现在进程(Process)和子程序中,子程序包括函数(Function)和过程(Procedure)。,二、种类,进程语句赋值语句流程控制语句等待语句,子程序调用语句返回语句空操作语句,3.1进程语句(Process语句),0,0,0,0,输入信号发生变化时,电路启动进行计算,进程语句是由顺序语句构成的,通过信号与结构体其余部分进行信息交流,在进程中有一个敏感信号列表,表中列出的任何信号的改变都将启动进程,执行进程内相应的顺序语句。进程语句是将并行语句和顺序语句区分开来的标志之一。,语法格式:进程标号:Process(敏感信号列表)Variabledeclarations-变量声明Begin顺序语句;EndProcessProcesslabel;,Process(sel,x1,x2)Beginf=x1;Ifsel=1thenf=x2;endif;Endprocess;,Process(sel,x1,x2)BeginIfsel=1thenf=x2;endif;f=x1;Endprocess;,在第二个进程中,无论什么情况,f=x1,而在第一个进程中,只有信号sel/=1时,f=x1。因此,语句的排列顺序很重要,会影响信号的输出结果。,区别,3.2赋值语句,赋值语句包括变量赋值语句和信号赋值语句,前者的赋值是立刻发生的,后者的赋值发生在一个进程结束的时刻,并延时进行。,变量赋值目标:=赋值源,信号赋值目标=赋值源,在同一进程中,同一信号赋值目标有多个赋值源时,信号赋值目标获得的是最后一个赋值源的值,其前面相同的赋值目标不做任何变化。,注:,3.2.1信号和变量赋值,Signals1,s2:std_logic;Signalsec:std_logic_vector(0to7);Process(s1,s2)Variablev1,v2:std_logic;Beginv1:=1;v2:=1;s1=1;s2=1;sec(0)=v1;sec(1)=v2;,sec(2)=s1;sec(3)=s2;v1:=0;v2:=0;s2=0;sec(4)=v1;sec(5)=v2;sec(6)=s1;sec(7)=s2;ENDPROCESS,“01000111”,sec=,3.2.2信号和变量赋值举例,1.标识符赋值目标,Variablea,b:std_logic;Signalc:std_logic_vector(1to4);a:=1;b:=0;c=“1100”;c(3)=1;,注:,一位值用单引号,多位值用双引号,2.段赋值,Signalc:std_logic_vector(1to4);c(1to2)=10;c(1to4)=1010;,3.块赋值,Signala,b,c,d:std_logic;Signals:std_logic_vector(1to4);s4,g(1)=2,g(2)=1);,名称关联,结果:h的值为,1010,3.3流程控制语句,3.3.1IF语句,语法格式:IfexpressionThenstatement;ElsifexpressionThenstatement;ElsifThenstatement;elsestatement;Endif;,根据条件进行相应赋值操作,例1:,Process(A)BeginIfA=”00”thenf=D0;elsifA=”01”thenf=D1;elsifA=”10”thenf=D2;elsefb)THENoutb)THENout=1;ELSEout=0;ENDIF;,三、第三种IF语句,语法格式:If条件句Then顺序语句;Elsif条件句Then顺序语句;Elsif条件语句Then顺序语句;else顺序语句;Endif;,语句格式,例题1:,Signala,b,c,p1,p2,z:bit;IF(p1=1)THENz=a;ELSIF(p2=0)THENz=b;ELSEz=c;ENDIF;,?,选择方式,c,b,a,a,画线部分意思:ELSIF(p1=0andp2=0),注,例题2:8线3线优先编码器,LIBRARYIEEE;,USEIEEE.STD_LOGIC_1164.ALL;,ENTITYcoderIS,PORT(I:INSTD_LOGIC_VECTOR(0TO7),Y:OUTSTD_LOGIC_VECTOR(1TO3);,ENDcoder;,实体设计,功能:设计元件外观,ARCHITECTUREa1orcoderIS,Begin,IF(I(7)=1)THENY=“111”;,ELSIF(I(6)=1)THENY=“110”;,ELSIF(I(5)=1)THENY=“101”;,ELSIF(I(4)=1)THENY=“100”;,ELSIF(I(3)=1)THENY=“011”;,ELSIF(I(2)=1)THENY=“010”;,ELSIF(I(1)=1)THENY=“001”;,ELSEY=“000”;,ENDa1;,结构体设计,功能:描述输入和输出之间的逻辑关系,ENDIF;,练习题:设计一个3线8线译码器,元件外观,输入输出逻辑关系,LIBRARYIEEE;,USEIEEE.STD_LOGIC_1164.ALL;,ENTITYcoderIS,PORT(A:INSTD_LOGIC_VECTOR(1TO3),Y:OUTSTD_LOGIC_VECTOR(7DOWNTO0);,ENDcoder;,实体设计,功能:设计元件外观,ARCHITECTUREa1orcoderIS,Begin,IFA=“000”THENY=“00000001”;,ELSIFA=“001”THENY=“00000010”;,ELSIFA=“010”THENY=“00000100”;,ELSIFA=“011”THENY=“00001000”;,ELSIFA=“100”THENY=“00010000”;,ELSIFA=“101”THENY=“00100000”;,ELSIFA=“110”THENY顺序语句Endcase;,CASE语句根据满足的条件直接选择多项顺序语句的一项执行=不是信号赋值符号,其意思等价于“THEN”,注,例题1:用CASE语句设计四选一数据选择器,LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALLENTITYmux41ISPORT(s1,s2:instd_logic;a,b,c,d:instd_logic;z:outstd_logic);ENDENTITYmux41;,ARCHITECTUREactivOFmux41ISSIGNALs:std_logic_vector(1downto0);BEGINSzzzzzz;ELSIFs=“10”thenc=z;ELSEd=z;ENDIF;ENDARCHITECTUREactiv;,ARCHITECTUREactivOFmux41ISSIGNALs:std_logic_vector(1downto0);BEGINSzzzzzZ1Z2Z3Z4YYYYYYYYYY10;ENDLOOPL2;,二、FOR_LOOP语句,LOOP标号:FOR循环变量IN循环次数范围LOOP顺序语句;ENDLOOPLOOP标号;,例:试设计一个八位奇偶校验器,注:0XORa=a,LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYJIOUISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDJIOU;ARCHITECTUREOPTOFJIOUISSIGNALtmp:STD_LOGIC;BEGINPROCESS(a)BEGINtmp=0;FORnIN0TO7LOOPtmp=tmpXORa(n);ENDLOOP;y=tmp;ENDPROCESS;ENDopt;,三.WHILE_LOOP语句,标号:WHILE循环控制变量LOOP顺序语句ENDLOOP标号;,例1:,Shift1:PROCESS(inputx)VARIABLEn:POSITIVE:=1BEGINL1:WHILEn8LOOPoutputx(n)=input(n+8);n:=n+1;ENDLOOPL1;ENDPROCESSShift1;,3.3.4NEXT与EXIT语句,NEXT;NEXTLOOP标号;NEXTLOOP标号WHEN条件表达式;,EXIT;EXITLOOP标号;EXITLOOP标号WHEN条件表达式;,循环语句转向控制,LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYBIJIAOISPORT(a:INSTD_LOGIC_VECTOR(0TO7);b:INSTD_LOGIC_VECTOR(0TO7);y:OUTSTD_LOGIC);ENDBIJIAO;ARCHITECTUREJIEGOUOFBIJIAOISSignaltmp:STD_LOGIC_VECTOR(0TO7);Signaltmq:std_logic;BEGINPROCESS(a,b)BEGINFORnIN0TO7LOOPtmp(n)=a(n)xnorb(n);Nextwhen(tmp(n)=1);tmq=1;ENDLOOP;y=tmq;ENDPROCESS;ENDJIEGOU;,NEXT语句,LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYBIJIAOISPORT(a:INSTD_LOGIC_VECTOR(0TO7);b:INSTD_LOGIC_VECTOR(0TO7);y:OUTSTD_LOGIC);ENDBIJIAO;ARCHITECTUREJIEGOUOFBIJIAOISSignaltmp:STD_LOGIC_VECTOR(0TO7);BEGINPROCESS(a,b)BEGINFORnIN0TO7LOOPtmp(n)=a(n)xnorb(n);EXITwhen(tmp(n)=0);ENDLOOP;y=1;ENDPROCESS;ENDJIEGOU;,EXIT语句,3.4子程序及其调用,子程序概述,函数(Function),过程(Procedure),子程序调用,3.5返回语句(Return),3.6空操作语句(NULL),3.7其它语句,3.4.1子程序概述,子程序是一个VHDL程序模块,由顺序语句构成,用于完成重复性的计算工作,子程序有两种类型,即过程(Procedure)和函数(Function)。子程序的使用方法只能通过子程序调用及与子程序的界面端口进行通信。每调用一次子程序都意味着增加了一个硬件电路模块,因此,在实际使用时,要密切关注和严格控制子程序的调用次数。,3.4.2函数(Function),函数首,Function函数名(参数表)Return数据类型,Function函数名(参数表)Return数据类型IS说明部分Begin顺序语句ENDFunction函数名;,函数体,注:参数表中参量可以是变量、信号、常数(默认)无需定义参数的方向(默认为“输入”),例1,EntityfuncIsPort(a:inbit_vector(0to2);m:outbit_vector(0to2);EndEntityfunc;ArchitecturedemoOffuncIsFunctionsam(x,y,z:bit)ReturnbitisBeginReturn(xandy)orzEndFunctionsam;BeginProcess(a)Beginm(0)=sam(a(0),a(1),a(2);m(1)Return“1100”;WhenOthersReturn“1111”;EndCase;EndFunctiontrans;,3.4.3过程(Procedure),过程首,Procedure过程名(参数表),Procedure过程名(参数表)IS说明部分Begin顺序语句ENDProcedure过程名;,过程体,注:参数表中参量可以时变量、信号、常数(默认)参数的方向可以是IN、OUT、INOUT,例,Procedureprg1(variablevalue:inoutbit_vector(0to3)BeginCasevalueISWhen“0000”Return“1100”;When“0101”Return“0000”;WhenOthersReturn“1111”;EndCase;EndProcedurePrg1;,3.4.4子程序调用,例题,ENTITYlitiISPORT(a,b,c,d:inbit_vector(0to3);ra,rb,rc,rd:ourbit_vector(0to3);ENDliti;ARCHITECTUREmuxesOFlitiisProceduresort(x,y:inoutbit_vector(0to3)isvariabletmp:bit_vector(0to3);BeginIfxythentmp:=x;x:=y;y:=tmp;ENDIF;ENDSORT;,BeginProcess(a,b,c,d)Beginsort(a,c);sort(b,d);sort(a,b);sort(c,d);sort(b,c);ENDprocess;ra=a;rb=b;rc=c;rd=d;ENDmuxes;,3.4.5函数与过程对比,过程可以返回多值,函数只能返回一个值。过程的参数为IN、OUT、INOUT函数的参数为IN(默认)。函数和过程均能产生新的电路模块。,3.5返回语句(Return),格式:,Return;Return表达式;,只能用于Function,Procedurers(signals,r:instd_logic;signalq,nq:inoutstd_logic)isBeginIf(s=1andr=1)thenReturnElseqtmp:=regaorregb;WHEN“110”=tmp:=NOTrega;WHENOTHERS=NULL;ENDCASE;,注:NULL语句有时会造成不必要的寄存器,3.7其它语句,clockEVENTandclock=1;,功能:,clockEVENT就是对信号在当前的一个极小的时间段内电平是否发生变化进行检测。,例1:,Process(clock)If(clockEVENTandclock=1)thenQ=DATAEndIf;EndProcess;,例2:,Process(clock)If(clockEVENTandclock=0)thenQ=DATAEndIf;EndProcess;,例3:,Process(clock)Ifrising_edge(clock)thenQ=DATAEndIf;EndProcess;,与例1等价,第四章VHDL并行语句,4.1并行语句概述,4.2并行信号赋值语句,4.3进程语句(process),4.1并行语句概述,并行语句一般处于进程(PROCESS)的外部。所有并行语句都是并行执行的,即与它们出现的先后次序无关。,一、并行语句特点,a.所有语句的执行是并行的;b.每条语句的执行和其所在的位置无关;c.并行语句的输出仅仅依赖于输入,没有其它的限制条件,二、基本的并行语句,(1)直接赋值语句:=赋值运算符,(2)进程(Process)语句,(3)条件式信号设置语句:When-Else,(4)选择式信号设置语句:With-Select-When,(5)块(Block)语句,(6)元件(Component)例化语句,(7)For-Generate语句,4.2并行信号赋值语句,简单信号赋值语句,条件信号赋值语句,选择信号赋值语句,一、直接赋值语句:=赋值运算符,作用:直接对目标对象进行赋值操作。,语法格式:Signal_name=expression;,如:SignalA,B:std_logic_vector(7downto0);,A=”0000000”;B=”1000000”;,我们也可以这样赋值:,A0);,信号A的每一位的值都为0。,B0);,信号B的第一位为1,其它位的值为0。,下面举一个应用示例,如下面电路:,用VHDL对电路的描述如下:,libraryieee;,useieee.std_logic_1164.all;,Entityexam1is,port(a,b:instd_logic;,c,d:outstd_logic);,Endexam1;,Architecturem1ofexam1is,Begin,c=aandb;,d=aorb;,ENDm1;,并行语句的输出仅仅依赖于输入,没有其它的限制条件。,每条语句的执行和其所在的位置无关。,二、条件式信号设置语句:When-Else,语法格式为:,赋值目标=表达式1When赋值条件Else表达式2When赋值条件Else表达式N;,在结构体中的条件赋值语句的功能与在进程中的IF语句相同,在执行条件信号语句时,每一赋值条件是按书写的先后关系测定的。,我们曾举过一个二输入的与门电路的例子:,Libraryieee;Useieee.std_logic_1164.all;Entityand2isPort(d1,d2:instd_logic;op:outstd_logic);Endand2;Architecturem1ofand2isBeginop=1when(d1=1andd2=1)else0;Endm1;,Libraryieee;Useieee.std_logic_1164.all;EntitymuxisPort(a,b,c:inbit;p1,p2:inbitz:outbit);Endand2;Architecturem1ofmuxisBeginz=awhenp1=1elsebwhenp2=1elsec;Endm1;,允许有重叠,三、选择式信号设置语句:With-Select-When,WithexpressionSelect赋值目标=表达式Whenconstant_value1表达式Whenconstant_value2表达式WhenOthers;,选择式信号设置语句本身不能在进程中应用其功能与进程中的CASE语句相同。,例:不允许有重叠现象;必须含盖所有条件,Architecturem2ofand2isSignaltmp:std_logic_vector(1downto0);Begintmp=d1,When-else语句和With-select-When语句的差别,两个语句的关键不同是:对于条件的要求程度不同,前者要求较松,后者要求严格。,aWith-select-When语句中When后的constant_value必须是互不相同的;,b而When-else语句中When后的logic_expression则不需要这样的严格条件,因为其When后的logic_expression的优先权次序为由先到后排列。,4.3进程语句(process),Process语句的格式为:,进程标号:Process(敏感信号列表)变量声明,Begin顺序语句;EndProcess进程标号;,敏感表(Sensitivitylist)包括进程的一些信号,当敏感表中的某个信号变化时进程才被激活,进程内的顺序语句被执行。当进程结束时,进程内的输出信号值被更新,进程进入等待(睡眠)状态,直到敏感表中的某一信号发生变化,进程被再次激活。,下面举一个应用示例,如下面电路:,用用不同VHDL语句对电路的描述如下:,libraryieee;,useieee.std_logic_1164.all;,Entityexam1is,Port(a,b:instd_logic;,c,d:outstd_logic);,Endexam1;,Architecturem1ofexam1is,Begin,c=aandb;,d=aorb;,Endm1;,architecturem2ofexam1isbeginprocess
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东疫情停课退费通知书
- 广元禁止吸烟通知书
- 广州康乐村放假通知书
- 广州车辆大减价通知书
- 广深驾校整改通知书
- 店头镇疫情消息通知书
- 廊坊客车违规处理通知书
- 延期农资报价通知书
- 建安区返校通知书
- 建筑工程复工通知书
- 2025中国化工新材料市场发展现状及技术演进与投资前景分析报告
- 2025年大学《应用气象学》专业题库- 气象健康风险评估与社会管理
- 2025年湖南机电职业技术学院单招职业技能考试题库及参考答案详解
- 酒店浴室安全管理制度
- 2026年江西电力职业技术学院单招职业技能考试必刷测试卷及答案1套
- 防诈骗宣传活动方案
- 养猪场除臭方案
- 湖北省黄冈市黄梅县育才高级中学2025-2026学年高一上学期10月期中考试政治试题(解析版)
- 供电营业规则培训
- 新版银行工资代发业务操作规范
- 中国远洋海运集团航运先进技术研究院招聘笔试真题2024
评论
0/150
提交评论