5VHDL設(shè)計(jì)進(jìn)階市公開課一等獎(jiǎng)省賽課獲獎(jiǎng)?wù)n件_第1頁
5VHDL設(shè)計(jì)進(jìn)階市公開課一等獎(jiǎng)省賽課獲獎(jiǎng)?wù)n件_第2頁
5VHDL設(shè)計(jì)進(jìn)階市公開課一等獎(jiǎng)省賽課獲獎(jiǎng)?wù)n件_第3頁
5VHDL設(shè)計(jì)進(jìn)階市公開課一等獎(jiǎng)省賽課獲獎(jiǎng)?wù)n件_第4頁
5VHDL設(shè)計(jì)進(jìn)階市公開課一等獎(jiǎng)省賽課獲獎(jiǎng)?wù)n件_第5頁
已閱讀5頁,還剩120頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

EDA技術(shù)實(shí)用教程第5章VHDL設(shè)計(jì)進(jìn)階5VHDL設(shè)計(jì)進(jìn)階第1頁數(shù)據(jù)對(duì)象一定設(shè)計(jì)實(shí)例及相關(guān)語法次序語句和并行語句歸納半整數(shù)與奇數(shù)分頻電路設(shè)計(jì)主要任務(wù):給出一定電路實(shí)例,探討電路實(shí)例實(shí)際功效和VHDL語言實(shí)現(xiàn)特點(diǎn)。經(jīng)過詳細(xì)設(shè)計(jì)例子,深入熟悉VHDL設(shè)計(jì)流程。掌握信號(hào)含義,了解一些特定數(shù)字信號(hào)功效單元VHDL實(shí)現(xiàn)方案。主要內(nèi)容5VHDL設(shè)計(jì)進(jìn)階第2頁5.1數(shù)據(jù)對(duì)象

在VHDL中,數(shù)據(jù)對(duì)象有三類,變量(variable)、常量(constant)和信號(hào)(signal)。數(shù)據(jù)對(duì)象類似于一個(gè)容器,用于接收不一樣數(shù)據(jù)類型賦值。注意:信號(hào)表現(xiàn)比較特殊,含有更多硬件特征,是VHDL中最有特色語言要素之一,在學(xué)習(xí)中需要進(jìn)行熟練把握。5VHDL設(shè)計(jì)進(jìn)階第3頁5.1數(shù)據(jù)對(duì)象

5.1.1常數(shù)

常數(shù)定義普通表述以下:CONSTANT常數(shù)名:數(shù)據(jù)類型:=表示式

;

CONSTANTFBT:STD_LOGIC_VECTOR:="010110";--標(biāo)準(zhǔn)位矢類型CONSTANTWIDTH:INTEGER:=4;--整數(shù)類型用途:常數(shù)設(shè)置主要是為了使程序更輕易閱讀和修改。如將邏輯位寬度定義為一個(gè)常量,只要修改這個(gè)常量就能夠很輕易改變寬度。SIGNALDATA:STD_LOGIC_VECTOR(WIDTH-1DOWNTO0)5VHDL設(shè)計(jì)進(jìn)階第4頁5.1.1常數(shù)

VHDL要求所定義常量數(shù)據(jù)類型必須與表示式數(shù)據(jù)類型一致。常數(shù)可定義于:實(shí)體、結(jié)構(gòu)體、程序包、塊、進(jìn)程、子程序。常數(shù)可視性規(guī)則:常數(shù)使用范圍取決于它被定義位置。假如在程序包中被定義,常數(shù)含有最大全局化特征,能夠用在調(diào)用此程序包全部設(shè)計(jì)實(shí)體中;假如定義在設(shè)計(jì)實(shí)體中,有效范圍為此設(shè)計(jì)實(shí)體全部結(jié)構(gòu)體中;假如在設(shè)計(jì)實(shí)體中某一結(jié)構(gòu)體中,則只能用于此結(jié)構(gòu)體中。5VHDL設(shè)計(jì)進(jìn)階第5頁5.1數(shù)據(jù)對(duì)象

5.1.2變量

定義變量普通表述以下:

VARIABLE變量名:數(shù)據(jù)類型:=初始值;

VARIABLEa:INTEGERRANGE0TO15;--變量a定義為常數(shù),取值范圍是0到15VARIABLEd:STD_LOGIC:=‘1’;--變量d定義為標(biāo)準(zhǔn)邏輯位數(shù)據(jù)類型,初始值是1

用途:只能在進(jìn)程和子程序中使用。變量不能將信息帶出對(duì)它作出定義結(jié)構(gòu)。特點(diǎn):變量賦值是一個(gè)理想化數(shù)據(jù)傳輸,是馬上發(fā)生不存在任何延時(shí)行為。主要作用:在進(jìn)程中作為暫時(shí)數(shù)據(jù)存放單元。5VHDL設(shè)計(jì)進(jìn)階第6頁變量賦值普通表述以下:目標(biāo)變量名:=表示式

5.1.2變量

變量是局部量,適用范圍僅限于定義了變量進(jìn)程或子程序次序語句中。同一變量值將隨變量賦值語句前后次序運(yùn)算而改變。變量賦值語句執(zhí)行與軟件描述語言中完全次序執(zhí)行賦值操作有相同處。變量賦值符號(hào)為:=,可定義初始值,但初始值不是必須。賦值需要相同數(shù)據(jù)類型。VARIABLEX,Y:INTEGERRANGE15DOWNTO0;VARIABLEA,B:STD_LOGIC_VECTOR(7DOWNTO0);X:=11;Y:=2+X;A:=B;A(0TO5):=B(2TO7);5VHDL設(shè)計(jì)進(jìn)階第7頁5.1.3信號(hào)

在第3章中已經(jīng)介紹過了,在此我們深入深入了解信號(hào)硬件特征。信號(hào)能夠作為設(shè)計(jì)實(shí)體中并行語句模塊間信息交流通道。信號(hào)作為一個(gè)數(shù)值容器,不但能夠容納當(dāng)前值,也能夠保持歷史值。這一屬性與觸發(fā)器記憶功效有很好對(duì)應(yīng)關(guān)系。5VHDL設(shè)計(jì)進(jìn)階第8頁5.1.3信號(hào)

