版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
EDA項(xiàng)目教程
——基于VHDL與FPGA項(xiàng)目5點(diǎn)陣廣告牌的設(shè)計(jì)與實(shí)現(xiàn)本章要點(diǎn)
分頻器的設(shè)計(jì)
寄存器的設(shè)計(jì)
點(diǎn)陣廣告牌的設(shè)計(jì)與實(shí)現(xiàn)5.1分頻器5.1.12N分頻器2N(N為正整數(shù))分頻器是一種特殊的等占空比分頻器,利用計(jì)數(shù)器計(jì)算時(shí)鐘脈沖的個(gè)數(shù),二進(jìn)制計(jì)數(shù)器的最低位(20)就是時(shí)鐘脈沖的2分頻(一個(gè)時(shí)鐘脈沖有效沿計(jì)為1,下一個(gè)時(shí)鐘脈沖有效沿計(jì)為0,兩個(gè)時(shí)鐘脈沖有效沿構(gòu)成一個(gè)周期)、次低位(21)就是4分頻,依此類推,設(shè)計(jì)非常簡單。1.設(shè)計(jì)題目設(shè)計(jì)一個(gè)可輸出時(shí)鐘脈沖2分頻、4分頻、8分頻和16分頻信號的分頻電路,并使用QuartusⅡ進(jìn)行仿真。2.實(shí)體的確定實(shí)體是設(shè)計(jì)外部電路的輸入輸出端口。根據(jù)設(shè)計(jì)題目分析,應(yīng)該有1個(gè)時(shí)鐘脈沖輸入端和4個(gè)分頻信號輸出端。設(shè)時(shí)鐘脈沖輸入端為CLK,分頻信號輸出端分別為DIV2(2分頻)、DIV4(4分頻)、DIV8(8分頻)和DIV16(16分頻),數(shù)據(jù)類型都可以使用標(biāo)準(zhǔn)邏輯位類型(STD_LOGIC)。實(shí)體名為DIVF。實(shí)體的參考程序如下:ENTITYDIVFISPORT(CLK:INSTD_LOGIC;DIV2,DIV4,DIV8,DIV16:OUTSTD_LOGIC);ENDENTITYDIVF;3.結(jié)構(gòu)體的確定結(jié)構(gòu)體描述設(shè)計(jì)實(shí)體內(nèi)部結(jié)構(gòu)和實(shí)體端口之間的邏輯關(guān)系,是實(shí)體的一個(gè)組成單元。在結(jié)構(gòu)體中設(shè)計(jì)一個(gè)計(jì)數(shù)器,定義一個(gè)四位臨時(shí)信號存儲計(jì)數(shù)值,信號的定義需要放在結(jié)構(gòu)體的聲明部分。參考程序如下:ARCHITECTUREARTOFDIVFISSIGNALQ:STD_LOGIC_VECTOR(4DOWNTO0);--定義臨時(shí)信號QBEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THEN--判斷時(shí)鐘脈沖的上升沿
Q<=Q+1;ENDIF;ENDPROCESS;DIV2<=Q(0);--輸出2分頻信號
DIV4<=Q(1);--輸出4分頻信號
DIV8<=Q(2);--輸出8分頻信號
DIV16<=Q(3);--輸出16分頻信號ENDARCHITECTUREART;4.庫和程序包的確定由于實(shí)體中定義的信號類型不是VHDL默認(rèn)類型,需要調(diào)用IEEE庫中的STD_LOGIC_1164程序包;又由于結(jié)構(gòu)體中使用了運(yùn)算符“+”,需要調(diào)用IEEE庫中的STD_LOGIC_UNSIGNED程序包,因此在實(shí)體的前面調(diào)用IEEE庫,并使用這兩個(gè)程序包。參考程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;5.波形仿真5.1.2偶數(shù)分頻器偶數(shù)分頻器的設(shè)計(jì)非常簡單,通過計(jì)數(shù)器計(jì)數(shù)就完全可以實(shí)現(xiàn)。例如進(jìn)行N(N為偶數(shù))分頻,就可以通過由待分頻的時(shí)鐘脈沖觸發(fā)計(jì)數(shù)器計(jì)數(shù),當(dāng)計(jì)數(shù)器從0計(jì)數(shù)到(N/2)-1時(shí),輸出信號就進(jìn)行翻轉(zhuǎn),形成半個(gè)周期,并給計(jì)數(shù)器清零,以便在下一個(gè)時(shí)鐘脈沖有效沿到來時(shí)從零開始計(jì)數(shù);當(dāng)計(jì)數(shù)器又計(jì)到(N/2)-1時(shí),輸出信號再次翻轉(zhuǎn),形成另半個(gè)周期。以此循環(huán),就可以實(shí)現(xiàn)任意的偶數(shù)分頻。1.設(shè)計(jì)題目設(shè)計(jì)一個(gè)等占空比的六分頻器,并使用QuartusⅡ進(jìn)行仿真。2.實(shí)體的確定根據(jù)題目要求,等占空比的六分頻器應(yīng)該有1個(gè)時(shí)鐘脈沖輸入端、1個(gè)清零端和1個(gè)分頻信號輸出端。設(shè)時(shí)鐘脈沖輸入端為CLK、清零端為RESET、分頻信號輸出端為DIV6,數(shù)據(jù)類型都可以使用標(biāo)準(zhǔn)邏輯位類型(STD_LOGIC)。實(shí)體名為DIVSIX。實(shí)體的參考程序如下:ENTITYDIVSIXISPORT(CLK:INSTD_LOGIC;RESET:INSTD_LOGIC;DIV6:OUTSTD_LOGIC);ENDENTITYDIVSIX;3.結(jié)構(gòu)體的確定
在結(jié)構(gòu)體中設(shè)計(jì)一個(gè)計(jì)數(shù)器,由于是六分頻(N=6),因此(N/2)-1=2,可定義1個(gè)信號count存儲計(jì)數(shù)值;由于輸出方向定義為OUT的信號DIV6不能出現(xiàn)在賦值語句的右側(cè),無法描述觸發(fā)器的計(jì)數(shù)狀態(tài),需要設(shè)置1個(gè)臨時(shí)信號CLKTEP,信號的定義需要放在結(jié)構(gòu)體的聲明部分。3.結(jié)構(gòu)體的確定ARCHITECTUREARTOFdivsixISSIGNALcount:STD_LOGIC_VECTOR(1DOWNTO0);--計(jì)數(shù)值寄存器SIGNALclktemp:STD_LOGIC;--輸出寄存器BEGINPROCESS(RESET,CLK)BEGINIFRESET='1'THEN--異步清零,高電平有效clktemp<='0';ELSIFRISING_EDGE(CLK)THEN--判斷CLK
的上升沿3.結(jié)構(gòu)體的確定IFcount="10"THENcount<="00";--計(jì)數(shù)到(N/2)-1(N=6)就清零clktemp<=NOTclktemp;--輸出信號翻轉(zhuǎn),形成前
半個(gè)周期ELSEcount<=count+1;ENDIF;ENDIF;ENDPROCESS;DIV6<=clktemp;ENDARCHITECTUREART;4.庫和程序包的確定由于實(shí)體中定義的信號類型不是VHDL默認(rèn)類型,需要調(diào)用IEEE庫中的STD_LOGIC_1164程序包;由于結(jié)構(gòu)體中使用了運(yùn)算符“+”,調(diào)用IEEE庫中的STD_LOGIC_UNSIGNED程序包,因此需要在實(shí)體的前面調(diào)用IEEE庫,并使用程序包。參考程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;5.波形仿真5.2寄存器的設(shè)計(jì)
寄存器是具有存儲二進(jìn)制數(shù)據(jù)功能的數(shù)字部件。寄存器分為基本寄存器和移位寄存器兩類,基本寄存器只具有寄存數(shù)據(jù)的功能;移位寄存器除了具有存儲二進(jìn)制數(shù)據(jù)的功能以外,還具有移位功能。移位功能就是指寄存器里面存儲的代碼能夠在時(shí)鐘脈沖的作用下依次左移或右移,可以實(shí)現(xiàn)數(shù)據(jù)的串/并轉(zhuǎn)換和數(shù)值運(yùn)算。
5.2.1數(shù)據(jù)寄存器
1.題目要求利用QuartusⅡ軟件的文本輸入方式,設(shè)計(jì)一個(gè)具有三態(tài)輸出的八位數(shù)碼寄存器,完成編譯和波形仿真后,下載到實(shí)驗(yàn)平臺驗(yàn)證電路功能。
2.電路設(shè)計(jì)設(shè)d為數(shù)據(jù)輸入端、oe為三態(tài)輸出控制端(當(dāng)oe=1時(shí)寄存器輸出為高阻態(tài);oe=0時(shí)為正常輸出狀態(tài))、q為輸出端。LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYregistISPORT(clk,oe:INstd_logic;d:INstd_logic_VECTOR(7DOWNTO0);q:BUFFERstd_logic_VECTOR(7DOWNTO0));ENDregist;ARCHITECTUREAOFregistISSIGNALqtemp:std_logic_VECTOR(7DOWNTO0);BEGINPROCESS(clk,oe)BEGINIFoe='0'THENIFclk'EVENTANDclk='1'THENqtemp<=d;ENDIF;ELSEqtemp<="ZZZZZZZZ";ENDIF;q<=qtemp;ENDPROCESS;ENDA;5.2.2循環(huán)移位寄存器
循環(huán)移位寄存器分為循環(huán)左移和循環(huán)右移兩種,能夠完成數(shù)碼的邏輯運(yùn)算。循環(huán)左移是數(shù)據(jù)由低位向高位移動,移出的高位又從低位端移入該寄存器,變成低位;循環(huán)右移是數(shù)據(jù)由高位向低位移動,移出的低位又從高位端移入該寄存器,變成高位。
1.題目要求利用QuartusⅡ軟件的文本輸入方式,設(shè)計(jì)一個(gè)五位循環(huán)左移寄存器,完成編譯和波形仿真后,下載到實(shí)驗(yàn)平臺驗(yàn)證電路功能。
2.電路設(shè)計(jì)設(shè)時(shí)鐘輸入端為CLK、并行數(shù)據(jù)輸入端為DATA、數(shù)據(jù)加載控制端為LOAD、移位寄存器輸出端為DOUT。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYSHIFTREGISPORT(CLK,LOAD:INSTD_LOGIC;DATA:INSTD_LOGIC_VECTOR(4DOWNTO0);DOUT:BUFFERSTD_LOGIC_VECTOR(4DOWNTO0));ENDSHIFTREG;ARCHITECTUREaOFSHIFTREGISBEGINProcess(CLK)BEGINIFCLK'EVENTANDCLK='1'THENIFLOAD='1'THENDOUT<=DATA;ELSEDOUT(4DOWNTO1)<=DOUT(3DOWNTO0);DOUT(0)<=DOUT(4);ENDIF;ENDIF;ENDPROCESS;ENDa;5.2.3雙向移位寄存器
雙向移位寄存器可以在工作模式控制端的控制下,能夠通過預(yù)置數(shù)據(jù)輸入端輸入并行數(shù)據(jù),還能通過移位數(shù)據(jù)輸入端輸入串行數(shù)據(jù),數(shù)據(jù)能從低位向高位移動,還能從高位移動到低位。
1.題目要求利用QuartusⅡ軟件的文本輸入方式,設(shè)計(jì)一個(gè)五位雙向移位寄存器,完成編譯和波形仿真后,下載到實(shí)驗(yàn)平臺驗(yàn)證電路功能。
2.電路設(shè)計(jì)設(shè)時(shí)鐘輸入端為CLK、預(yù)置數(shù)據(jù)輸入端為PRED、工作模式控制端為M(00是保持、01是右移、10是左移、11是預(yù)置數(shù))、左移數(shù)據(jù)輸入端為DSL、右移數(shù)據(jù)輸入端為DSR、寄存器清零端為RESERT、移位寄存器輸出端為DOUT。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYDREGISPORT(CLK,RESERT,DSL,DSR:INSTD_LOGIC;M:INSTD_LOGIC_VECTOR(1DOWNTO0);PRED:INSTD_LOGIC_VECTOR(4DOWNTO0);DOUT:BUFFERSTD_LOGIC_VECTOR(4DOWNTO0));ENDDREG;ARCHITECTUREaOFDREGISBEGINProcess(CLK,RESERT)BEGINIFCLK'EVENTANDCLK='1'THENIFRESERT='1'THENDOUT<=(OTHERS=>'0');--相當(dāng)于DOUT<=''00000''ELSEIFM(1)='0'THENIFM(0)='0'THENNULL;--NULL為空操作,保持ELSEDOUT<=DSR&DOUT(4DOWNTO1);--數(shù)據(jù)右移ENDIF;ELSIFM(0)='0'THENDOUT<=DOUT(3DOWNTO0)&DSL;--數(shù)據(jù)左移ELSEDOUT<=PRED;--預(yù)置數(shù)ENDIF;ENDIF;ENDIF;ENDPROCESS;ENDa;5.3.1用戶自定義數(shù)據(jù)類型(1)枚舉類型(ENUMERATED)
TYPE數(shù)據(jù)類型名IS(取值1,取值2,…);
這種數(shù)據(jù)類型應(yīng)用廣泛,可以用字符來代替數(shù)字,簡化了邏輯電路中狀態(tài)的表示。例如設(shè)計(jì)描述一周每一天狀態(tài)的邏輯電路時(shí),如果用數(shù)組000代表周一、001代表周二,依此類推,直到110代表周日。但這種表示方法對編寫和閱讀程序來說是不方便的。若改用枚舉數(shù)據(jù)類型表示則方便得多,可以把一個(gè)星期定義成一個(gè)名為week的枚舉數(shù)據(jù)類型:TYPEweekIS(Mon,Tue,Wed,Thu,F(xiàn)ri,Sat,Sun);這樣,周一到周日就可以用Mon到Sun來表示,直觀了很多。5.3.1用戶自定義數(shù)據(jù)類型(2)數(shù)組類型(ARRAY)。TYPE數(shù)據(jù)類型名ISARRAY數(shù)組下標(biāo)范圍OF數(shù)組元素的數(shù)據(jù)類型;STANDARD程序包中預(yù)定義的整數(shù)類型表示范圍是32位有符號的二進(jìn)制數(shù),這么大范圍的數(shù)據(jù)之間的運(yùn)算用硬件實(shí)現(xiàn)起來將消耗極大的資源,而應(yīng)用中涉及的整數(shù)范圍通常很小,例如一個(gè)數(shù)碼管需要顯示的數(shù)據(jù)僅為0~9。由于這個(gè)原因,VHDL使用整數(shù)時(shí),要求用RANGE語句為定義的整數(shù)限定一個(gè)范圍,VHDL綜合器根據(jù)用戶指定的范圍在硬件中將整數(shù)用相應(yīng)的二進(jìn)制數(shù)據(jù)表示。用戶自定義的整數(shù)類型可認(rèn)為是STANDARD程序包中預(yù)定義整數(shù)類型的一個(gè)子類。其格式如下。TYPE整數(shù)類型名ISRANGE約束范圍;例如用戶定義一個(gè)用于數(shù)碼管顯示的數(shù)據(jù)類型,則可定義為:
TYPEdigitISRANGE0TO9;(3)用戶自定義子類型SUBTYPE子數(shù)據(jù)類型名IS數(shù)據(jù)類型名RANGE數(shù)據(jù)范圍;
數(shù)組類型是將相同類型的數(shù)據(jù)集合在一起所形成的數(shù)據(jù)類型,可以是一維的,也可以是多維的。數(shù)組類型定義格式如下:TYPE數(shù)據(jù)類型名ISARRAY數(shù)組下標(biāo)范圍OF數(shù)組元素的數(shù)據(jù)類型;
如果數(shù)據(jù)類型沒有指定,則使用整數(shù)數(shù)據(jù)類型;如果用整數(shù)類型以外的其他類型,則需要在確定數(shù)據(jù)范圍后加上數(shù)據(jù)類型名。例如:TYPEbusISARRAY(15DOWNTO0)OFBIT;數(shù)組名稱為bus,共有16個(gè)元素,下標(biāo)排序是15、14、…、1、0,各元素可分別表示為bus(15)、…、bus(0),數(shù)組類型為BIT。除了一維數(shù)組外,VHDL還可以定義二維、三維數(shù)組,例如定義一個(gè)16字、每字8位的RAM(隨機(jī)存儲器),可以定義為:TYPEram_16_8ISARRAY(0TO15)OFSTD_LOGIC_VECTOR(7DOWNTO0);5.3.1用戶自定義數(shù)據(jù)類型
用戶若對自己定義的數(shù)據(jù)作出一些限制,就形成了原自定義數(shù)據(jù)類型的子類型。對于每一個(gè)類型說明都定義了一個(gè)范圍,一個(gè)類型說明與其他類型說明所定義的范圍可以是不同的,在用VHDL對硬件描述時(shí),有時(shí)一個(gè)對象可能取值的范圍是某個(gè)類型定義范圍的子集,這時(shí)就要用到子類型的概念。子類型的格式如下:SUBTYPE子數(shù)據(jù)類型名IS數(shù)據(jù)類型名RANGE數(shù)據(jù)范圍;例如:在STD_LOGIC_VECTOR數(shù)據(jù)類型上所形成的子類型:SUBTYPEiobusISSTD_LOGIC_VECTOR(4DOWNTO0);
子類型可以對原數(shù)據(jù)類型指定范圍而形成,也可以完全和原數(shù)據(jù)類型范圍一致。子類型常用于存儲器陣列等的數(shù)組描述場合。5.3.2數(shù)據(jù)類型間的轉(zhuǎn)換程序包名稱函數(shù)名稱功能STD_LOGIC_1164TO_BIT由STD_LOGIC轉(zhuǎn)換為BITTO_BITVECTOR由STD_LOGIC_VECTOR轉(zhuǎn)換為BIT_VECTORTO_STDLOGIC由BIT轉(zhuǎn)換為STD_LOGICTO_STDLOGICVECTER由BIT_VECTOR轉(zhuǎn)換為STD_LOGIC_VECOTRSTD_LOGIC_ARITHCONV_INTEGER由UNSIGNED,SIGNED轉(zhuǎn)換為INTEGERCONV_UNSIGNED由SIGNED,INTEGER轉(zhuǎn)換為UNSIGNEDCONV_STD_LOGIC_VECTOR由INTEGER,UNSDGNED,SIGNED類型轉(zhuǎn)換為
STD_LOGIC_VECTORSTD_LOGIC_UNSIGNEDCONV_INTEGER由STD_LOGIC_VECTOR轉(zhuǎn)換為INTEGER5.3.2數(shù)據(jù)類型間的轉(zhuǎn)換例如:把INTEGER數(shù)據(jù)類型的信號A轉(zhuǎn)換為STD_LOGIC_VECTOR數(shù)據(jù)類型的信號B,程序如下:SIGNALA:INTEGERRANGER0TO15;--定義信號ASIGNALB:STD_LOGIC_VECTOR(3DOWNTO0);--定義信號BB<=CONV_STD_LOGIC_VECTOR(A);--調(diào)用轉(zhuǎn)換函數(shù)注意:使用數(shù)據(jù)類型轉(zhuǎn)換函CONV_STD_LOGIC_VECTOR,需要調(diào)用IEEE庫中的STD_LOGIC_ARITH程序包。5.3.3元件例化語句1.元件聲明語句(COMPONENT)格式如下:COMPONENT元件名
PORT元件端口說明(與該元件源程序?qū)嶓w中的PORT部分相同)ENDCOMPONENT;2.元件例化語句(PORTMAP)格式如下:例化名:元件名PORTMAP(元件端口對應(yīng)關(guān)系列表);信號之間有位置映射和名稱映射兩種映射(關(guān)聯(lián))方式:(1)位置映射。就是被調(diào)用元件端口說明中信號的書寫順序及位置和PORTMAP語句中實(shí)際信號的書寫順序及位置一一對應(yīng)。例如某元件的端口說明為:PORT(a,b:INBIT;c:OUTBIT);調(diào)用該元件時(shí)可使用:com1:u1PORTMAP(n1,n2,m);顯然n1對應(yīng)a,n2對應(yīng)b,m對應(yīng)c,com1是例化名,u1是元件名。(2)名稱映射。就是將庫中已有的模塊的端口名稱賦予設(shè)計(jì)中的信號名。上例可改為:com1:u1PORTMAP(a=>n1,b=>n2,c=>m);用元件例化語句
實(shí)現(xiàn)4位移位寄存器的設(shè)計(jì)根據(jù)題目要求,調(diào)用D觸發(fā)器模塊dff,并使用元件例化語句設(shè)計(jì)的程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYshiftISPORT(DIN:INSTD_LOGIC;CP:INSTD_LOGIC;DOUT:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDshift;ARCHITECTUREstrOFshiftISCOMPONENTdff--元件聲明語句PORT(D:INSTD_LOGIC;CLK:INSTD_LOGIC;Q:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALq:STD_LOGIC_VECTOR(4DOWNTO0);BEGINq(0)<=DIN;dff1:dffPORTMAP(q(0),CP,q(1));--位置映射dff2:dffPORTMAP(q(1),CP,q(2));dff3:dffPORTMAP(D=>q(2),CLK=>CP,Q=>q(3));--名稱映射dff4:dffPORTMAP(D=>q(3),CLK=>CP,Q=>q(4));DOUT<=q(4DOWNTO1);ENDstr;4位移位寄存器仿真波形
從仿真波形中可以看出,在0~50ns區(qū)間,DIN=1,在CP(時(shí)鐘)上升沿,DOUT=0001(移入數(shù)據(jù)“1”);在50~100ns區(qū)間,DIN=1,在CP上升沿,DOUT=0011(再次移入數(shù)據(jù)“1”)。其他區(qū)間的波形情況符合4位移位寄存器。5.3.4生成語句1.FOR工作模式的生成語句FOR工作模式常常用來進(jìn)行
重復(fù)結(jié)構(gòu)的描述,格式如下:[生成標(biāo)號:]FOR循環(huán)變量IN取值范圍GENERATE并行語句;ENDGENERATE[生成標(biāo)號];2.IF工作模式的生成語句IF工作模式的生成語句常用來
描述帶有條件選擇的結(jié)構(gòu)。格式如下:[生成標(biāo)號:]IF條件GENERATE并行語句;ENDGENERATE[生成標(biāo)號];LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYshiftforISPORT(DIN:INSTD_LOGIC;CP:INSTD_LOGIC;DOUT:OUTSTD_LOGIC_VECTOR(5DOWNTO0));ENDshiftfor;用FOR工作模式生成語句描述6位移位寄存器ARCHITECTUREstrOFshiftforISCOMPONENTdff--元件聲明語句PORT(D:INSTD_LOGIC;CLK:INSTD_LOGIC;Q:OUTSTD_LOGIC);ENDCOMPONENT;SIGNALq:STD_LOGIC_VECTOR(6DOWNTO0);BEGINq(0)<=DIN;reg1:FORiIN0TO5GENERATE--FOR工作模式
生成語句dffx:dffPORTMAP(q(i),cp,q(i+1));--元件例化語句ENDGENERATEreg1;DOUT<=q(6DOWNTO1);ENDstr;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYshift1ISPORT(d1:INSTD_LOGIC;cp:INSTD_LOGIC;d0:OUTSTD_LOGIC);ENDshift1;ARCHITECTUREstrOFshift1IS
COMPONENTdffPORT(d:INSTD_LOGIC;
clk:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDCOMPONENT;用FOR和IF工作模式的生成語句描述8位移位寄存器SIGNALq:STD_LOGIC_VECTOR(7DOWNTO1);BEGINreg:FORiIN0TO7GENERATE--FOR工作模式生成語句g1:IFi=0GENERATE--IF工作模式生成語句dffx:dffPORTMAP(d1,cp,q(i+1));ENDGENERATE;g2:IFi=7GENERATEdffx:dffPORTMAP(q(i),cp,d0);ENDGENERATE;g3:IF((i/=0)AND(i/=7))GENERATE--IF語句
描述規(guī)則部分dffx:dffPORTMAP(q(i),cp,q(i+1));ENDGENERATE;ENDGENERATEreg;ENDstr;5.4.1LED點(diǎn)陣8行8列的LED點(diǎn)陣具有64個(gè)像素點(diǎn),可以顯示數(shù)字和一些比較簡單的漢字。內(nèi)部結(jié)構(gòu)上由64個(gè)發(fā)光二極管組成,每個(gè)發(fā)光二極管是放置在行線和列線的交叉點(diǎn)上。5.4點(diǎn)陣顯示的設(shè)計(jì)使用1088AS(共陰極)點(diǎn)陣的某一行,設(shè)計(jì)并實(shí)現(xiàn)一個(gè)能夠異步復(fù)位的8路彩燈控制器,要求彩燈按照4種自動循環(huán)變化的花型閃爍。1.實(shí)體的確定分析設(shè)計(jì)題目,應(yīng)該有1個(gè)時(shí)鐘脈沖輸入端、1個(gè)異步清零端和8個(gè)信號輸出端。設(shè)時(shí)鐘脈沖輸入端為CLK、異步復(fù)位端為CLR;輸出端口為LED。實(shí)體名為ledctrl。參考程序如下:ENTITYledctrlISPORT(CLKIN:INSTD_LOGIC;CLR:INSTD_LOGIC;LED:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDENTITYledctrl;5.4.2彩燈控制器2.結(jié)構(gòu)體的確定在結(jié)構(gòu)體中定義4個(gè)常量(F1、F2、F3、F4),代表4種花型;自定義只有5種取值的枚舉數(shù)組類型(STATE),用于記錄當(dāng)前的4種花型和1個(gè)高阻狀態(tài)(復(fù)位狀態(tài)),使用狀態(tài)驅(qū)動,即用CASE語句判斷“當(dāng)前狀態(tài)”并運(yùn)行相應(yīng)語句(某個(gè)花型),然后再將下一個(gè)狀態(tài)賦值給“當(dāng)前狀態(tài)”;運(yùn)行下一個(gè)狀態(tài)對應(yīng)的語句(另一個(gè)花型),再改變“當(dāng)前狀態(tài)”,利用狀態(tài)的變化驅(qū)動程序不斷運(yùn)行。參考程序如下:ARCHITECTUREARTOFledctrlISTYPESTATEIS(S0,S1,S2,S3,S4);--自定義枚舉數(shù)組類型STATESIGNALCURRSTATE:STATE;--定義STATE類型信號CURRSTATESIGNALFLOWER:STD_LOGIC_VECTOR(7DOWNTO0);BEGINPROCESS(CLR,CLKIN)ISCONSTANTF1:STD_LOGIC_VECTOR(7DOWNTO0):="01010101";--定義花型1CONSTANTF2:STD_LOGIC_VECTOR(7DOWNTO0):="00100100";--定義花型2CONSTANTF3:STD_LOGIC_VECTOR(7DOWNTO0):="11001100";--定義花型3CONSTANTF4:STD_LOGIC_VECTOR(7DOWNTO0):="11100010";--定義花型4BEGINIFCLR='1'THENCURRSTATE<=S0;--狀態(tài)S0ELSIFRISING_EDGE(CLKIN)THENCASECURRSTATEISWHENS0=>--CURRSTATE=S0時(shí),執(zhí)行的語句FLOWER<="000000000000";CURRSTATE<=S1;--將CURRSTATE改為S1WHENS1=>FLOWER<=F1;--CURRSTATE=S1時(shí),執(zhí)行的語句CURRSTATE<=S2;--將CURRSTATE改為S2WHENS2=>FLOWER<=F2;CURRSTATE<=S3;WHENS3=>FLOWER<=F3;CURRSTATE<=S4;WHENS4=>FLOWER<=F4;CURRSTATE<=S1;--將CURRSTATE改為S1,實(shí)現(xiàn)循環(huán)運(yùn)行ENDCASE;ENDIF;ENDPROCESS;LED<=FLOWER;ENDARCHITECTUREART;從仿真波形中可以看出,在0~50ns區(qū)間,CLR=1(異步復(fù)位有效),LED=00000000;在50~200ns區(qū)間,LED=00000000(狀態(tài)S0);在250~350ns區(qū)間,LED=01010101(狀態(tài)S1);在350~450ns區(qū)間,LED=001001001(狀態(tài)S2)。其他區(qū)間的波形情況符合題意。想一想、做一做:改成按列顯示,如何修改程序?彩燈控制器的仿真波形LED點(diǎn)陣可以顯示漢字或字符,只是此時(shí)的漢字或字符應(yīng)以點(diǎn)陣來表示,取點(diǎn)越多,漢字或字符越逼真,通常8行8列的點(diǎn)陣可以用來顯示一些簡單的漢字。把要顯示的漢字用8位的二進(jìn)制代碼(對應(yīng)點(diǎn)陣的行或列)來表示,這一過程稱為取字模。
例如漢字“電”的十六進(jìn)制字模為:10、7C、54、7C、54、7C、12、1E,其中“1”表示該點(diǎn)發(fā)光,“0”表示該點(diǎn)不發(fā)光。將字模賦值給點(diǎn)陣的每一列,在程序中采用逐行掃描的方法掃描點(diǎn)陣的每一行,使之輪流為低電平,于是每列字模的相應(yīng)點(diǎn)被點(diǎn)亮。雖然漢字是逐行顯示的,但由于人眼的視覺暫留,且只要掃描速度足夠快,看到的還將是一個(gè)完整的漢字。
使用1088AS(共陰極)點(diǎn)陣設(shè)計(jì)并實(shí)現(xiàn)一個(gè)顯示漢字“電”的電路,要求顯示穩(wěn)定、筆畫完整。5.4.3漢字的顯示
分析設(shè)計(jì)題目,點(diǎn)陣漢字的顯示是多行、多列的顯示,相當(dāng)于數(shù)碼管的動態(tài)顯示。應(yīng)該有1個(gè)時(shí)鐘脈沖輸入端、1個(gè)異步清零端、8個(gè)行信號輸出端和8個(gè)列信號輸出端。設(shè)時(shí)鐘脈沖輸入端為CLKIN、異步復(fù)位端為CLR;行信號輸出端口為ROLED、列信號輸出端口為COLED。文件名為ledword。參考程序如下:ENTITYledwordISPORT(CLKIN:INSTD_LOGIC;CLR:INSTD_LOGIC;ROLED,LEDCO:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDENTITYledword;1.實(shí)體的確定
在結(jié)構(gòu)體中定義8個(gè)常量(F0~F7),代表漢字字模;自定義只有9種取值的枚舉數(shù)組類型(STATE),用于記錄當(dāng)前的漢字字模和1個(gè)高阻狀態(tài)(復(fù)位狀態(tài))。字模賦值給行信號,列信號(低電平)決定顯示字模某列。同樣使用狀態(tài)驅(qū)動。參考程序如下:ARCHITECTUREARTOFledwordISTYPESTATEIS(S0,S1,S2,S3,S4,S5,S6,S7,S8);SIGNALCURRSTATE:STATE;SIGNALtmproled,tmpledco:STD_LOGIC_VECTOR(7DOWNTO0);BEGINPROCESS(CLR,CLKIN)IS2.結(jié)構(gòu)體的確定CONSTANTF0:STD_LOGIC_VECTOR(7DOWNTO0):="00010000";CONSTANTF1:STD_LOGIC_VECTOR(7DOWNTO0):="01111100";CONSTANTF2:STD_LOGIC_VECTOR(7DOWNTO0):="01010100";CONSTANTF3:STD_LOGIC_VECTOR(7DOWNTO0):="01111100";CONSTANTF4:STD_LOGIC_VECTOR(7DOWNTO0):="01010100";CONSTANTF5:STD_LOGIC_VECTOR(7DOWNTO0):="01111100";CONSTANTF6:STD_LOGIC_VECTOR(7DOWNTO0):="00010010";CONSTANTF7:STD_LOGIC_VECTOR(7DOWNTO0):="00011110";
BEGINIFCLR='1'THENCURRSTATE<=S0;tmpledco<="11111111";ELSIFRISING_EDGE(CLKIN)THENCASECURRSTATEISWHENS0=>tmproled<="00000000";CURRSTATE<=S1;WHENS1=>tmpledco<=F0;tmproled<="01111111";CURRSTATE<=S2;WHENS2=>tmpledco<=F1;tmproled<="10111111";CURRSTATE<=S3;WHENS3=>tmpledco<=F2;tmproled<="11011111";CURRSTATE<=S4;WHENS4=>tmpledco<=F3;tmproled<="11101111";CURRSTATE<=S5;WHENS5=>tmpledco<=F4;tmproled<="11110111";CURRSTATE<=S6;WHENS6=>tmpledco<=F5;tmproled<="11111011";CURRSTATE<=S7;WHENS7=>tmpledco<=F6;tmproled<="11111101";CURRSTATE<=S8;WHENS8=>tmpledco<=F7;tmproled<="11111110";CURRSTATE<=S1;ENDCASE;ENDIF;ENDPROCESS;ROLED<=tmproled;LEDCO<=tmpledco;ENDARCHITECTUREART;
由于實(shí)體中定義的STD_LOGIC信號類型不是VHDL默認(rèn)類型,需要調(diào)用IEEE庫中的STD_LOGIC_1164程序包,因此需要在實(shí)體的前面調(diào)用IEEE庫,并使用該程序包。參考程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;3.庫和程序包的確定從仿真波形中可以看出,在0~50ns區(qū)間,CLR=1(異步復(fù)位有效),LEDCO=FF、ROLED=00000000(狀態(tài)S0);在150ns處,CLKIN上升沿右側(cè),LEDCO=10、ROLED=01111111(狀態(tài)S1)。其他區(qū)間的波形情況符合題意。漢字顯示控制的仿真波形
使用1088AS(共陰極)點(diǎn)陣設(shè)計(jì)并實(shí)現(xiàn)漢字“電”的滾動顯示。要求:能夠異步復(fù)位、漢字從下到上循環(huán)滾動顯示。
把所有需顯示的漢字或字符的字模從上往下依次排好,一方面用足夠快的速度(即滿足視覺暫留的頻率)從上往下掃描整個(gè)點(diǎn)陣,顯示該時(shí)刻所掃描的漢字或字符,即顯示一個(gè)完整“畫面”;另外,用一個(gè)較慢的速度每次從下往上移動一行,即將“畫面”的首行移出,補(bǔ)充到“畫面”的末行,這時(shí)將顯示上方缺少首行、下方多個(gè)首行的“畫面”。不斷重復(fù),視覺看上去就是滾動的效果了。5.4.4漢字的滾動顯示
分析設(shè)計(jì)題目,與漢字顯示相同,應(yīng)該有1個(gè)時(shí)鐘脈沖輸入端、1個(gè)異步清零端、8個(gè)行信號輸出端和8個(gè)列信號輸出端。設(shè)時(shí)鐘脈沖輸入端為CLK、異步復(fù)位端為CLR;行信號輸出端口為ROLED、列信號輸出端口為COLED。文件名為rollword。參考程序如下:ENTITYrollwordISPORT(CLK:INSTD_LOGIC;CLR:INSTD_LOGIC;ROLED,LEDCO:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDENTITYrollword;1.實(shí)體的確定結(jié)構(gòu)體中定義4個(gè)進(jìn)程:復(fù)位和慢速信號產(chǎn)生進(jìn)程、穩(wěn)定“畫面”顯示進(jìn)程、行掃描進(jìn)程、行遞增計(jì)數(shù)進(jìn)程,其中行遞增計(jì)數(shù)進(jìn)程由慢速信號驅(qū)動,用于滾動“畫面”;其他進(jìn)程由快速時(shí)鐘驅(qū)動,用于顯示穩(wěn)定“畫面”。參考程序如下:ARCHITECTUREARTOFrollwordISSIGNALtmproled,tmpledco:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALrow,col,count:STD_LOGIC_VECTOR(2DOWNTO0);SIGNALCLKLOW:STD_LOGIC;BEGIN2.結(jié)構(gòu)體的確定p0:PROCESS(CLR,CLK)IS--復(fù)位和慢速信號產(chǎn)生進(jìn)程VARIABLEcnt:STD_LOGIC_VECTOR(9DOWNTO0);BEGINIFCLR='1'THENcnt:=(OTHERS=>'0'); col<="000";row<="000"; ELSIFRISING_EDGE(CLK)THEN cnt:=cnt+1;col<=col+1;row<=row+1; ENDIF; CLKLOW<=cnt(9);--慢速信號 ENDPROCESSp0;p1:PROCESS(CLK)IS--穩(wěn)定“畫面”顯示進(jìn)程CONSTANTF0:STD_LOGIC_VECTOR(7DOWNTO0):="00010000";CONSTANTF1:STD_LOGIC_VECTOR(7DOWNTO0):="01111100";CONSTANTF2:STD_LOGIC_VECTOR(7DOWNTO0):="01010100";CONSTANTF3:STD_LOGIC_VECTOR(7DOWNTO0):="01111100";CONSTANTF4:STD_LOGIC_VECTOR(7DOWNTO0):="01010100";CONSTANTF5:STD_LOGIC_VECTOR(7DOWNTO0):="01111100";CONSTANTF6:STD_LOGIC_VECTOR(7DOWNTO0):="00010010";CONSTANTF7:STD_LOGIC_VECTOR(7DOWNTO0):="00011110";VARIABLEtempcnt:STD_LOGIC_VECTOR(2DOWNTO0); BEGINIFRISING_EDGE(CLK)THEN tempcnt:=count+col;CASEtempcntISWHEN"000"=>tmpledco<=F0;WHEN"001"=>tmpledco<=F1;WHEN"010"=>tmpledco<=F2;WHEN"011"=>tmpledco<=F3;WHEN"100"=>tmpledco<=F4;WHEN"101"=>tmpledco<=F5;WHEN"110"=>tmpledco<=F6; WHEN"111"=>tmpledco<=F7;WHENOTHERS=>tmpledco<="00000000";ENDCASE; ENDIF;ENDPROCESSp1;p2:PROCESS(CLK)IS--行掃描進(jìn)程BEGINIFRISING_EDGE(CLK)THENCASErowISWHEN"000"=>tmproled<="01111111";WHEN"001"=>tmproled<="10111111";WHEN"010"=>tmproled<="11011111";WHEN"011"=>tmproled<="11101111";WHEN"100"=>tmproled<="11110111";WHEN"101"=>tmproled<="11111011";WHEN"110"=>tmproled<="11111101"; WHEN"111"=>tmproled<="11111110";WHENOTHERS=>tmpledco<="11111111";ENDCASE; ENDIF;ENDPROCESSp2;P3:PROCESS(CLR,CLKLOW)IS--行遞增計(jì)數(shù)進(jìn)程VARIABLEcnt1:STD_LOGIC_VECTOR(2DOWNTO0);BEGINIFCLR='1'THENcnt1:=(OTHERS=>'0');ELSIFRISING_EDGE(CLKLOW)THENcnt1:=cnt1+1;ENDIF;count<=cnt1;ENDPROCESSp3;ROLED<=tmproled;LEDCO<=tmpledco;ENDARCHITECTUREART;由于實(shí)體中定義了STD_LOGIC信號類型,需要調(diào)用IEEE庫中的STD_LOGIC_1164程序包;又由于結(jié)構(gòu)體中使用了運(yùn)算符“+”,需要調(diào)用IEEE庫中的STD_LOGIC_UNSIGNED程序包。參考程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;3.庫和程序包的確定1.題目說明使用1088AS(共陰極)點(diǎn)陣設(shè)計(jì)并實(shí)現(xiàn)“I?電子”的滾動顯示,廣告牌的效果。要求:能夠異步復(fù)位,字符、圖案和漢字從右向左循環(huán)滾動顯示。5.5實(shí)訓(xùn):點(diǎn)陣廣告牌的設(shè)計(jì)與實(shí)現(xiàn)2.設(shè)計(jì)提示
參考“漢字滾動顯示”程序,把所有需顯示的字符、圖案和漢字的字模從右向左依次排好,一方面用1KHz的頻率(即滿足視覺暫留的頻率)從右向左掃描整個(gè)點(diǎn)陣,顯示該時(shí)刻所掃描的字符,即顯示一個(gè)“畫面”;另外,用一個(gè)較慢的速度每次從右向左移動一列,即將“畫面”的首列移出,補(bǔ)充到字模隊(duì)列的最后列,視覺看上去就是從右向左滾動的效果。3.實(shí)訓(xùn)報(bào)告(1)記錄并分析仿真波形。(2)分析實(shí)訓(xùn)結(jié)果。(3)若設(shè)置快、慢兩種滾動速度,應(yīng)如何修改程序?EDA項(xiàng)目教程
——基于VHDL與FPGA項(xiàng)目6信號發(fā)生器的設(shè)計(jì)與實(shí)現(xiàn)本章要點(diǎn)
子程序和LOOP語句
存儲器的設(shè)計(jì)
信號發(fā)生器的設(shè)計(jì)與實(shí)現(xiàn)
6.1
子程序和LOOP語句
子程序是由一組順序語句組成的,在程序包或結(jié)構(gòu)體內(nèi)定義,在結(jié)構(gòu)體或進(jìn)程中調(diào)用。子程序只有定義后才能被調(diào)用,將處理結(jié)果返回給主程序,主程序和子程序之間通過端口參數(shù)關(guān)聯(lián)進(jìn)行數(shù)據(jù)傳送,可以被多次調(diào)用以便完成重復(fù)性的任務(wù)。每次調(diào)用時(shí),都要先對子程序進(jìn)行初始化,一次執(zhí)行結(jié)束后再次調(diào)用需再次初始化,因此子程序內(nèi)部定義的變量都是局部量。雖然子程序可以被多次調(diào)用完成重復(fù)性的任務(wù),但從硬件角度看,EDA軟件的綜合工具對每次調(diào)用的子程序都要生成一個(gè)電路邏輯模塊,因此設(shè)計(jì)者在頻繁調(diào)用子程序時(shí)需要考慮硬件的承受能力。VHDL中的子程序有兩種類型:過程和函數(shù)。過程和函數(shù)的區(qū)別主要是返回值和參數(shù)不同,過程調(diào)用可以通過其接口返回多個(gè)值,函數(shù)只能返回單個(gè)值;過程可以有輸入?yún)?shù)、輸出參數(shù)和雙向參數(shù),函數(shù)的所有參數(shù)都是輸入?yún)?shù)。6.1.1子程序1.過程(PROCEDURE)過程的定義語句由兩部分組成,即過程首和過程體。過程定義的格式為:PROCEDURE過程名參數(shù)列表--過程首PROCEDURE過程名參數(shù)列表IS--過程體說明部分;BEGIN順序語句;END過程名;調(diào)用過程語句的格式為:過程名參數(shù)列表;LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYpsumISPORT(a,b,c:INSTD_LOGIC_VECTOR(3DOWNTO0);clk,clr:INSTD_LOGIC;--clr為復(fù)位端,
高電平有效SUM:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDpsum;用一個(gè)過程語句來實(shí)現(xiàn)3個(gè)4位二進(jìn)制數(shù)據(jù)求和的運(yùn)算程序ARCHITECTUREaOFpsumISPROCEDUREadd1(data,datb,datc:INSTD_LOGIC_VECTOR;--定義過程體datout:OUTSTD_LOGIC_VECTOR)ISBEGINdatout:=data+datb+datc;--數(shù)據(jù)求和ENDadd1;--過程體定義結(jié)束。
在結(jié)構(gòu)體中省略了過程首BEGIN--結(jié)構(gòu)體開始PROCESS(clk)VARIABLEtmp:STD_LOGIC_VECTOR(3DOWNTO0);BEGIN--進(jìn)程開始IF(clk'EVENTANDclk='1')THENIF(clr='1')THEN--高電平
同步復(fù)位tmp:="0000";ELSEadd1(a,b,c,tmp);--過程調(diào)用ENDIF;ENDIF;SUM<=tmp;ENDPROCESS;ENDa;
從仿真波形中可以看出,在0~50ns區(qū)間,CLR=1(同步復(fù)位有效),SUM=0000;在50~100ns區(qū)間,clk上升沿的左側(cè)(觀察輸入信號),a=0001、b=0100、c=0010,clk上升沿的右側(cè)(觀察輸出信號),SUM=0111;在350~400ns區(qū)間,clk上升沿的左側(cè),a=0111、b=0111、c=0011,clk上升沿的右側(cè),SUM=0001(數(shù)據(jù)溢出)。其他區(qū)間的波形情況符合題意。想一想、做一做:如何解決數(shù)據(jù)溢出的問題?求和運(yùn)算程序的仿真波形
在VHDL中,用戶可以自己定義一個(gè)程序包,將一些數(shù)據(jù)類型、子程序和元件保存在該程序包中,以便被其他設(shè)計(jì)程序所利用。程序包分為包首和包體兩部分,格式如下。(1)包首:PACKAGE程序包名稱IS
包首說明;END程序包名稱;(2)包體:PACKAGEBODY程序包名稱IS
包體說明語句組,END程序包名稱;
說明:包首說明部分可定義函數(shù)、元件和子程序等。包體說明語句組部分是具體描述函數(shù)、元件和子程序的內(nèi)容。在程序包結(jié)構(gòu)中,如果在包首中定義了函數(shù)、元件和子程序的具體內(nèi)容,這時(shí)包體可以缺省。2.程序包3.函數(shù)(FUNCTION)函數(shù)語句分為兩個(gè)部分:函數(shù)首和函數(shù)體。在進(jìn)程
和結(jié)構(gòu)體中,函數(shù)首可以省略,而在程序包中,必須定義函數(shù)首,放在程序包的包首部分,而函
數(shù)體放在包體部分。格式如下:FUNCTION函數(shù)名(參數(shù)列表)--函數(shù)首
RETURN數(shù)據(jù)類型名;FUNCTION函數(shù)名(參數(shù)列表)--函數(shù)體
RETURN數(shù)據(jù)類型名IS
說明部分;
BEGIN
順序語句;
RETURN返回變量;
END函數(shù)名;調(diào)用函數(shù)語句的格式為:y<=函數(shù)名(參數(shù)列表);
編寫一個(gè)能輸出2個(gè)4位二進(jìn)制數(shù)中較大數(shù)的函數(shù),并將這段函數(shù)放在一個(gè)程序包中,然后在進(jìn)程中調(diào)用該函數(shù)兩次,輸出3個(gè)4位二進(jìn)制數(shù)中的最大數(shù)。(1)在名稱為blockA的程序包中,定義函數(shù)名稱為maxA的函數(shù),程序包文件名為blockA.vhd。由于本題需要調(diào)用程序包中定義的函數(shù),可先建立一個(gè)文件夾,打開QuartusⅡ軟件建立一個(gè)項(xiàng)目,項(xiàng)目名為smax,再編輯以下程序:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEblockAIS--定義程序包的包頭,blockA是程序包名FUNCTIONmaxA(a:STD_LOGIC_VECTOR;--定義函數(shù)首,函數(shù)名是maxAb:STD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTOR;--定義函數(shù)返回值的類型ENDblockA;PACKAGEBODYblockAIS--定義程序包體FUNCTIONmaxA(a:STD_LOGIC_VECTOR;--定義函數(shù)體b:STD_LOGIC_VECTOR)RETURNSTD_LOGIC_VECTORISVARIABLEtmp:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIF(a>b)THENtmp:=a;ELSEtmp:=b;ENDIF;RETURNtmp;--tmp是函數(shù)返回變量ENDmaxA;--函數(shù)體結(jié)束ENDblockA;注意:編輯完成后,不用編譯,直接使用文件名blockA保存在當(dāng)前文件夾下,以供主程序調(diào)用。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;LIBRARYWORK;--WORK是用戶工作庫USEWORK.blockA.ALL;--使用WORK庫中的blockA程序包ENTITYsmaxISPORT(dc,da,db:INSTD_LOGIC_VECTOR(3DOWNTO0);clk,clr:INSTD_LOGIC;D:OUTSTD_LOGIC_VECTOR(3DOWNTO0));ENDsmax;(2)調(diào)用函數(shù)maxA的程序,文件名是smax.vhdARCHITECTUREaOFsmaxISBEGINPROCESS(clk)VARIABLEtmp:STD_LOGIC_VECTOR(3DOWNTO0);VARIABLEtmpmax:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIF(clk'EVENTANDclk='1')THENIF(clr='1')THENtmpmax:="ZZZZ";ELSEtmp:=maxA(da,db);--調(diào)用函數(shù),最大值放入tmp中tmpmax:=maxA(dc,tmp);ENDIF;ENDIF;D<=tmpmax;ENDPROCESS;ENDa;從仿真波形中可以看出,在0~50ns區(qū)間,CLR=1(同步復(fù)位有效),D=ZZZZ(高阻);在50~100ns區(qū)間,clk上升沿的左側(cè)(觀察輸入信號),da=0001、db=0100、dc=0010,clk上升沿的右側(cè)(觀察輸出信號),D=0100。其他區(qū)間的波形情況符合題意。輸出最大值的仿真波形6.1.2LOOP語句1.FOR循環(huán)FOR循環(huán)是一種已知循環(huán)次數(shù)的語句,其格式如下:[循環(huán)標(biāo)號]:FOR循環(huán)變量IN循環(huán)次數(shù)范圍LOOP順序語句;
ENDLOOP[循環(huán)標(biāo)號];其中,循環(huán)標(biāo)號是用來表示FOR循環(huán)語句的標(biāo)識符,是可選項(xiàng)。循環(huán)次數(shù)范圍表示循環(huán)變量的取值范圍,且在每次循環(huán)中,循環(huán)變量的值都要發(fā)生變化。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYpcISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDpc;用FOR循環(huán)語句描述一個(gè)8位奇校驗(yàn)電路,電路輸入信號為a,輸出信號為yARCHITECTUREoddOFpcISBEGINcbc:PROCESS(a)VARIABLEtmp:STD_LOGIC;--tmp為局部變量,只能在進(jìn)程中定義BEGINtmp:='0';FORiIN0TO7LOOP--循環(huán)變量i由循環(huán)語句自動定義tmp:=tmpXORa(i);ENDLOOP;--缺省了循環(huán)標(biāo)號y<=tmp;ENDPROCESScbc;ENDodd;2.WHILE循環(huán)WHILE循環(huán)是一種未知循環(huán)次數(shù)的語句,循環(huán)次數(shù)取決于條件表達(dá)式是否成立。其格式如下:[循環(huán)標(biāo)號]:WHILE條件表達(dá)式LOOP順序語句;
ENDLOOP[循環(huán)標(biāo)號];循環(huán)標(biāo)號是用來表示W(wǎng)HILE循環(huán)語句的標(biāo)識符,是可選項(xiàng)。在循環(huán)語句中,沒有給出循環(huán)次數(shù)的范圍,而是給出了循環(huán)語句的條件。WHILE后邊的條件表達(dá)式是一個(gè)布爾表達(dá)式,如果條件為TURE,則進(jìn)行循環(huán),如果條件為FALSE,則結(jié)束循環(huán)。用WHILE循環(huán)語句描述8位奇校驗(yàn)電路LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYpcISPORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);y:OUTSTD_LOGIC);ENDpc;ARCHITECTUREaOFpcISBEGINcbc:PROCESS(a)VARIABLEtmp:STD_LOGIC;--tmp為局部變量,只能在進(jìn)程中定義VARIABLEi:INTEGER;--定義循環(huán)變量i,WHILE語句不用自定義BEGINtmp:='0';i:=0;--給循環(huán)變量i賦初值WHILE(i<8)LOOPtmp:=tmpXORa(i);i:=i+1;ENDLOOP;
y<=tmp;ENDPROCESScbc;ENDa;注意:并非所有的EDA綜合器都支持WHILE語句。6.2存儲器
存儲器是數(shù)學(xué)系統(tǒng)的重要組成部分之一,用來存儲程序和數(shù)據(jù),表征系統(tǒng)的“記憶”功能。存儲器屬于通用大規(guī)模器件,一般不需要自行設(shè)計(jì),但是數(shù)字系統(tǒng)有時(shí)需要設(shè)計(jì)一些小型的存儲器件,用于臨時(shí)存放數(shù)據(jù),構(gòu)成查表運(yùn)算的數(shù)據(jù)表等。6.2.1ROMROM(只讀存儲器)是一種只能讀出所存數(shù)據(jù)的存儲器,其特性是一旦儲存資料就無
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年行政合同管理制度解讀與應(yīng)用指南2篇
- 2025年版跨境電商物流配送服務(wù)合同范本4篇
- 二零二五年度軟件開發(fā)項(xiàng)目合同服務(wù)內(nèi)容與職責(zé)
- 2025年度高科技產(chǎn)品銷售合同補(bǔ)充協(xié)議范本
- 2025年度無人駕駛汽車研發(fā)與測試合同范本4篇
- 2025年西藏電子勞動合同推廣與法律風(fēng)險(xiǎn)防范合同3篇
- 二零二五年度花椒種植基地農(nóng)業(yè)觀光旅游發(fā)展規(guī)劃合同3篇
- 二零二五年度酒店客房服務(wù)員雇傭合同范本
- 二零二五年度酒店與客戶2025年酒店住宿優(yōu)惠簽單合同模板
- 二零二五版二婚離婚協(xié)議起草與婚姻終止協(xié)議執(zhí)行合同2篇
- 2023社會責(zé)任報(bào)告培訓(xùn)講稿
- 2023核電廠常規(guī)島及輔助配套設(shè)施建設(shè)施工技術(shù)規(guī)范 第8部分 保溫及油漆
- 2025年蛇年春聯(lián)帶橫批-蛇年對聯(lián)大全新春對聯(lián)集錦
- 表B. 0 .11工程款支付報(bào)審表
- 警務(wù)航空無人機(jī)考試題庫及答案
- 空氣自動站儀器運(yùn)營維護(hù)項(xiàng)目操作說明以及簡單故障處理
- 新生兒窒息復(fù)蘇正壓通氣課件
- 法律顧問投標(biāo)書
- 班主任培訓(xùn)簡報(bào)4篇(一)
- 成都市數(shù)學(xué)八年級上冊期末試卷含答案
- T-CHSA 020-2023 上頜骨缺損手術(shù)功能修復(fù)重建的專家共識
評論
0/150
提交評論