




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
EDA技术实用教程第5章VHDL设计进阶5VHDL设计进阶第1页数据对象一定设计实例及相关语法次序语句和并行语句归纳半整数与奇数分频电路设计主要任务:给出一定电路实例,探讨电路实例实际功效和VHDL语言实现特点。经过详细设计例子,深入熟悉VHDL设计流程。掌握信号含义,了解一些特定数字信号功效单元VHDL实现方案。主要内容5VHDL设计进阶第2页5.1数据对象
在VHDL中,数据对象有三类,变量(variable)、常量(constant)和信号(signal)。数据对象类似于一个容器,用于接收不一样数据类型赋值。注意:信号表现比较特殊,含有更多硬件特征,是VHDL中最有特色语言要素之一,在学习中需要进行熟练把握。5VHDL设计进阶第3页5.1数据对象
5.1.1常数
常数定义普通表述以下:CONSTANT常数名:数据类型:=表示式
;
CONSTANTFBT:STD_LOGIC_VECTOR:="010110";--标准位矢类型CONSTANTWIDTH:INTEGER:=4;--整数类型用途:常数设置主要是为了使程序更轻易阅读和修改。如将逻辑位宽度定义为一个常量,只要修改这个常量就能够很轻易改变宽度。SIGNALDATA:STD_LOGIC_VECTOR(WIDTH-1DOWNTO0)5VHDL设计进阶第4页5.1.1常数
VHDL要求所定义常量数据类型必须与表示式数据类型一致。常数可定义于:实体、结构体、程序包、块、进程、子程序。常数可视性规则:常数使用范围取决于它被定义位置。假如在程序包中被定义,常数含有最大全局化特征,能够用在调用此程序包全部设计实体中;假如定义在设计实体中,有效范围为此设计实体全部结构体中;假如在设计实体中某一结构体中,则只能用于此结构体中。5VHDL设计进阶第5页5.1数据对象
5.1.2变量
定义变量普通表述以下:
VARIABLE变量名:数据类型:=初始值;
VARIABLEa:INTEGERRANGE0TO15;--变量a定义为常数,取值范围是0到15VARIABLEd:STD_LOGIC:=‘1’;--变量d定义为标准逻辑位数据类型,初始值是1
用途:只能在进程和子程序中使用。变量不能将信息带出对它作出定义结构。特点:变量赋值是一个理想化数据传输,是马上发生不存在任何延时行为。主要作用:在进程中作为暂时数据存放单元。5VHDL设计进阶第6页变量赋值普通表述以下:目标变量名:=表示式
5.1.2变量
变量是局部量,适用范围仅限于定义了变量进程或子程序次序语句中。同一变量值将随变量赋值语句前后次序运算而改变。变量赋值语句执行与软件描述语言中完全次序执行赋值操作有相同处。变量赋值符号为:=,可定义初始值,但初始值不是必须。赋值需要相同数据类型。VARIABLEX,Y:INTEGERRANGE15DOWNTO0;VARIABLEA,B:STD_LOGIC_VECTOR(7DOWNTO0);X:=11;Y:=2+X;A:=B;A(0TO5):=B(2TO7);5VHDL设计进阶第7页5.1.3信号
在第3章中已经介绍过了,在此我们深入深入了解信号硬件特征。信号能够作为设计实体中并行语句模块间信息交流通道。信号作为一个数值容器,不但能够容纳当前值,也能够保持历史值。这一属性与触发器记忆功效有很好对应关系。5VHDL设计进阶第8页5.1.3信号
SIGNAL信号名:数据类型:=初始值;SIGNALA:STD_LOGIC:=‘0’;信号与实体端口(PORT)概念是一致,只是信号没有方向说明。对于端口,区分只是输出端口不能读入数据,输入端口不能被赋值;信号可看成实体内部端口;实体端口只是一个隐形信号,在实体中对端口定义实质上是作了隐式信号定义,并要求了数据流向;信号本身定义是显式定义。在实体中定义端口都能够看作是一个信号,在结构体中直接加以使用。5VHDL设计进阶第9页SIGNAL信号名:数据类型:=初始值;SIGNALA:STD_LOGIC:=‘0’;适用范围:信号使用和定义范围是实体、结构体和程序包。注意:在进程和子程序次序语句中不允许定义信号,在进程中只能将信号列入敏感表,而不能将变量列入敏感表。进程只对信号敏感,对变量不敏感。(敏感标准)只有信号才能把进程外信息带入进程内部,或将进程内部信息带出进程。(信息内部和外部沟通差异)5.1.3信号
5VHDL设计进阶第10页目标信号名<=表示式AFTER时间量;SIGNALa,b,c,y,z:INTEGER;...PROCESS(a,b,c)BEGINy<=a+b;z<=c–a;y<=b;ENDPROCESS;
5.1.3信号
信号定义还能够设置延时量,以下信号赋值若设置延时量,如AFTER3ns,则目标信号取得出入数据不是即时。即使零延时设置,目标信号取得数据也要经过一个特定延时(延时)。符号“<=”两边数值并不总是一致,与实际器件传输延迟特征是吻合。注意:变量和赋值过程有很大区分,务必区分两种赋值不一样之处。5VHDL设计进阶第11页5.1.3信号
SIGNALa,b,c,y,z:INTEGER;...PROCESS(a,b,c)BEGINy<=a+b;z<=c–a;y<=b;ENDPROCESS;
信号赋值能够出现在一个进程中,也能够直接出现于结构体并行语句中,但其含义不一样。位于进程中:属于次序信号赋值,需关注进程是否被开启,允许对同一目标信号进行屡次赋值。进程中对同一目标信号赋值,只有最终赋值语句有效。结构体中并行语句:属并行信号赋值,其赋值操作是各自独立并行发生,不允许对同一目标信号进行屡次赋值(电路上意味着“线与”,须注意)。5VHDL设计进阶第12页5.1数据对象
5.1.4进程中信号与变量赋值
信号SIGNAL变量VARIABLE基本使用方法用于作为电路中信号连线用于作为进程中局部数据存放单元适用范围在整个结构体内任何地方都能适用只能在所定义进程中使用行为特征在进程最终才对信号赋值马上赋值表5-1信号与变量赋值语句功效比较5VHDL设计进阶第13页5.1.4进程中信号与变量赋值
从硬件电路系统来看,信号与变量相当于逻辑电路系统中连线和连线上信号值。从行为仿真和VHDL语句功效上看,信号与变量含有显著区分,其差异主要表现为接收和保持信号方式和信息保留与传递区域大小上。信号可设置延时量,变量不能。变量只能作为局部信息载体,只能在所定义进程中有效,不能将信息带出进程;信号可作为模块间信息载体,在结构体中各进程传递信息必须使用信号完成。变量设置有时是过渡,最终信息传输和界面通信依然需要靠信号来完成。除却上述内容,二者在很多情况下没有什么区分,原因在于其二者均可接收赋值。5VHDL设计进阶第14页5.1.4进程中信号与变量赋值(存在范围)
【例5-1】ARCHITECTUREbhvOFDFF3ISBEGINPROCESS(CLK)
VARIABLEQQ:STD_LOGIC;
BEGINIFCLK'EVENTANDCLK='1'THENQQ:=D1;ENDIF;Q1<=QQ;ENDPROCESS;ENDbhv;【例5-2】ARCHITECTUREbhvOFDFF3IS
SIGNALQQ:STD_LOGIC;BEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENQQ<=D1;ENDIF;ENDPROCESS;Q1<=QQ;
ENDbhv;D触发器VHDL描述,二者综合后电路均相同图5-2D触发器电路不完整条件语句中,单独变量赋值语句与信号赋值语句都能综合出相同时序电路。5VHDL设计进阶第15页5.1.4进程中信号与变量赋值(赋值时序)【例5-3】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDFF3ISPORT(CLK,D1:INSTD_LOGIC;Q1:OUTSTD_LOGIC);END;ARCHITECTUREbhvOFDFF3IS
SIGNALA,B:STD_LOGIC;BEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THENA<=D1;B<=A;Q1<=B;ENDIF;ENDPROCESS;
END;【例5-4】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDFF3ISPORT(CLK,D1:INSTD_LOGIC;Q1:OUTSTD_LOGIC);END;ARCHITECTUREbhvOFDFF3ISBEGINPROCESS(CLK)
VARIABLEA,B:STD_LOGIC;
BEGINIFCLK'EVENTANDCLK='1'
THENA:=D1;B:=A;Q1<=B;ENDIF;ENDPROCESS;
END;
不一样赋值源赋值对比(赋值传递)5VHDL设计进阶第16页5.1.4进程中信号与变量赋值
5.1数据对象
图5-1例5-3RTL电路
图5-2D触发器电路
5VHDL设计进阶第17页从例5-3和例5-4中延时特征差异进行了解信号赋值需要有一个延时。如当执行到5-3中A<=D1,D1向A赋值是在一个延时后发生,此时A并未得到更新,即A还未取得D1值。开启赋值:开启了一个延时为模确定时器。执行赋值:只有在延时为后,A才能被更新,取得D1赋值。A<=D1延时经时间后‘0’‘1’A<=D1‘1’‘1’两个对象关系延时A为‘0’A为‘1’A在时序上改变5VHDL设计进阶第18页进程中赋值延时特点进程中,全部赋值语句(包含信号与变量赋值),均必须在一个延时内完成。一个进程运行时间固定为一个延时。进程中全部信号赋值语句在进程开启瞬间次序开启各自延时为定时器,在定时结束后分别进行赋值操作。注意,次序开启间隔几乎为0,次序执行到ENDPROCESS语句,延时结束,此时进程中全部信号赋值操作几乎同时完成,可看作是并行方式完成赋值。所以“执行操作赋值”和“完成赋值”是两个不一样概念。“执行赋值”只是一个过程,含有次序特征;“完成赋值”是结果,含有VHDL最本质并行特征。A为‘1’B为‘0’C为‘1’…延时A<=D1B<=D2C<=D3…PROCESS5VHDL设计进阶第19页进程中多赋值源延时和时序判定问题当进程中存在同一信号有多个赋值源时,即对同一信号发生屡次赋值,实际完成赋值,赋值对象信号更新是最靠近ENDPROCESS语句信号。进程中次序赋值部分没有时间流逝。所以在次序语句部分,不论有多少语句,都必须抵达ENDPROCESS语句时,延迟才能发生。【例5-5】SIGNALin1,in2,e1,...:STD_LOGIC;...PROCESS(in1,in2,...)VARIABLEc1,...:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIFin1='1'THEN...–-第1行e1<="1010";–-第2行...IFin2='0'THEN...–-第15+n行...c1:="0011";–-第30+m行...ENDIF;
ENDPROCESS;5VHDL设计进阶第20页【例5-5】SIGNALin1,in2,e1,...:STD_LOGIC;...PROCESS(in1,in2,...)VARIABLEc1,...:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIFin1='1'THEN...–-第1行e1<="1010";–-第2行...IFin2='0'THEN...–-第15+n行...c1:="0011";–-第30+m行...ENDIF;
ENDPROCESS;进程在2ns+时刻被开启,在今后时间进程中,全部行为都必须执行完成。在2ns+时刻,信号e1被赋值为“1010”,但并没有即使取得,信号e1值在2ns+2时刻才被更新。变量c1在赋值瞬间就被更新了,即在2ns+时刻,c1值变成“0011”。尽管c1赋值语句排在e1之后,但c1取得0011值时刻却比e1取得1010值时刻早一个。5VHDL设计进阶第21页回头再看例5-3和5-4例5-3中三个赋值语句都必须在ENDPROCESS后时刻内执行,所以它们含有近乎并行特征。当执行到ENDPROCESS后,语句中A<=D1;B<=A;Q1<=B同时得到执行。A得到了D1数值更新,但此时D1数值并不能传递至B,B取得是进程开启前,A中数据。Q1赋值也是如此情形。所以,了解并行特征,能够从一个时钟进程作为判定标准。A两次取得赋值时间差是一个时钟周期,D1不可能经过信号赋值方式将值传到Q1,使Q1得到更新。实际运行中,A被更新是上一个时钟周期D1,B取得数值也是上一个时钟周期A,同理Q1被更新数值也是上一个时钟数值B,而并非此时钟周期执行赋值所更新信号。时钟进程M D1=‘1’ A=‘0’ B=‘1’ Q1=‘0’时钟进程M+1 A=‘1’ B=‘0’ Q1=‘1’时钟进程M+2 B=‘1’ Q1=‘0’5VHDL设计进阶第22页例5-4中三个赋值语句在ENDPROCESS后被执行,因为A、B是变量,含有暂时保留数据特征,而且变量赋值更新是马上发生,而且和程序执行一样,含有显著次序性。当三条赋值语句次序执行时,变量A和B就有了数据传递功效。语句执行中,D1值传到A,再经过A传到B,在一个时刻后由B传给Q1.所以,在这些过程中,A和B只充当了D1数据暂存单元。Q1最终被更新值是上一个时钟周期D1,在一个时钟周期中,使用变量就能够起到次序赋值以及即时更新作用。Q1<=B;B:=A;A:=D1;时钟进程开始Q1准备被B赋值,B中数值为上一时钟进程B变量被A赋值,B数值立刻更新,为A上一时钟进程数值次序执行程序,A变量被D1赋值,A立刻更新,为D1上一时钟进程数值5VHDL设计进阶第23页再比较一下例5-6和5-7异同,深入了解次序语句中信号变量之间差异。设计一个4选1多路选择器,对应电路应该是一个纯组合逻辑电路。A和B是通道选择信号。选择通道组合,对应产生不一样逻辑信号,经过标识符muxval来表示。所以考虑muxval数值更新范围,是两例关键。同一信号有多个赋值源问题5VHDL设计进阶第24页KX康芯科技【例5-6】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(i0,i1,i2,i3,a,b:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux4;ARCHITECTUREbody_mux4OFmux4ISsignalmuxval:integerrange7downto0;BEGINprocess(i0,i1,i2,i3,a,b)begin
muxval<=0;if(a='1')thenmuxval<=muxval+1;endif;if(b='1')thenmuxval<=muxval+2;endif;casemuxvaliswhen0=>q<=i0;when1=>q<=i1;when2=>q<=i2;when3=>q<=i3;whenothers=>null;endcase;endprocess;ENDbody_mux4;5VHDL设计进阶第25页KX康芯科技【例5-7】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYmux4ISPORT(i0,i1,i2,i3,a,b:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDmux4;ARCHITECTUREbody_mux4OFmux4ISBEGINprocess(i0,i1,i2,i3,a,b)variablemuxval:integerrange7downto0;begin
muxval:=0;if(a='1')thenmuxval:=muxval+1;endif;if(b='1')thenmuxval:=muxval+2;endif;casemuxvaliswhen0=>q<=i0;when1=>q<=i1;when2=>q<=i2;when3=>q<=i3;whenothers=>null;endcase;endprocess;ENDbody_mux4;5VHDL设计进阶第26页KX康芯科技5.1.4进程中信号与变量赋值
图5-3例5-6RTL电路(Synplify综合)
5VHDL设计进阶第27页5.1.4进程中信号与变量赋值
图5-4例5-7RTL电路(Synplify综合)
5VHDL设计进阶第28页ARCHITECTUREbody_mux4OFmux4ISsignalmuxval:integerrange7downto0;BEGINprocess(i0,i1,i2,i3,a,b)beginmuxval<=0;if(a='1')thenmuxval<=muxval+1;endif;if(b='1')thenmuxval<=muxval+2;endif;例5-6中,信号muxval在进程中出现了三次赋值操作,依据进程中信号赋值规则,前两个赋值语句中赋值目标信号muxval都不能得到更新,只有最终赋值语句才能得到更新。在最终赋值语句中,因为传输信号右方muxval未能得到确切值,所以muxval一直是未知值。Muxval成为了一个不确定信号,在CASE语句中,因为Muxval值并不确定,所以无法经过判断muxval值来确定选通输入。5VHDL设计进阶第29页5.1.4进程中信号与变量赋值
图5-5例5-6中错误工作时序
5VHDL设计进阶第30页ARCHITECTUREbody_mux4OFmux4ISBEGINprocess(i0,i1,i2,i3,a,b)variablemuxval:integerrange7downto0;beginmuxval:=0;if(a='1')thenmuxval:=muxval+1;endif;if(b='1')thenmuxval:=muxval+2;endif;程序将muxval定义为变量,依据变量次序赋值以及暂存数据规则,首先执行语句muxval:=0;,从而两个IF语句中muxval都能得到确定初值。当IF语句不满足条件时,当a或b不等于1是,因为muxval已经在第一句赋值语句中取得赋值,尽管两个IF语句看起来属于不完整条件语句,但都不可能被综合成为时序电路。5VHDL设计进阶第31页5.1.4进程中信号与变量赋值
图5-6例5-7中正确工作时序
5VHDL设计进阶第32页5.2VHDL设计实例及其语法内涵主要目标:给出几个不一样类型VHDL设计实例经过实例再深入说明信号赋值和变量赋值、次序语句和并行语句、进程结构以及不完整条件语句关键点和特点。借助实例介绍相关VHDL语法知识。介绍一些经典数字模块设计方法深入了解和掌握VHDL设计基本方法和规律5VHDL设计进阶第33页5.2.1含同时并行预置功效8位移位存放器设计电路工作原理:当CLK上升沿到来时,移位进程被开启。假如预置使能LOAD为高电平,则将输入端口8位二进制并行置入移位存放器中,作为串行右移输出初始值。假如预置使能LOAD为低电平则执行语句。101010108位并行置入端口1010101005VHDL设计进阶第34页5.2.1含同时并行预置功效8位移位存放器设计CLK是移位时钟信号DIN是8位并行预置数据端口LOAD是并行数据预置使能端口QB是串行输出端口DOUT是移位并行输出5VHDL设计进阶第35页【例5-8】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSHFTISPORT(CLK,LOAD:INSTD_LOGIC;DIN:INSTD_LOGIC_VECTOR(7DOWNTO0);DOUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0);QB:OUTSTD_LOGIC);ENDENTITYSHFT;ARCHITECTUREBEHAVOFSHFTISSIGNALREG8:STD_LOGIC_VECTOR(7DOWNTO0);BEGINPROCESS(CLK,LOAD)BEGINIFCLK’EVENTANDCLK=‘1’THENIFLOAD=‘1’THENREG8<=DIN;ELSEREG8(6DOWNTO0)<=REG8(7DOWNTO1);--高位向低位移位ENDIF;ENDIF;ENDPROCESS;QB<=REG8(0);DOUT<=REG8;--需要等候时钟吗?ENDBEHAV;5VHDL设计进阶第36页时序功效说明第一个加载信号没有出现在时钟上升沿,故数据未被载入第二个加载信号,并行载入输入数据“10011011”,DIN数据锁入REG8中今后时钟信号都是移位时钟,每一个时钟信号降临,高位均向低位移位。注意QB,QB输出属于异步方式,即不随CLK上升沿改变,随REG8内数据即时发生改变。所以QB数据改变比REG8(0)位改变,早一个时钟周期。8位移位结束后,REG8内被最高位数据填满,为“11111111”,并继续移位,但数值不发生改变,等候下一加载信号降临。5VHDL设计进阶第37页5.2.1含同时并行预置功效8位移位存放器设计实现含同时并行预置功效8位移位存放器设计对比了同时数据移位功效实现,以及异步存放器输出时序关系。了解了进程时序逻辑与结构体赋值语句时序实现差异。5VHDL设计进阶第38页5.2.2移位模式可控8位移位存放器设计在掌握8位移位存放器设计基础上,增加移位模式控制功效利用CASE语句实现移位模式控制,并体会信号赋值特征经过移位模式控制字,控制移位模式1)带进位循环左移;2)自循环左移;3)自循环右移;4)带进位循环右移5)加载待移数;6)保持;5VHDL设计进阶第39页【例5-8】LibraryIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSHIFTISPORT(CLK,C0:INSTD_LOGIC;--时钟和进位输入 MD:INSTD_LOGIC_VECTOR(2DOWNTO0);--移位模式控制字 D:INSTD_LOGIC_VECTOR(7DOWNTO0);--待加载移位数据 QB:OUTSTD_LOGIC_VECTOR(7DOWNTO0);--移位数据输出 CN:OUTSTD_LOGIC);--进位输出ENDENTITY;ARCHITECTUREBEHAVOFSHIFTIS SIGNALREG:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALCY:STD_LOGIC;BEGIN PROCESS(CLK,MD,C0)BEGINIFCLK'EVENTANDCLK='1'THEN(接下页)5.2.2移位模式可控8位移位存放器设计5VHDL设计进阶第40页(接上页)CASEMDIS
WHEN"001"=>REG(0)<=C0;REG(7DOWNTO1)<=REG(6DOWNTO0);CY<=REG(7);--带进位循环左移 WHEN“010”=>REG(0)<=REG(7);REG(7DOWNTO1)<=REG(6DOWNTO0);--自循环左移 WHEN"011"=>REG(7)<=REG(0);REG(6DOWNTO0)<=REG(7DOWNTO1);--自循环右移 WHEN"100"=> REG(7)<=C0;REG(6DOWNTO0)<=REG(7DOWNTO1);CY<=REG(0);--带进位循环右移WHEN"101"=>REG(7DOWNTO0)<=D(7DOWNTO0);--加载待移数WHENOTHERS=>REG<=REG;CY<=CY;--保持ENDCASE;ENDIF;ENDPROCESS;
QB(7DOWNTO0)<=REG(7DOWNTO0);CN<=CY;--移位后输出ENDBEHAV;5VHDL设计进阶第41页5.2.2进程中信号与变量赋值
MD=“101”,加载待移数,D=>REG=>QBMD=“001”,带进位左移看时钟信号,保持带进位左移模式,进行数据左移。5VHDL设计进阶第42页5.2.3位矢中‘1’码个数统计电路设计主要功效:统计输入位矢中含‘1’个数。设计思想:将输入位矢中数据进行比较,当位矢中每位数据为‘1’时,检测并统计加1,完成对整个位矢检视,输出检测累加结果。5VHDL设计进阶第43页【例5-10】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCNTCISPORT(DIN:INSTD_LOGIC_VECTOR(7DOWNTO0);CNTH:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDENTITYCNTC;ARCHITECTUREBHVOFCNTCISBEGINPROCESS(DIN)
VARIABLEQ:STD_LOGIC_VECTOR(3DOWNTO0);--为何定义变量?BEGINQ:=“0000”;
FORNIN0TO7LOOP--N是LOOP循环变量IF(DIN(N)=‘1’)THENQ:=Q+1;ENDIF;ENDLOOP;CNTH<=Q;ENDPROCESS;ENDBEV;5VHDL设计进阶第44页1.LOOP语句LOOP语句属于可综合循环语句,它能够使所包含一组次序语句被循环执行,其执行次数可由设定循环参数决定。LOOP语句表示方式:(1)单个LOOP语句[LOOP标号:]LOOP次序语句ENDLOOP[LOOP标号];循环需引入其它控制语句(如EXIT语句)后才能确定。LOOP标号可任选。5VHDL设计进阶第45页(1)单个LOOP语句[LOOP标号:]LOOP次序语句ENDLOOP[LOOP标号];L2:LOOPA:=A+1;EXITL2WHENA>10;--当a大于10时跳出循环ENDLOOPL2;此程序循环方式由EXIT语句确定,其方式为,当A>10时结束循环执行A:=A+1。EXIT语句(P350)EXIT;EXIT标号;EXIT标号WHEN表示式;5VHDL设计进阶第46页(2)FOR_LOOP语句[LOOP标号:]FOR循环变量IN循环次数范围LOOP次序语句ENDLOOP[LOOP标号];FOR后循环变量是一个暂时变量,属于LOOP局部变量,无须事先定义,这个变量只能作为赋值源,不能被赋值。在使用循环变量时,LOOP语句范围内不要使用其它与循环变量相同标识符。循环次数范围:要求了LOOP语句中次序语句被执行次数。循环变量从循环次数范围初值开始,每执行完一次次序语句后递增1,直至到达循环次数范围指定最大值。5VHDL设计进阶第47页(2)FOR_LOOP语句[LOOP标号:]FOR循环变量IN循环次数范围LOOP次序语句ENDLOOP[LOOP标号];SIGNALA,B,C:STD_LOGIC_VECTOR(1TO3);……FORNIN1TO3LOOPA(N)<=B(N)ANDC(N);ENDLOOP;A(1)<=B(1)ANDC(1);A(2)<=B(2)ANDC(2);A(3)<=B(3)ANDC(3);LOOP语句等效于次序执行了三个信号赋值操作,产生三个与逻辑模块。每循环一次将产生一个硬件模块,循环次数增加,硬件资源耗用情况增加,但工作时间耗用未必增加。5VHDL设计进阶第48页5.2.1三态门设计
三态门有着许多实际应用。CPU设计中数据和地址总线构建。RAM或堆栈数据端口设计等。三态门在FPGA中VHDL描述实现:用STD_LOGIC数据类型‘Z’对一个变量赋值,就会引入三态门,并在控制下可使其输出呈高阻态,等效于使三态门禁止输出。5VHDL设计进阶第49页5.2.1三态门设计
【例5-9】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYtri_sISport(enable:INSTD_LOGIC;datain:INSTD_LOGIC_VECTOR(7DOWNTO0);dataout:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDtri_s;ARCHITECTUREbhvOFtri_sISBEGINPROCESS(enable,datain)BEGIN
IFenable='1'THENdataout<=datain;ELSEdataout<="ZZZZZZZZ";ENDIF;ENDPROCESS;ENDbhv;图5-88位3态控制门电路5VHDL设计进阶第50页5.2.1三态门设计
图5-88位3态控制门电路例5-12是一个8位三态控制门电路描述,其功效描述为:当使能控制信号为‘1’时,8位数据输出;为‘0’时输出高阻态,语句中将高阻态数据“ZZZZZZZZ”向输出端口赋值。将某信号定义为STD_LOGIC数据类型,讲‘Z’赋给此信号来取得三态控制门电路。需要注意,‘Z’在综合中是一个不确定值,不一样综合器可能会给出不一样结果。关键字‘Z’赋值表示高阻态,必须赋值给STD_LOGIC数据类型,而且必须为大写。5VHDL设计进阶第51页5.2.2双向端口设计
用INOUT模式设计双向端口需要考虑三态使用。双向端口在完成输入功效时,必须是原来呈输出模式端口呈高阻态。不然,待输入外部数据会与端口处原有电平发生“线与”,造成无法将外部数据读入。输入外部数据,禁止输出端口5VHDL设计进阶第52页5.2.2双向端口设计
【例5-13】libraryieee;useieee.std_logic_1164.all;entitytri_stateisport(control:instd_logic;in1:instd_logic_vector(7downto0);q:inoutstd_logic_vector(7downto0);x:outstd_logic_vector(7downto0));endtri_state;architecturebody_trioftri_stateisbeginprocess(control,q,in1)beginif(control='0')thenx<=q;elseq<=in1;x<="ZZZZZZZZ";endif;endprocess;endbody_tri;该IF语句含义怎样?5VHDL设计进阶第53页5.2.2双向端口设计
图5-9例5-10仿真波形图
从仿真波形看,当control=‘1’,q作为输出端口,x输出高阻态‘Z’,q输出in1端口数值56和E9。当control=‘0’,q作为输入端口,数据输入到x,输入前态无确切数值,造成输入无法定义。输出也无定义高阻态,无法输入。5VHDL设计进阶第54页5.2.2双向端口设计
图5-11例5-10综合结果(Synplify综合)
图5-9例5-10仿真波形图
综合后没能得到双向端口结果,怎样更正?5VHDL设计进阶第55页5.2.2双向端口设计
【例5-14】(以上部分同上例)process(control,q,in1)beginif(control='0')thenx<=q;q<="ZZZZZZZZ";elseq<=in1;x<="ZZZZZZZZ";endif;endprocess;endbody_tri;if(control='0')thenx<=q;elseq<=in1;x<=“ZZZZZZZZ”;endif;例5-14增加了语句q<=“ZZZZZZZZ”,处理了两个问题使q在IF语句中有完整条件描述,克服时序元件引入在q推行输入功效时,将其设定为高阻态输出,使q成为真正双向端口5VHDL设计进阶第56页5.2.2双向端口设计
图5-10例5-11仿真波形图
图5-12例5-11综合结果(Synplify综合)
从仿真波形图可看出,其功效已经符合双向端口设计要求5VHDL设计进阶第57页5.2.3三态总线电路设计
为了组成芯片内部总线系统,必须设计三态总线驱动器电路总线(Bus)是计算机各种功效部件之间传送信息公共通信干线。总线工作原理:当总线空闲(其它器件都以高阻态形式连接在总线上)且器件A要与器件B通信时,发起通信器件A驱动总线,发出地址和数据。其它以高阻态形式连接在总线上器件(如器件B)假如收到与自己相符地址信息后,即接收总线上数据。发送器件完成通信,将总线让出(输出变为高阻态)。5VHDL设计进阶第58页5.2.3三态总线电路设计
描述要求:8位4通道三态总线驱动器数据输入端1数据输入端2数据输入端3数据输入端4选择控制端总线系统处理数据输入端与总线系统控制连接问题5VHDL设计进阶第59页KX康芯科技8位4通道三态总线驱动器设计【例5-15】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYtristate2IS
port(input3,input2,input1,input0:INSTD_LOGIC_VECTOR(7DOWNTO0);enable:INSTD_LOGIC_VECTOR(1DOWNTO0);output:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDtristate2;ARCHITECTUREmultiple_driversOFtristate2ISBEGINPROCESS(enable,input3,input2,input1,input0)BEGIN
IFenable="00"THENoutput<=input3;ELSEoutput<=(OTHERS=>'Z');ENDIF;IFenable="01"THENoutput<=input2;ELSEoutput<=(OTHERS=>'Z');ENDIF;(接下页)
5VHDL设计进阶第60页(接上页)IFenable="10"THENoutput<=input1;ELSEoutput<=(OTHERS=>'Z');ENDIF;IFenable="11"THENoutput<=input0;ELSEoutput<=(OTHERS=>'Z');ENDIF;ENDPROCESS;ENDmultiple_drivers;
8位4通道三态总线驱动器设计5VHDL设计进阶第61页图5-13例5-12错误综合结果(Synplify综合结果)
8位4通道三态总线驱动器设计为何错误?怎样错误?怎么更正?进程语句中信号赋值特点,output有四个激励源,是不可能被次序赋值更新。在进程中,次序等价语句,包含赋值语句和IF语句,当它们列于同一进程敏感表中输入信号同时改变时,只可能对进程结束前那一条赋值语句进行赋值操作。5VHDL设计进阶第62页怎样错误?8位4通道三态总线驱动器设计IFenable="00"THENoutput<=input3;ELSEoutput<=(OTHERS=>'Z');ENDIF;IFenable="01"THENoutput<=input2;ELSEoutput<=(OTHERS=>'Z');ENDIF;IFenable="10"THENoutput<=input1;ELSEoutput<=(OTHERS=>'Z');ENDIF;IFenable="11"THENoutput<=input0;ELSEoutput<=(OTHERS=>'Z');ENDIF;进程采取了四个次序等价语句。次序等价意思,同一进程下次序语句如对同一信号赋值,其效果等同于同一信号多赋值源赋值标准。5VHDL设计进阶第63页【例5-13】libraryieee;useieee.std_logic_1164.all;entitytri2isport(ctl:instd_logic_vector(1downto0);datain1,datain2,datain3,datain4:instd_logic_vector(7downto0);q:outstd_logic_vector(7downto0));endtri2;architecturebody_trioftri2isbegin
q<=datain1whenctl="00"else(others=>'Z');q<=datain2whenctl="01"else(others=>'Z');q<=datain3whenctl="10"else(others=>'Z');q<=datain4whenctl="11"else(others=>'Z');endbody_tri;怎么更正?采取并行条件赋值语句,并行独立选择(P159)8位4通道三态总线驱动器设计5VHDL设计进阶第64页U1:PROCESS(ENABLE)BEGINIFenable="00"THENoutput<=input3;ELSEoutput<=(OTHERS=>'Z');ENDIF;ENDPROCESS;U2:PROCESS(ENABLE)BEGINIFenable="01"THENoutput<=input2;ELSEoutput<=(OTHERS=>'Z');ENDIF;ENDPROCESS;U3:PROCESS(ENABLE)BEGINIFenable="10"THENoutput<=input1;ELSEoutput<=(OTHERS=>'Z');ENDIF;ENDPROCESS;U4:PROCESS(ENABLE)BEGINIFenable="11"THENoutput<=input0;ELSEoutput<=(OTHERS=>'Z');ENDIF;ENDPROCESS;结构体中每一条并行语句都等同于一个独立运行进程,其地位是平等,它们独立且不冲突检测各并行语句中敏感信号输入。独立控制多通道电路结构,使用并行语句结构更为方便直观。若将四个IF语句放在四个并列PROCESS语句中,可综合出与并行语句相同结果。5VHDL设计进阶第65页图5-14例5-13正确综合结果(Synplify综合结果)
8位4通道三态总线驱动器设计提议:普通情况下,同一进程中最好只放一个IF语句结构(能够包含嵌入式IF语句),不论描述组合逻辑或时序逻辑都一样。轻易对程序功效进行直接分析,也适合综合器普通功效。5VHDL设计进阶第66页5.3次序语句归纳基于进程语句结构次序语句使用特点归纳在一个结构体中,允许放置任意多个进程语句结构,每一进程内部由一系列次序语句来组成。PROCESS语句结构包含了一个代表着设计实体中部分逻辑行为、独立次序语句描述进程。与并行语句同时执行方式不一样,次序语句能够依据设计者要求,利用次序可控语句完成逐条执行功效。5VHDL设计进阶第67页基于进程语句结构次序语句使用特点归纳在VHDL中,所谓次序仅是指语句按序执行上次序性,但不意味着PROCESS语句结构在综合后所对应硬件逻辑行为也含有相同次序性。PROCESS结构中次序语句,及其所谓次序执行过程只是相对于计算机中HDL行为仿真模拟过程而言。PROCESS过程与硬件结构中实现对应逻辑行为是不完全相同。语言次序硬件次序5VHDL设计进阶第68页5.3.1进程语句格式
PROCESS语句结构普通表示格式以下
[进程标号:]PROCESS[(敏感信号参数表)][IS][进程说明部分]BEGIN
次序描述语句ENDPROCESS[进程标号];进程标号:每一个PROCESS语句能够赋予一个进程标号。进程说明部分:定义该进程所需局部数据环境。次序描述语句:一段次序执行语句,描述该进程行为。5VHDL设计进阶第69页次序描述语句:一段次序执行语句,描述该进程行为。5.3.1进程语句格式
PROCESS中要求了每个进程语句在它敏感信号值改变时都必须立刻完成某一功效行为。此行为由进程语句中次序语句定义,行为结果能够赋给信号,并经过信号被其它PROCESS或BLOCK读取。一个结构体中能够含有多个PROCESS结构,每一PROCESS结构对于其敏感信号参数表中定义任一敏感参量改变,能够在任何时刻被激活或者开启。在同一结构体中,全部被激活进程都是并行运行。PROCESS结构本身是并行语句。5VHDL设计进阶第70页5.3.2进程结构组成(P162)5.3进程语句归纳
进程说明部分
数据类型、常数、变量、属性、子程序
赋值语句、进程开启语句、子程序调用语句、次序描述语句、进程跳出语句
次序描述语句部分敏感信号参数表5VHDL设计进阶第71页5.3.3进程关键点
对于VHDL进程结构,程序设计者需从四个方面判断其功效和执行情况。基于计算机纯软件VHDL行为仿真运行方式基于VHDL综合器综合结果所可能实现运行方式基于对综合结果时序仿真波形表达功效方式基于最终实现硬件电路运行方式对进程认识和进行进程设计需要注意以下六个方面问题5VHDL设计进阶第72页5.3.3进程关键点
1.
PROCESS为一无限循环语句
同一结构体中任一进程是一个独立无限循环程序结构。进程中无须放置返回语句,结构体是自动返回。进程只有执行状态和等候状态。满足特定条件(敏感变量发生改变),进程进入执行状态。当碰到ENDPROCESS语句后停顿执行,自动返回,进入等候状态5VHDL设计进阶第73页2.
PROCESS中次序语句含有显著次序/并行运行双重性
软件语言中每一条语句执行是按CPU及其周期节拍次序执行,每一条语句执行时间是确定,它与CPU主频频率、工作方式、状态周期、机器周期及指令周期长短紧密相连。PROCESS中,一个执行状态运行周期与外部原因无关,甚至与次序语句多少都没相关系,其执行时间从行为仿真角度看,只有一个VHDL模拟器最小分辨时间;从综合和硬件运行角度看,执行时间是0。同一PROCESS中,10条语句和1000条语句执行时间是一样,次序语句含有并行执行性质。5VHDL设计进阶第74页PROCESS(abc)BEGIN
CASEabcISWHEN"0000"=>so<="010";WHEN"0001"=>so<="111";WHEN"0010"=>so<="101";...WHEN"1110"=>so<="100";WHEN"1111"=>so<="000";WHENOTHERS=>NULL;ENDCASE;
ENDPROCESS;2.
PROCESS中次序语句含有显著次序/并行运行双重性
若abc=“1110”,执行语句WHEN“1110”=>SO<=“100”,无须逐条语句比较。所以执行一条语句和执行100条语句时间是一样。次序语句生成是并行结构组合电路。VHDL语句无法进行“单步”调试,只能经过时序或功效仿真波形,以及生成电路实测来了解程序功效和可能存在问题。5VHDL设计进阶第75页3.进程语句本身是并行语句同一结构体中不一样进程是并行运行,其依据对应敏感信号独立运行。在例5-17中,两个进程是完全独立运行,除非两组敏感信号中一对同时改变,两进程才被同时开启。因为两进程敏感信号temp改变有先后关系,使得进程开启含有先后次序关系。进程语句是并行语句,但敏感信号改变能够是次序改变,造成执行效果为次序执行。【例5-17】ENTITYmulISPORT(a,b,c,selx,sely:INBIT;data_out:OUTBIT);ENDmul;ARCHITECTUREexOFmulISSIGNALtemp:BIT;BEGINp_a:PROCESS(a,b,selx)BEGINIF(selx='0')THENtemp<=a;ELSEtemp<=b;ENDIF;ENDPROCESSp_a;
p_b:PROCESS(temp,c,sely)BEGINIF(sely='0')THENdata_out<=temp;ELSEdata_out<=c;ENDIF;ENDPROCESSp_b;ENDex;5VHDL设计进阶第76页4.信号能够是多个进程间通信线
结构体中多个进程之所以能并行同时运行,一个很主要原因是进程之间通信是经过信号来实现。信号对结构体来说,含有全局特征,它是进程间联络主要路径。5.一个进程中只允许描述对应于一个时钟信号同时时序逻辑
时序电路必须由进程中不完全条件次序语句描述。同一进程中可次序放置多个条件语句,但推荐只放一个判断时钟边缘检测语句条件语句。一个进程只能描述针对同一时钟同时时序逻辑。5VHDL设计进阶第77页5.4并行赋值语句讨论进程语句和并行赋值语句执行和实现并非同时发生。二者开启和执行情况与敏感信号(信号)改变亲密相关。任何一条信号并行赋值语句是缩略进程语句。在绝大多数情况下不能同时执行。DATA1<=AANDB;DATA2<=C;执行赋值需要信号改变,并行赋值语句非同时执行。5VHDL设计进阶第78页【例5-18】ARCHITECTUREdataflowOFmuxISSIGNALseiect:INTEGERRANGE15DOWNTO0;BEGINSelect<=0WHENs0=’0’ANDs1=’0’ELSE1WHENs0=’1’ANDs1=’0’ELSE2WHENs0=’0’ANDs1=’1’ELSE3;
x<=aWHENselect=0ELSEbWHENselect=1ELSEcWHENselect=2ELSEd;...
5.4并行赋值语句讨论并行赋值语句包含进程次序语句特征。SELECT改变由s0和s1数值确定。SELECT值确定x赋值源。所以两并行赋值语句含有次序改变结构。赋值结果信号作为另一并行语句判断控制信号5VHDL设计进阶第79页5.5IF语句概述
(1)IF条件句Then
次序语句
ENDIF;
(2)IF条件句Then次序语句
ELSE
次序语句
ENDIF;
(3)IF条件句ThenIF条件句Then...ENDIFENDIF(4)IF条件句Then
次序语句ELSIF条件句Then次序语句...ELSE
次序语句ENDIF
5VHDL设计进阶第80页(1)IF条件句Then
次序语句
ENDIF;
第1种条件语句执行情况:首先检测关键词IF后条件表示式布尔值是否为真假如为真,THEN将次序执行条件句中列出各条语句,直到ENDIF;假如为假,跳过以下次序语句不予执行,直接结束IF语句执行。此形式为非完整性条件语句,通惯用于产生时序电路。5VHDL设计进阶第81页(2)IF条件句Then次序语句
ELSE
次序语句
ENDIF;
第2种IF语句差异在于那个所测条件为FALSE时,并不直接跳到ENDIF结束条件句执行。转向ELSE以下另一段次序语句进行执行。第2种IF语句含有条件分支功效,就是经过测定所设条件真假以决定执行哪一组次序语句。执行完其中一组语句,再结束IF语句执行,这是一个完整性条件语句,通惯用于产生组合电路。5VHDL设计进阶第82页(3)IF条件句ThenIF条件句Then...ENDIFENDIF第3种IF语句是一个多重IF语句嵌套式条件句,能够产生比较丰富条件描述。其既能够产生时序电路,也能够产生组合电路,或者二者混合。使用时需要注意,ENDIF结束句个数应该与嵌入条件句数量一致。5VHDL设计进阶第83页(4)IF条件句Then
次序语句ELSIF条件句Then次序语句...ELSE
次序语句ENDIF
第4种IF语句与第3种语句一样,也能够实现不一样类型电路描述。关键词ELSIF设定多个判定条件,以使次序语句执行分支能够超出两个。这一类型语句主要特点,是任一分支次序语句执行条件是以上各分支所确定条件相与(相关条件同时成立),语句中有向上相与功效。5VHDL设计进阶第84页5.5IF语句概述
【例5-19】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYcontrol_stmtsISPORT(a,b,c:INBOOLEAN;output:OUTBOOLEAN);ENDcontrol_stmts;ARCHITECTUREexampleOFcontrol_stmtsISBEGINPROCESS(a,b,c)VARIABLEn:BOOLEAN;BEGIN
IFaTHENn:=b;ELSEn:=c;ENDIF;output<=n;ENDPROCESS;ENDexample;IFaTHEN…ELSEa是判断表示式,本条件示例含有两个分支。5VHDL设计进阶第85页5.5IF语句概述
输入输出din0din1din2din3din4din5din6din7
output0output1output2xxxxxxx0000xxxxxx01100xxxxx011010xxxx0111110xxx01111001xx011111101x011111101101111111111表5-28线-3线优先编码器真值表
注:表中“x”为任意,类似VHDL中“-”值。
5VHDL设计进阶第86页KX康芯科技【例5-15】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYcoderISPORT(din:INSTD_LOGIC_VECTOR(0TO7);output:OUTSTD_LOGIC_VECTOR(0TO2));ENDcoder;ARCHITECTUREbehavOFcoderISSIGNALSINT:STD_LOGIC_VECTOR(4DOWNTO0);BEGINPROCESS(din)BEGIN
IF(din(7)='0')THENoutput<="000";ELSIF(din(6)='0')THENoutput<="100";ELSIF(din(5)='0')THENoutput<="010";ELSIF(din(4)='0')THENoutput<="110";ELSIF(din(3)='0')THENoutput<="001";ELSIF(din(2)='0')THENoutput<="101";ELSIF(din(1)='0')THENoutput<="011";ELSEoutput<="111";ENDIF;ENDPROCESS;
ENDbehav;向上相与,不符合条件转向下一分支。考虑多个赋值源对output赋值情况5VHDL设计进阶第87页5.6半整数与奇数分频电路设计在实用数字系统设计中常需要完成不一样类型分频,对于偶数次分频(占空比50%)方法在第3章中已经介绍给大家。复习:占空比为50%偶数次分频电路设计方法,采取不一样模计数器来实现。N分频计数模为(N/2-1)。如6分频电路计数模,计数次数为2(6/2-1=2),计数内容为0、1、2,计数周期为3周期,当计数抵达2时即对输出端电平进行翻转一次。显然,奇数次分频不能采取上述方法得到。下面学习奇数次分频(占空比50%)方法。5VHDL设计进阶第88页【例5-21】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 经典经济理论与公共政策的应用试题及答案
- 规范化学习过程中的公路工程试题及答案
- 2025年信息系统项目管理师拔高试题及答案
- 从产业变革看数字化转型下的新商业模式探索
- 基于用户画像的消费者行为分析与精准营销
- 物流与供应链图书企业制定与实施新质生产力项目商业计划书
- 智能家居仿生安防系统企业制定与实施新质生产力项目商业计划书
- 环境教育中心企业制定与实施新质生产力项目商业计划书
- 漂流在线平台行业深度调研及发展项目商业计划书
- 油封密封件在线平台行业深度调研及发展项目商业计划书
- 理论联系实际谈一谈如何维护政治安全?参考答案1
- 2025年中国冷库用叉车数据监测研究报告
- 2025年高考第二次模拟考试物理(浙江卷)(参考答案)-20250416-113627
- 2025年化妆师职业技能考试试题及答案
- GA 1812.1-2024银行系统反恐怖防范要求第1部分:人民币发行库
- 2025至2030中国锂电池粘结剂市场竞争状况及融资并购研究报告
- 聋校语文课程标准解读
- 2025中信建投证券股份限公司校园招聘易考易错模拟试题(共500题)试卷后附参考答案
- 2025年山东省泰安市新泰市中考二模化学试题(原卷版+解析版)
- 2025年鸡蛋市场调查报告
- 河南省百师联盟2024-2025学年高二下学期4月联考数学试题(原卷版+解析版)
评论
0/150
提交评论