SIGNAL信號(hào)名:數(shù)據(jù)類型:=初始值;SIGNALA:STD_LOGIC:=‘0’;信號(hào)與實(shí)體端口(PORT)概念是一致,只是信號(hào)沒有方向說明。對(duì)于端口,區(qū)分只是輸出端口不能讀入數(shù)據(jù),輸入端口不能被賦值;信號(hào)可看成實(shí)體內(nèi)部端口;實(shí)體端口只是一個(gè)隱形信號(hào),在實(shí)體中對(duì)端口定義實(shí)質(zhì)上是作了隱式信號(hào)定義,并要求了數(shù)據(jù)流向;信號(hào)本身定義是顯式定義。在實(shí)體中定義端口都能夠看作是一個(gè)信號(hào),在結(jié)構(gòu)體中直接加以使用。5VHDL設(shè)計(jì)進(jìn)階第9頁SIGNAL信號(hào)名:數(shù)據(jù)類型:=初始值;SIGNALA:STD_LOGIC:=‘0’;適用范圍:信號(hào)使用和定義范圍是實(shí)體、結(jié)構(gòu)體和程序包。注意:在進(jìn)程和子程序次序語句中不允許定義信號(hào),在進(jìn)程中只能將信號(hào)列入敏感表,而不能將變量列入敏感表。進(jìn)程只對(duì)信號(hào)敏感,對(duì)變量不敏感。(敏感標(biāo)準(zhǔn))只有信號(hào)才能把進(jìn)程外信息帶入進(jìn)程內(nèi)部,或?qū)⑦M(jìn)程內(nèi)部信息帶出進(jìn)程。(信息內(nèi)部和外部溝通差異)5.1.3信號(hào)

5VHDL設(shè)計(jì)進(jìn)階第10頁目標(biāo)信號(hào)名<=表示式AFTER時(shí)間量;SIGNALa,b,c,y,z:INTEGER;...PROCESS(a,b,c)BEGINy<=a+b;z<=c–a;y<=b;ENDPROCESS;

5.1.3信號(hào)

信號(hào)定義還能夠設(shè)置延時(shí)量,以下信號(hào)賦值若設(shè)置延時(shí)量,如AFTER3ns,則目標(biāo)信號(hào)取得出入數(shù)據(jù)不是即時(shí)。即使零延時(shí)設(shè)置,目標(biāo)信號(hào)取得數(shù)據(jù)也要經(jīng)過一個(gè)特定延時(shí)(延時(shí))。符號(hào)“<=”兩邊數(shù)值并不總是一致,與實(shí)際器件傳輸延遲特征是吻合。注意:變量和賦值過程有很大區(qū)分,務(wù)必區(qū)分兩種賦值不一樣之處。5VHDL設(shè)計(jì)進(jìn)階第11頁5.1.3信號(hào)

SIGNALa,b,c,y,z:INTEGER;...PROCESS(a,b,c)BEGINy<=a+b;z<=c–a;y<=b;ENDPROCESS;

信號(hào)賦值能夠出現(xiàn)在一個(gè)進(jìn)程中,也能夠直接出現(xiàn)于結(jié)構(gòu)體并行語句中,但其含義不一樣。位于進(jìn)程中:屬于次序信號(hào)賦值,需關(guān)注進(jìn)程是否被開啟,允許對(duì)同一目標(biāo)信號(hào)進(jìn)行屢次賦值。進(jìn)程中對(duì)同一目標(biāo)信號(hào)賦值,只有最終賦值語句有效。結(jié)構(gòu)體中并行語句:屬并行信號(hào)賦值,其賦值操作是各自獨(dú)立并行發(fā)生,不允許對(duì)同一目標(biāo)信號(hào)進(jìn)行屢次賦值(電路上意味著“線與”,須注意)。5VHDL設(shè)計(jì)進(jìn)階第12頁5.1數(shù)據(jù)對(duì)象

5.1.4進(jìn)程中信號(hào)與變量賦值

信號(hào)SIGNAL變量VARIABLE基本使用方法用于作為電路中信號(hào)連線用于作為進(jìn)程中局部數(shù)據(jù)存放單元適用范圍在整個(gè)結(jié)構(gòu)體內(nèi)任何地方都能適用只能在所定義進(jìn)程中使用行為特征在進(jìn)程最終才對(duì)信號(hào)賦值馬上賦值表5-1信號(hào)與變量賦值語句功效比較5VHDL設(shè)計(jì)進(jìn)階第13頁5.1.4進(jìn)程中信號(hào)與變量賦值

從硬件電路系統(tǒng)來看,信號(hào)與變量相當(dāng)于邏輯電路系統(tǒng)中連線和連線上信號(hào)值。從行為仿真和VHDL語句功效上看,信號(hào)與變量含有顯著區(qū)分,其差異主要表現(xiàn)為接收和保持信號(hào)方式和信息保留與傳遞區(qū)域大小上。信號(hào)可設(shè)置延時(shí)量,變量不能。變量只能作為局部信息載體,只能在所定義進(jìn)程中有效,不能將信息帶出進(jìn)程;信號(hào)可作為模塊間信息載體,在結(jié)構(gòu)體中各進(jìn)程傳遞信息必須使用信號(hào)完成。變量設(shè)置有時(shí)是過渡,最終信息傳輸和界面通信依然需要靠信號(hào)來完成。除卻上述內(nèi)容,二者在很多情況下沒有什么區(qū)分,原因在于其二者均可接收賦值。5VHDL設(shè)計(jì)進(jìn)階第14頁5.1.4進(jìn)程中信號(hào)與變量賦值(存在范圍)

【例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觸發(fā)器VHDL描述,二者綜合后電路均相同圖5-2D觸發(fā)器電路不完整條件語句中,單獨(dú)變量賦值語句與信號(hào)賦值語句都能綜合出相同時(shí)序電路。5VHDL設(shè)計(jì)進(jìn)階第15頁5.1.4進(jìn)程中信號(hào)與變量賦值(賦值時(shí)序)【例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;

不一樣賦值源賦值對(duì)比(賦值傳遞)5VHDL設(shè)計(jì)進(jìn)階第16頁5.1.4進(jìn)程中信號(hào)與變量賦值

5.1數(shù)據(jù)對(duì)象

圖5-1例5-3RTL電路

圖5-2D觸發(fā)器電路

5VHDL設(shè)計(jì)進(jìn)階第17頁從例5-3和例5-4中延時(shí)特征差異進(jìn)行了解信號(hào)賦值需要有一個(gè)延時(shí)。如當(dāng)執(zhí)行到5-3中A<=D1,D1向A賦值是在一個(gè)延時(shí)后發(fā)生,此時(shí)A并未得到更新,即A還未取得D1值。開啟賦值:開啟了一個(gè)延時(shí)為模確定時(shí)器。執(zhí)行賦值:只有在延時(shí)為后,A才能被更新,取得D1賦值。A<=D1延時(shí)經(jīng)時(shí)間后‘0’‘1’A<=D1‘1’‘1’兩個(gè)對(duì)象關(guān)系延時(shí)A為‘0’A為‘1’A在時(shí)序上改變5VHDL設(shè)計(jì)進(jìn)階第18頁進(jìn)程中賦值延時(shí)特點(diǎn)進(jìn)程中,全部賦值語句(包含信號(hào)與變量賦值),均必須在一個(gè)延時(shí)內(nèi)完成。一個(gè)進(jìn)程運(yùn)行時(shí)間固定為一個(gè)延時(shí)。進(jìn)程中全部信號(hào)賦值語句在進(jìn)程開啟瞬間次序開啟各自延時(shí)為定時(shí)器,在定時(shí)結(jié)束后分別進(jìn)行賦值操作。注意,次序開啟間隔幾乎為0,次序執(zhí)行到ENDPROCESS語句,延時(shí)結(jié)束,此時(shí)進(jìn)程中全部信號(hào)賦值操作幾乎同時(shí)完成,可看作是并行方式完成賦值。所以“執(zhí)行操作賦值”和“完成賦值”是兩個(gè)不一樣概念?!皥?zhí)行賦值”只是一個(gè)過程,含有次序特征;“完成賦值”是結(jié)果,含有VHDL最本質(zhì)并行特征。A為‘1’B為‘0’C為‘1’…延時(shí)A<=D1B<=D2C<=D3…PROCESS5VHDL設(shè)計(jì)進(jìn)階第19頁進(jìn)程中多賦值源延時(shí)和時(shí)序判定問題當(dāng)進(jìn)程中存在同一信號(hào)有多個(gè)賦值源時(shí),即對(duì)同一信號(hào)發(fā)生屢次賦值,實(shí)際完成賦值,賦值對(duì)象信號(hào)更新是最靠近ENDPROCESS語句信號(hào)。進(jìn)程中次序賦值部分沒有時(shí)間流逝。所以在次序語句部分,不論有多少語句,都必須抵達(dá)ENDPROCESS語句時(shí),延遲才能發(fā)生?!纠?-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設(shè)計(jì)進(jìn)階第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;進(jìn)程在2ns+時(shí)刻被開啟,在今后時(shí)間進(jìn)程中,全部行為都必須執(zhí)行完成。在2ns+時(shí)刻,信號(hào)e1被賦值為“1010”,但并沒有即使取得,信號(hào)e1值在2ns+2時(shí)刻才被更新。變量c1在賦值瞬間就被更新了,即在2ns+時(shí)刻,c1值變成“0011”。盡管c1賦值語句排在e1之后,但c1取得0011值時(shí)刻卻比e1取得1010值時(shí)刻早一個(gè)。5VHDL設(shè)計(jì)進(jìn)階第21頁回頭再看例5-3和5-4例5-3中三個(gè)賦值語句都必須在ENDPROCESS后時(shí)刻內(nèi)執(zhí)行,所以它們含有近乎并行特征。當(dāng)執(zhí)行到ENDPROCESS后,語句中A<=D1;B<=A;Q1<=B同時(shí)得到執(zhí)行。A得到了D1數(shù)值更新,但此時(shí)D1數(shù)值并不能傳遞至B,B取得是進(jìn)程開啟前,A中數(shù)據(jù)。Q1賦值也是如此情形。所以,了解并行特征,能夠從一個(gè)時(shí)鐘進(jìn)程作為判定標(biāo)準(zhǔn)。A兩次取得賦值時(shí)間差是一個(gè)時(shí)鐘周期,D1不可能經(jīng)過信號(hào)賦值方式將值傳到Q1,使Q1得到更新。實(shí)際運(yùn)行中,A被更新是上一個(gè)時(shí)鐘周期D1,B取得數(shù)值也是上一個(gè)時(shí)鐘周期A,同理Q1被更新數(shù)值也是上一個(gè)時(shí)鐘數(shù)值B,而并非此時(shí)鐘周期執(zhí)行賦值所更新信號(hào)。時(shí)鐘進(jìn)程M D1=‘1’ A=‘0’ B=‘1’ Q1=‘0’時(shí)鐘進(jìn)程M+1 A=‘1’ B=‘0’ Q1=‘1’時(shí)鐘進(jìn)程M+2 B=‘1’ Q1=‘0’5VHDL設(shè)計(jì)進(jìn)階第22頁例5-4中三個(gè)賦值語句在ENDPROCESS后被執(zhí)行,因?yàn)锳、B是變量,含有暫時(shí)保留數(shù)據(jù)特征,而且變量賦值更新是馬上發(fā)生,而且和程序執(zhí)行一樣,含有顯著次序性。當(dāng)三條賦值語句次序執(zhí)行時(shí),變量A和B就有了數(shù)據(jù)傳遞功效。語句執(zhí)行中,D1值傳到A,再經(jīng)過A傳到B,在一個(gè)時(shí)刻后由B傳給Q1.所以,在這些過程中,A和B只充當(dāng)了D1數(shù)據(jù)暫存單元。Q1最終被更新值是上一個(gè)時(shí)鐘周期D1,在一個(gè)時(shí)鐘周期中,使用變量就能夠起到次序賦值以及即時(shí)更新作用。Q1<=B;B:=A;A:=D1;時(shí)鐘進(jìn)程開始Q1準(zhǔn)備被B賦值,B中數(shù)值為上一時(shí)鐘進(jìn)程B變量被A賦值,B數(shù)值立刻更新,為A上一時(shí)鐘進(jìn)程數(shù)值次序執(zhí)行程序,A變量被D1賦值,A立刻更新,為D1上一時(shí)鐘進(jìn)程數(shù)值5VHDL設(shè)計(jì)進(jìn)階第23頁再比較一下例5-6和5-7異同,深入了解次序語句中信號(hào)變量之間差異。設(shè)計(jì)一個(gè)4選1多路選擇器,對(duì)應(yīng)電路應(yīng)該是一個(gè)純組合邏輯電路。A和B是通道選擇信號(hào)。選擇通道組合,對(duì)應(yīng)產(chǎn)生不一樣邏輯信號(hào),經(jīng)過標(biāo)識(shí)符muxval來表示。所以考慮muxval數(shù)值更新范圍,是兩例關(guān)鍵。同一信號(hào)有多個(gè)賦值源問題5VHDL設(shè)計(jì)進(jìn)階第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設(shè)計(jì)進(jìn)階第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設(shè)計(jì)進(jìn)階第26頁KX康芯科技5.1.4進(jìn)程中信號(hào)與變量賦值

圖5-3例5-6RTL電路(Synplify綜合)

5VHDL設(shè)計(jì)進(jìn)階第27頁5.1.4進(jìn)程中信號(hào)與變量賦值

圖5-4例5-7RTL電路(Synplify綜合)

5VHDL設(shè)計(jì)進(jìn)階第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中,信號(hào)muxval在進(jìn)程中出現(xiàn)了三次賦值操作,依據(jù)進(jìn)程中信號(hào)賦值規(guī)則,前兩個(gè)賦值語句中賦值目標(biāo)信號(hào)muxval都不能得到更新,只有最終賦值語句才能得到更新。在最終賦值語句中,因?yàn)閭鬏斝盘?hào)右方muxval未能得到確切值,所以muxval一直是未知值。Muxval成為了一個(gè)不確定信號(hào),在CASE語句中,因?yàn)镸uxval值并不確定,所以無法經(jīng)過判斷muxval值來確定選通輸入。5VHDL設(shè)計(jì)進(jìn)階第29頁5.1.4進(jìn)程中信號(hào)與變量賦值

圖5-5例5-6中錯(cuò)誤工作時(shí)序

5VHDL設(shè)計(jì)進(jìn)階第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;程序?qū)uxval定義為變量,依據(jù)變量次序賦值以及暫存數(shù)據(jù)規(guī)則,首先執(zhí)行語句muxval:=0;,從而兩個(gè)IF語句中muxval都能得到確定初值。當(dāng)IF語句不滿足條件時(shí),當(dāng)a或b不等于1是,因?yàn)閙uxval已經(jīng)在第一句賦值語句中取得賦值,盡管兩個(gè)IF語句看起來屬于不完整條件語句,但都不可能被綜合成為時(shí)序電路。5VHDL設(shè)計(jì)進(jìn)階第31頁5.1.4進(jìn)程中信號(hào)與變量賦值

圖5-6例5-7中正確工作時(shí)序

5VHDL設(shè)計(jì)進(jìn)階第32頁5.2VHDL設(shè)計(jì)實(shí)例及其語法內(nèi)涵主要目標(biāo):給出幾個(gè)不一樣類型VHDL設(shè)計(jì)實(shí)例經(jīng)過實(shí)例再深入說明信號(hào)賦值和變量賦值、次序語句和并行語句、進(jìn)程結(jié)構(gòu)以及不完整條件語句關(guān)鍵點(diǎn)和特點(diǎn)。借助實(shí)例介紹相關(guān)VHDL語法知識(shí)。介紹一些經(jīng)典數(shù)字模塊設(shè)計(jì)方法深入了解和掌握VHDL設(shè)計(jì)基本方法和規(guī)律5VHDL設(shè)計(jì)進(jìn)階第33頁5.2.1含同時(shí)并行預(yù)置功效8位移位存放器設(shè)計(jì)電路工作原理:當(dāng)CLK上升沿到來時(shí),移位進(jìn)程被開啟。假如預(yù)置使能LOAD為高電平,則將輸入端口8位二進(jìn)制并行置入移位存放器中,作為串行右移輸出初始值。假如預(yù)置使能LOAD為低電平則執(zhí)行語句。101010108位并行置入端口1010101005VHDL設(shè)計(jì)進(jìn)階第34頁5.2.1含同時(shí)并行預(yù)置功效8位移位存放器設(shè)計(jì)CLK是移位時(shí)鐘信號(hào)DIN是8位并行預(yù)置數(shù)據(jù)端口LOAD是并行數(shù)據(jù)預(yù)置使能端口QB是串行輸出端口DOUT是移位并行輸出5VHDL設(shè)計(jì)進(jìn)階第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;--需要等候時(shí)鐘嗎?ENDBEHAV;5VHDL設(shè)計(jì)進(jìn)階第36頁時(shí)序功效說明第一個(gè)加載信號(hào)沒有出現(xiàn)在時(shí)鐘上升沿,故數(shù)據(jù)未被載入第二個(gè)加載信號(hào),并行載入輸入數(shù)據(jù)“10011011”,DIN數(shù)據(jù)鎖入REG8中今后時(shí)鐘信號(hào)都是移位時(shí)鐘,每一個(gè)時(shí)鐘信號(hào)降臨,高位均向低位移位。注意QB,QB輸出屬于異步方式,即不隨CLK上升沿改變,隨REG8內(nèi)數(shù)據(jù)即時(shí)發(fā)生改變。所以QB數(shù)據(jù)改變比REG8(0)位改變,早一個(gè)時(shí)鐘周期。8位移位結(jié)束后,REG8內(nèi)被最高位數(shù)據(jù)填滿,為“11111111”,并繼續(xù)移位,但數(shù)值不發(fā)生改變,等候下一加載信號(hào)降臨。5VHDL設(shè)計(jì)進(jìn)階第37頁5.2.1含同時(shí)并行預(yù)置功效8位移位存放器設(shè)計(jì)實(shí)現(xiàn)含同時(shí)并行預(yù)置功效8位移位存放器設(shè)計(jì)對(duì)比了同時(shí)數(shù)據(jù)移位功效實(shí)現(xiàn),以及異步存放器輸出時(shí)序關(guān)系。了解了進(jìn)程時(shí)序邏輯與結(jié)構(gòu)體賦值語句時(shí)序?qū)崿F(xiàn)差異。5VHDL設(shè)計(jì)進(jìn)階第38頁5.2.2移位模式可控8位移位存放器設(shè)計(jì)在掌握8位移位存放器設(shè)計(jì)基礎(chǔ)上,增加移位模式控制功效利用CASE語句實(shí)現(xiàn)移位模式控制,并體會(huì)信號(hào)賦值特征經(jīng)過移位模式控制字,控制移位模式1)帶進(jìn)位循環(huán)左移;2)自循環(huán)左移;3)自循環(huán)右移;4)帶進(jìn)位循環(huán)右移5)加載待移數(shù);6)保持;5VHDL設(shè)計(jì)進(jìn)階第39頁【例5-8】LibraryIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYSHIFTISPORT(CLK,C0:INSTD_LOGIC;--時(shí)鐘和進(jìn)位輸入 MD:INSTD_LOGIC_VECTOR(2DOWNTO0);--移位模式控制字 D:INSTD_LOGIC_VECTOR(7DOWNTO0);--待加載移位數(shù)據(jù) QB:OUTSTD_LOGIC_VECTOR(7DOWNTO0);--移位數(shù)據(jù)輸出 CN:OUTSTD_LOGIC);--進(jìn)位輸出ENDENTITY;ARCHITECTUREBEHAVOFSHIFTIS SIGNALREG:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALCY:STD_LOGIC;BEGIN PROCESS(CLK,MD,C0)BEGINIFCLK'EVENTANDCLK='1'THEN(接下頁)5.2.2移位模式可控8位移位存放器設(shè)計(jì)5VHDL設(shè)計(jì)進(jìn)階第40頁(接上頁)CASEMDIS

WHEN"001"=>REG(0)<=C0;REG(7DOWNTO1)<=REG(6DOWNTO0);CY<=REG(7);--帶進(jìn)位循環(huán)左移 WHEN“010”=>REG(0)<=REG(7);REG(7DOWNTO1)<=REG(6DOWNTO0);--自循環(huán)左移 WHEN"011"=>REG(7)<=REG(0);REG(6DOWNTO0)<=REG(7DOWNTO1);--自循環(huán)右移 WHEN"100"=> REG(7)<=C0;REG(6DOWNTO0)<=REG(7DOWNTO1);CY<=REG(0);--帶進(jìn)位循環(huán)右移WHEN"101"=>REG(7DOWNTO0)<=D(7DOWNTO0);--加載待移數(shù)WHENOTHERS=>REG<=REG;CY<=CY;--保持ENDCASE;ENDIF;ENDPROCESS;

QB(7DOWNTO0)<=REG(7DOWNTO0);CN<=CY;--移位后輸出ENDBEHAV;5VHDL設(shè)計(jì)進(jìn)階第41頁5.2.2進(jìn)程中信號(hào)與變量賦值

MD=“101”,加載待移數(shù),D=>REG=>QBMD=“001”,帶進(jìn)位左移看時(shí)鐘信號(hào),保持帶進(jìn)位左移模式,進(jìn)行數(shù)據(jù)左移。5VHDL設(shè)計(jì)進(jìn)階第42頁5.2.3位矢中‘1’碼個(gè)數(shù)統(tǒng)計(jì)電路設(shè)計(jì)主要功效:統(tǒng)計(jì)輸入位矢中含‘1’個(gè)數(shù)。設(shè)計(jì)思想:將輸入位矢中數(shù)據(jù)進(jìn)行比較,當(dāng)位矢中每位數(shù)據(jù)為‘1’時(shí),檢測并統(tǒng)計(jì)加1,完成對(duì)整個(gè)位矢檢視,輸出檢測累加結(jié)果。5VHDL設(shè)計(jì)進(jìn)階第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循環(huán)變量IF(DIN(N)=‘1’)THENQ:=Q+1;ENDIF;ENDLOOP;CNTH<=Q;ENDPROCESS;ENDBEV;5VHDL設(shè)計(jì)進(jìn)階第44頁1.LOOP語句LOOP語句屬于可綜合循環(huán)語句,它能夠使所包含一組次序語句被循環(huán)執(zhí)行,其執(zhí)行次數(shù)可由設(shè)定循環(huán)參數(shù)決定。LOOP語句表示方式:(1)單個(gè)LOOP語句[LOOP標(biāo)號(hào):]LOOP次序語句ENDLOOP[LOOP標(biāo)號(hào)];循環(huán)需引入其它控制語句(如EXIT語句)后才能確定。LOOP標(biāo)號(hào)可任選。5VHDL設(shè)計(jì)進(jìn)階第45頁(1)單個(gè)LOOP語句[LOOP標(biāo)號(hào):]LOOP次序語句ENDLOOP[LOOP標(biāo)號(hào)];L2:LOOPA:=A+1;EXITL2WHENA>10;--當(dāng)a大于10時(shí)跳出循環(huán)ENDLOOPL2;此程序循環(huán)方式由EXIT語句確定,其方式為,當(dāng)A>10時(shí)結(jié)束循環(huán)執(zhí)行A:=A+1。EXIT語句(P350)EXIT;EXIT標(biāo)號(hào);EXIT標(biāo)號(hào)WHEN表示式;5VHDL設(shè)計(jì)進(jìn)階第46頁(2)FOR_LOOP語句[LOOP標(biāo)號(hào):]FOR循環(huán)變量IN循環(huán)次數(shù)范圍LOOP次序語句ENDLOOP[LOOP標(biāo)號(hào)];FOR后循環(huán)變量是一個(gè)暫時(shí)變量,屬于LOOP局部變量,無須事先定義,這個(gè)變量只能作為賦值源,不能被賦值。在使用循環(huán)變量時(shí),LOOP語句范圍內(nèi)不要使用其它與循環(huán)變量相同標(biāo)識(shí)符。循環(huán)次數(shù)范圍:要求了LOOP語句中次序語句被執(zhí)行次數(shù)。循環(huán)變量從循環(huán)次數(shù)范圍初值開始,每執(zhí)行完一次次序語句后遞增1,直至到達(dá)循環(huán)次數(shù)范圍指定最大值。5VHDL設(shè)計(jì)進(jìn)階第47頁(2)FOR_LOOP語句[LOOP標(biāo)號(hào):]FOR循環(huán)變量IN循環(huán)次數(shù)范圍LOOP次序語句ENDLOOP[LOOP標(biāo)號(hào)];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語句等效于次序執(zhí)行了三個(gè)信號(hào)賦值操作,產(chǎn)生三個(gè)與邏輯模塊。每循環(huán)一次將產(chǎn)生一個(gè)硬件模塊,循環(huán)次數(shù)增加,硬件資源耗用情況增加,但工作時(shí)間耗用未必增加。5VHDL設(shè)計(jì)進(jìn)階第48頁5.2.1三態(tài)門設(shè)計(jì)

三態(tài)門有著許多實(shí)際應(yīng)用。CPU設(shè)計(jì)中數(shù)據(jù)和地址總線構(gòu)建。RAM或堆棧數(shù)據(jù)端口設(shè)計(jì)等。三態(tài)門在FPGA中VHDL描述實(shí)現(xiàn):用STD_LOGIC數(shù)據(jù)類型‘Z’對(duì)一個(gè)變量賦值,就會(huì)引入三態(tài)門,并在控制下可使其輸出呈高阻態(tài),等效于使三態(tài)門禁止輸出。5VHDL設(shè)計(jì)進(jìn)階第49頁5.2.1三態(tài)門設(shè)計(jì)

【例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態(tài)控制門電路5VHDL設(shè)計(jì)進(jìn)階第50頁5.2.1三態(tài)門設(shè)計(jì)

圖5-88位3態(tài)控制門電路例5-12是一個(gè)8位三態(tài)控制門電路描述,其功效描述為:當(dāng)使能控制信號(hào)為‘1’時(shí),8位數(shù)據(jù)輸出;為‘0’時(shí)輸出高阻態(tài),語句中將高阻態(tài)數(shù)據(jù)“ZZZZZZZZ”向輸出端口賦值。將某信號(hào)定義為STD_LOGIC數(shù)據(jù)類型,講‘Z’賦給此信號(hào)來取得三態(tài)控制門電路。需要注意,‘Z’在綜合中是一個(gè)不確定值,不一樣綜合器可能會(huì)給出不一樣結(jié)果。關(guān)鍵字‘Z’賦值表示高阻態(tài),必須賦值給STD_LOGIC數(shù)據(jù)類型,而且必須為大寫。5VHDL設(shè)計(jì)進(jìn)階第51頁5.2.2雙向端口設(shè)計(jì)

用INOUT模式設(shè)計(jì)雙向端口需要考慮三態(tài)使用。雙向端口在完成輸入功效時(shí),必須是原來呈輸出模式端口呈高阻態(tài)。不然,待輸入外部數(shù)據(jù)會(huì)與端口處原有電平發(fā)生“線與”,造成無法將外部數(shù)據(jù)讀入。輸入外部數(shù)據(jù),禁止輸出端口5VHDL設(shè)計(jì)進(jìn)階第52頁5.2.2雙向端口設(shè)計(jì)

【例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設(shè)計(jì)進(jìn)階第53頁5.2.2雙向端口設(shè)計(jì)

圖5-9例5-10仿真波形圖

從仿真波形看,當(dāng)control=‘1’,q作為輸出端口,x輸出高阻態(tài)‘Z’,q輸出in1端口數(shù)值56和E9。當(dāng)control=‘0’,q作為輸入端口,數(shù)據(jù)輸入到x,輸入前態(tài)無確切數(shù)值,造成輸入無法定義。輸出也無定義高阻態(tài),無法輸入。5VHDL設(shè)計(jì)進(jìn)階第54頁5.2.2雙向端口設(shè)計(jì)

圖5-11例5-10綜合結(jié)果(Synplify綜合)

圖5-9例5-10仿真波形圖

綜合后沒能得到雙向端口結(jié)果,怎樣更正?5VHDL設(shè)計(jì)進(jìn)階第55頁5.2.2雙向端口設(shè)計(jì)

【例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”,處理了兩個(gè)問題使q在IF語句中有完整條件描述,克服時(shí)序元件引入在q推行輸入功效時(shí),將其設(shè)定為高阻態(tài)輸出,使q成為真正雙向端口5VHDL設(shè)計(jì)進(jìn)階第56頁5.2.2雙向端口設(shè)計(jì)

圖5-10例5-11仿真波形圖

圖5-12例5-11綜合結(jié)果(Synplify綜合)

從仿真波形圖可看出,其功效已經(jīng)符合雙向端口設(shè)計(jì)要求5VHDL設(shè)計(jì)進(jìn)階第57頁5.2.3三態(tài)總線電路設(shè)計(jì)

為了組成芯片內(nèi)部總線系統(tǒng),必須設(shè)計(jì)三態(tài)總線驅(qū)動(dòng)器電路總線(Bus)是計(jì)算機(jī)各種功效部件之間傳送信息公共通信干線??偩€工作原理:當(dāng)總線空閑(其它器件都以高阻態(tài)形式連接在總線上)且器件A要與器件B通信時(shí),發(fā)起通信器件A驅(qū)動(dòng)總線,發(fā)出地址和數(shù)據(jù)。其它以高阻態(tài)形式連接在總線上器件(如器件B)假如收到與自己相符地址信息后,即接收總線上數(shù)據(jù)。發(fā)送器件完成通信,將總線讓出(輸出變?yōu)楦咦钁B(tài))。5VHDL設(shè)計(jì)進(jìn)階第58頁5.2.3三態(tài)總線電路設(shè)計(jì)

描述要求:8位4通道三態(tài)總線驅(qū)動(dòng)器數(shù)據(jù)輸入端1數(shù)據(jù)輸入端2數(shù)據(jù)輸入端3數(shù)據(jù)輸入端4選擇控制端總線系統(tǒng)處理數(shù)據(jù)輸入端與總線系統(tǒng)控制連接問題5VHDL設(shè)計(jì)進(jìn)階第59頁KX康芯科技8位4通道三態(tài)總線驅(qū)動(dòng)器設(shè)計(jì)【例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設(shè)計(jì)進(jìn)階第60頁(接上頁)IFenable="10"THENoutput<=input1;ELSEoutput<=(OTHERS=>'Z');ENDIF;IFenable="11"THENoutput<=input0;ELSEoutput<=(OTHERS=>'Z');ENDIF;ENDPROCESS;ENDmultiple_drivers;

8位4通道三態(tài)總線驅(qū)動(dòng)器設(shè)計(jì)5VHDL設(shè)計(jì)進(jìn)階第61頁圖5-13例5-12錯(cuò)誤綜合結(jié)果(Synplify綜合結(jié)果)

8位4通道三態(tài)總線驅(qū)動(dòng)器設(shè)計(jì)為何錯(cuò)誤?怎樣錯(cuò)誤?怎么更正?進(jìn)程語句中信號(hào)賦值特點(diǎn),output有四個(gè)激勵(lì)源,是不可能被次序賦值更新。在進(jìn)程中,次序等價(jià)語句,包含賦值語句和IF語句,當(dāng)它們列于同一進(jìn)程敏感表中輸入信號(hào)同時(shí)改變時(shí),只可能對(duì)進(jìn)程結(jié)束前那一條賦值語句進(jìn)行賦值操作。5VHDL設(shè)計(jì)進(jìn)階第62頁怎樣錯(cuò)誤?8位4通道三態(tài)總線驅(qū)動(dòng)器設(shè)計(jì)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;進(jìn)程采取了四個(gè)次序等價(jià)語句。次序等價(jià)意思,同一進(jìn)程下次序語句如對(duì)同一信號(hào)賦值,其效果等同于同一信號(hào)多賦值源賦值標(biāo)準(zhǔn)。5VHDL設(shè)計(jì)進(jìn)階第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;怎么更正?采取并行條件賦值語句,并行獨(dú)立選擇(P159)8位4通道三態(tài)總線驅(qū)動(dòng)器設(shè)計(jì)5VHDL設(shè)計(jì)進(jìn)階第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;結(jié)構(gòu)體中每一條并行語句都等同于一個(gè)獨(dú)立運(yùn)行進(jìn)程,其地位是平等,它們獨(dú)立且不沖突檢測各并行語句中敏感信號(hào)輸入。獨(dú)立控制多通道電路結(jié)構(gòu),使用并行語句結(jié)構(gòu)更為方便直觀。若將四個(gè)IF語句放在四個(gè)并列PROCESS語句中,可綜合出與并行語句相同結(jié)果。5VHDL設(shè)計(jì)進(jìn)階第65頁圖5-14例5-13正確綜合結(jié)果(Synplify綜合結(jié)果)

8位4通道三態(tài)總線驅(qū)動(dòng)器設(shè)計(jì)提議:普通情況下,同一進(jìn)程中最好只放一個(gè)IF語句結(jié)構(gòu)(能夠包含嵌入式IF語句),不論描述組合邏輯或時(shí)序邏輯都一樣。輕易對(duì)程序功效進(jìn)行直接分析,也適合綜合器普通功效。5VHDL設(shè)計(jì)進(jìn)階第66頁5.3次序語句歸納基于進(jìn)程語句結(jié)構(gòu)次序語句使用特點(diǎn)歸納在一個(gè)結(jié)構(gòu)體中,允許放置任意多個(gè)進(jìn)程語句結(jié)構(gòu),每一進(jìn)程內(nèi)部由一系列次序語句來組成。PROCESS語句結(jié)構(gòu)包含了一個(gè)代表著設(shè)計(jì)實(shí)體中部分邏輯行為、獨(dú)立次序語句描述進(jìn)程。與并行語句同時(shí)執(zhí)行方式不一樣,次序語句能夠依據(jù)設(shè)計(jì)者要求,利用次序可控語句完成逐條執(zhí)行功效。5VHDL設(shè)計(jì)進(jìn)階第67頁基于進(jìn)程語句結(jié)構(gòu)次序語句使用特點(diǎn)歸納在VHDL中,所謂次序僅是指語句按序執(zhí)行上次序性,但不意味著PROCESS語句結(jié)構(gòu)在綜合后所對(duì)應(yīng)硬件邏輯行為也含有相同次序性。PROCESS結(jié)構(gòu)中次序語句,及其所謂次序執(zhí)行過程只是相對(duì)于計(jì)算機(jī)中HDL行為仿真模擬過程而言。PROCESS過程與硬件結(jié)構(gòu)中實(shí)現(xiàn)對(duì)應(yīng)邏輯行為是不完全相同。語言次序硬件次序5VHDL設(shè)計(jì)進(jìn)階第68頁5.3.1進(jìn)程語句格式

PROCESS語句結(jié)構(gòu)普通表示格式以下

[進(jìn)程標(biāo)號(hào):]PROCESS[(敏感信號(hào)參數(shù)表)][IS][進(jìn)程說明部分]BEGIN

次序描述語句ENDPROCESS[進(jìn)程標(biāo)號(hào)];進(jìn)程標(biāo)號(hào):每一個(gè)PROCESS語句能夠賦予一個(gè)進(jìn)程標(biāo)號(hào)。進(jìn)程說明部分:定義該進(jìn)程所需局部數(shù)據(jù)環(huán)境。次序描述語句:一段次序執(zhí)行語句,描述該進(jìn)程行為。5VHDL設(shè)計(jì)進(jìn)階第69頁次序描述語句:一段次序執(zhí)行語句,描述該進(jìn)程行為。5.3.1進(jìn)程語句格式

PROCESS中要求了每個(gè)進(jìn)程語句在它敏感信號(hào)值改變時(shí)都必須立刻完成某一功效行為。此行為由進(jìn)程語句中次序語句定義,行為結(jié)果能夠賦給信號(hào),并經(jīng)過信號(hào)被其它PROCESS或BLOCK讀取。一個(gè)結(jié)構(gòu)體中能夠含有多個(gè)PROCESS結(jié)構(gòu),每一PROCESS結(jié)構(gòu)對(duì)于其敏感信號(hào)參數(shù)表中定義任一敏感參量改變,能夠在任何時(shí)刻被激活或者開啟。在同一結(jié)構(gòu)體中,全部被激活進(jìn)程都是并行運(yùn)行。PROCESS結(jié)構(gòu)本身是并行語句。5VHDL設(shè)計(jì)進(jìn)階第70頁5.3.2進(jìn)程結(jié)構(gòu)組成(P162)5.3進(jìn)程語句歸納

進(jìn)程說明部分

數(shù)據(jù)類型、常數(shù)、變量、屬性、子程序

賦值語句、進(jìn)程開啟語句、子程序調(diào)用語句、次序描述語句、進(jìn)程跳出語句

次序描述語句部分敏感信號(hào)參數(shù)表5VHDL設(shè)計(jì)進(jìn)階第71頁5.3.3進(jìn)程關(guān)鍵點(diǎn)

對(duì)于VHDL進(jìn)程結(jié)構(gòu),程序設(shè)計(jì)者需從四個(gè)方面判斷其功效和執(zhí)行情況?;谟?jì)算機(jī)純軟件VHDL行為仿真運(yùn)行方式基于VHDL綜合器綜合結(jié)果所可能實(shí)現(xiàn)運(yùn)行方式基于對(duì)綜合結(jié)果時(shí)序仿真波形表達(dá)功效方式基于最終實(shí)現(xiàn)硬件電路運(yùn)行方式對(duì)進(jìn)程認(rèn)識(shí)和進(jìn)行進(jìn)程設(shè)計(jì)需要注意以下六個(gè)方面問題5VHDL設(shè)計(jì)進(jìn)階第72頁5.3.3進(jìn)程關(guān)鍵點(diǎn)

1.

PROCESS為一無限循環(huán)語句

同一結(jié)構(gòu)體中任一進(jìn)程是一個(gè)獨(dú)立無限循環(huán)程序結(jié)構(gòu)。進(jìn)程中無須放置返回語句,結(jié)構(gòu)體是自動(dòng)返回。進(jìn)程只有執(zhí)行狀態(tài)和等候狀態(tài)。滿足特定條件(敏感變量發(fā)生改變),進(jìn)程進(jìn)入執(zhí)行狀態(tài)。當(dāng)碰到ENDPROCESS語句后停頓執(zhí)行,自動(dòng)返回,進(jìn)入等候狀態(tài)5VHDL設(shè)計(jì)進(jìn)階第73頁2.

PROCESS中次序語句含有顯著次序/并行運(yùn)行雙重性

軟件語言中每一條語句執(zhí)行是按CPU及其周期節(jié)拍次序執(zhí)行,每一條語句執(zhí)行時(shí)間是確定,它與CPU主頻頻率、工作方式、狀態(tài)周期、機(jī)器周期及指令周期長短緊密相連。PROCESS中,一個(gè)執(zhí)行狀態(tài)運(yùn)行周期與外部原因無關(guān),甚至與次序語句多少都沒相關(guān)系,其執(zhí)行時(shí)間從行為仿真角度看,只有一個(gè)VHDL模擬器最小分辨時(shí)間;從綜合和硬件運(yùn)行角度看,執(zhí)行時(shí)間是0。同一PROCESS中,10條語句和1000條語句執(zhí)行時(shí)間是一樣,次序語句含有并行執(zhí)行性質(zhì)。5VHDL設(shè)計(jì)進(jìn)階第74頁P(yáng)ROCESS(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中次序語句含有顯著次序/并行運(yùn)行雙重性

若abc=“1110”,執(zhí)行語句WHEN“1110”=>SO<=“100”,無須逐條語句比較。所以執(zhí)行一條語句和執(zhí)行100條語句時(shí)間是一樣。次序語句生成是并行結(jié)構(gòu)組合電路。VHDL語句無法進(jìn)行“單步”調(diào)試,只能經(jīng)過時(shí)序或功效仿真波形,以及生成電路實(shí)測來了解程序功效和可能存在問題。5VHDL設(shè)計(jì)進(jìn)階第75頁3.進(jìn)程語句本身是并行語句同一結(jié)構(gòu)體中不一樣進(jìn)程是并行運(yùn)行,其依據(jù)對(duì)應(yīng)敏感信號(hào)獨(dú)立運(yùn)行。在例5-17中,兩個(gè)進(jìn)程是完全獨(dú)立運(yùn)行,除非兩組敏感信號(hào)中一對(duì)同時(shí)改變,兩進(jìn)程才被同時(shí)開啟。因?yàn)閮蛇M(jìn)程敏感信號(hào)temp改變有先后關(guān)系,使得進(jìn)程開啟含有先后次序關(guān)系。進(jìn)程語句是并行語句,但敏感信號(hào)改變能夠是次序改變,造成執(zhí)行效果為次序執(zhí)行?!纠?-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設(shè)計(jì)進(jìn)階第76頁4.信號(hào)能夠是多個(gè)進(jìn)程間通信線

結(jié)構(gòu)體中多個(gè)進(jìn)程之所以能并行同時(shí)運(yùn)行,一個(gè)很主要原因是進(jìn)程之間通信是經(jīng)過信號(hào)來實(shí)現(xiàn)。信號(hào)對(duì)結(jié)構(gòu)體來說,含有全局特征,它是進(jìn)程間聯(lián)絡(luò)主要路徑。5.一個(gè)進(jìn)程中只允許描述對(duì)應(yīng)于一個(gè)時(shí)鐘信號(hào)同時(shí)時(shí)序邏輯

時(shí)序電路必須由進(jìn)程中不完全條件次序語句描述。同一進(jìn)程中可次序放置多個(gè)條件語句,但推薦只放一個(gè)判斷時(shí)鐘邊緣檢測語句條件語句。一個(gè)進(jìn)程只能描述針對(duì)同一時(shí)鐘同時(shí)時(shí)序邏輯。5VHDL設(shè)計(jì)進(jìn)階第77頁5.4并行賦值語句討論進(jìn)程語句和并行賦值語句執(zhí)行和實(shí)現(xiàn)并非同時(shí)發(fā)生。二者開啟和執(zhí)行情況與敏感信號(hào)(信號(hào))改變親密相關(guān)。任何一條信號(hào)并行賦值語句是縮略進(jìn)程語句。在絕大多數(shù)情況下不能同時(shí)執(zhí)行。DATA1<=AANDB;DATA2<=C;執(zhí)行賦值需要信號(hào)改變,并行賦值語句非同時(shí)執(zhí)行。5VHDL設(shè)計(jì)進(jìn)階第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并行賦值語句討論并行賦值語句包含進(jìn)程次序語句特征。SELECT改變由s0和s1數(shù)值確定。SELECT值確定x賦值源。所以兩并行賦值語句含有次序改變結(jié)構(gòu)。賦值結(jié)果信號(hào)作為另一并行語句判斷控制信號(hào)5VHDL設(shè)計(jì)進(jìn)階第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設(shè)計(jì)進(jìn)階第80頁(1)IF條件句Then

次序語句

ENDIF;

第1種條件語句執(zhí)行情況:首先檢測關(guān)鍵詞IF后條件表示式布爾值是否為真假如為真,THEN將次序執(zhí)行條件句中列出各條語句,直到ENDIF;假如為假,跳過以下次序語句不予執(zhí)行,直接結(jié)束IF語句執(zhí)行。此形式為非完整性條件語句,通慣用于產(chǎn)生時(shí)序電路。5VHDL設(shè)計(jì)進(jìn)階第81頁(2)IF條件句Then次序語句

ELSE

次序語句

ENDIF;

第2種IF語句差異在于那個(gè)所測條件為FALSE時(shí),并不直接跳到ENDIF結(jié)束條件句執(zhí)行。轉(zhuǎn)向ELSE以下另一段次序語句進(jìn)行執(zhí)行。第2種IF語句含有條件分支功效,就是經(jīng)過測定所設(shè)條件真假以決定執(zhí)行哪一組次序語句。執(zhí)行完其中一組語句,再結(jié)束IF語句執(zhí)行,這是一個(gè)完整性條件語句,通慣用于產(chǎn)生組合電路。5VHDL設(shè)計(jì)進(jìn)階第82頁(3)IF條件句ThenIF條件句Then...ENDIFENDIF第3種IF語句是一個(gè)多重IF語句嵌套式條件句,能夠產(chǎn)生比較豐富條件描述。其既能夠產(chǎn)生時(shí)序電路,也能夠產(chǎn)生組合電路,或者二者混合。使用時(shí)需要注意,ENDIF結(jié)束句個(gè)數(shù)應(yīng)該與嵌入條件句數(shù)量一致。5VHDL設(shè)計(jì)進(jìn)階第83頁(4)IF條件句Then

次序語句ELSIF條件句Then次序語句...ELSE

次序語句ENDIF

第4種IF語句與第3種語句一樣,也能夠?qū)崿F(xiàn)不一樣類型電路描述。關(guān)鍵詞ELSIF設(shè)定多個(gè)判定條件,以使次序語句執(zhí)行分支能夠超出兩個(gè)。這一類型語句主要特點(diǎn),是任一分支次序語句執(zhí)行條件是以上各分支所確定條件相與(相關(guān)條件同時(shí)成立),語句中有向上相與功效。5VHDL設(shè)計(jì)進(jìn)階第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是判斷表示式,本條件示例含有兩個(gè)分支。5VHDL設(shè)計(jì)進(jìn)階第85頁5.5IF語句概述

輸入輸出din0din1din2din3din4din5din6din7

output0output1output2xxxxxxx0000xxxxxx01100xxxxx011010xxxx0111110xxx01111001xx011111101x011111101101111111111表5-28線-3線優(yōu)先編碼器真值表

注:表中“x”為任意,類似VHDL中“-”值。

5VHDL設(shè)計(jì)進(jìn)階第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;向上相與,不符合條件轉(zhuǎn)向下一分支??紤]多個(gè)賦值源對(duì)output賦值情況5VHDL設(shè)計(jì)進(jìn)階第87頁5.6半整數(shù)與奇數(shù)分頻電路設(shè)計(jì)在實(shí)用數(shù)字系統(tǒng)設(shè)計(jì)中常需要完成不一樣類型分頻,對(duì)于偶數(shù)次分頻(占空比50%)方法在第3章中已經(jīng)介紹給大家。復(fù)習(xí):占空比為50%偶數(shù)次分頻電路設(shè)計(jì)方法,采取不一樣模計(jì)數(shù)器來實(shí)現(xiàn)。N分頻計(jì)數(shù)模為(N/2-1)。如6分頻電路計(jì)數(shù)模,計(jì)數(shù)次數(shù)為2(6/2-1=2),計(jì)數(shù)內(nèi)容為0、1、2,計(jì)數(shù)周期為3周期,當(dāng)計(jì)數(shù)抵達(dá)2時(shí)即對(duì)輸出端電平進(jìn)行翻轉(zhuǎn)一次。顯然,奇數(shù)次分頻不能采取上述方法得到。下面學(xué)習(xí)奇數(shù)次分頻(占空比50%)方法。5VHDL設(shè)計(jì)進(jìn)階第88頁【例5-21】LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論