




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
EDA項目教程
——基于VHDL與FPGA主編:于潤偉項目5點陣廣告牌的設計與實現本章要點
分頻器的設計
寄存器的設計
點陣廣告牌的設計與實現5.1分頻器5.1.12N分頻器2N(N為正整數)分頻器是一種特殊的等占空比分頻器,利用計數器計算時鐘脈沖的個數,二進制計數器的最低位(20)就是時鐘脈沖的2分頻(一個時鐘脈沖有效沿計為1,下一個時鐘脈沖有效沿計為0,兩個時鐘脈沖有效沿構成一個周期)、次低位(21)就是4分頻,依此類推,設計非常簡單。1.設計題目設計一個可輸出時鐘脈沖2分頻、4分頻、8分頻和16分頻信號的分頻電路,并使用QuartusⅡ進行仿真。2.實體的確定實體是設計外部電路的輸入輸出端口。根據設計題目分析,應該有1個時鐘脈沖輸入端和4個分頻信號輸出端。設時鐘脈沖輸入端為CLK,分頻信號輸出端分別為DIV2(2分頻)、DIV4(4分頻)、DIV8(8分頻)和DIV16(16分頻),數據類型都可以使用標準邏輯位類型(STD_LOGIC)。實體名為DIVF。實體的參考程序如下:ENTITYDIVFISPORT(CLK:INSTD_LOGIC;DIV2,DIV4,DIV8,DIV16:OUTSTD_LOGIC);ENDENTITYDIVF;3.結構體的確定結構體描述設計實體內部結構和實體端口之間的邏輯關系,是實體的一個組成單元。在結構體中設計一個計數器,定義一個四位臨時信號存儲計數值,信號的定義需要放在結構體的聲明部分。參考程序如下:ARCHITECTUREARTOFDIVFISSIGNALQ:STD_LOGIC_VECTOR(4DOWNTO0);--定義臨時信號QBEGINPROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THEN--判斷時鐘脈沖的上升沿
Q<=Q+1;ENDIF;ENDPROCESS;DIV2<=Q(0);--輸出2分頻信號
DIV4<=Q(1);--輸出4分頻信號
DIV8<=Q(2);--輸出8分頻信號
DIV16<=Q(3);--輸出16分頻信號ENDARCHITECTUREART;4.庫和程序包的確定由于實體中定義的信號類型不是VHDL默認類型,需要調用IEEE庫中的STD_LOGIC_1164程序包;又由于結構體中使用了運算符“+”,需要調用IEEE庫中的STD_LOGIC_UNSIGNED程序包,因此在實體的前面調用IEEE庫,并使用這兩個程序包。參考程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;5.波形仿真5.1.2偶數分頻器偶數分頻器的設計非常簡單,通過計數器計數就完全可以實現。例如進行N(N為偶數)分頻,就可以通過由待分頻的時鐘脈沖觸發計數器計數,當計數器從0計數到(N/2)-1時,輸出信號就進行翻轉,形成半個周期,并給計數器清零,以便在下一個時鐘脈沖有效沿到來時從零開始計數;當計數器又計到(N/2)-1時,輸出信號再次翻轉,形成另半個周期。以此循環,就可以實現任意的偶數分頻。1.設計題目設計一個等占空比的六分頻器,并使用QuartusⅡ進行仿真。2.實體的確定根據題目要求,等占空比的六分頻器應該有1個時鐘脈沖輸入端、1個清零端和1個分頻信號輸出端。設時鐘脈沖輸入端為CLK、清零端為RESET、分頻信號輸出端為DIV6,數據類型都可以使用標準邏輯位類型(STD_LOGIC)。實體名為DIVSIX。實體的參考程序如下:ENTITYDIVSIXISPORT(CLK:INSTD_LOGIC;RESET:INSTD_LOGIC;DIV6:OUTSTD_LOGIC);ENDENTITYDIVSIX;3.結構體的確定
在結構體中設計一個計數器,由于是六分頻(N=6),因此(N/2)-1=2,可定義1個信號count存儲計數值;由于輸出方向定義為OUT的信號DIV6不能出現在賦值語句的右側,無法描述觸發器的計數狀態,需要設置1個臨時信號CLKTEP,信號的定義需要放在結構體的聲明部分。3.結構體的確定ARCHITECTUREARTOFdivsixISSIGNALcount:STD_LOGIC_VECTOR(1DOWNTO0);--計數值寄存器SIGNALclktemp:STD_LOGIC;--輸出寄存器BEGINPROCESS(RESET,CLK)BEGINIFRESET='1'THEN--異步清零,高電平有效clktemp<='0';ELSIFRISING_EDGE(CLK)THEN--判斷CLK
的上升沿3.結構體的確定IFcount="10"THENcount<="00";--計數到(N/2)-1(N=6)就清零clktemp<=NOTclktemp;--輸出信號翻轉,形成前
半個周期ELSEcount<=count+1;ENDIF;ENDIF;ENDPROCESS;DIV6<=clktemp;ENDARCHITECTUREART;4.庫和程序包的確定由于實體中定義的信號類型不是VHDL默認類型,需要調用IEEE庫中的STD_LOGIC_1164程序包;由于結構體中使用了運算符“+”,調用IEEE庫中的STD_LOGIC_UNSIGNED程序包,因此需要在實體的前面調用IEEE庫,并使用程序包。參考程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;5.波形仿真5.2寄存器的設計
寄存器是具有存儲二進制數據功能的數字部件。寄存器分為基本寄存器和移位寄存器兩類,基本寄存器只具有寄存數據的功能;移位寄存器除了具有存儲二進制數據的功能以外,還具有移位功能。移位功能就是指寄存器里面存儲的代碼能夠在時鐘脈沖的作用下依次左移或右移,可以實現數據的串/并轉換和數值運算。
5.2.1數據寄存器
1.題目要求利用QuartusⅡ軟件的文本輸入方式,設計一個具有三態輸出的八位數碼寄存器,完成編譯和波形仿真后,下載到實驗平臺驗證電路功能。
2.電路設計設d為數據輸入端、oe為三態輸出控制端(當oe=1時寄存器輸出為高阻態;oe=0時為正常輸出狀態)、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循環移位寄存器
循環移位寄存器分為循環左移和循環右移兩種,能夠完成數碼的邏輯運算。循環左移是數據由低位向高位移動,移出的高位又從低位端移入該寄存器,變成低位;循環右移是數據由高位向低位移動,移出的低位又從高位端移入該寄存器,變成高位。
1.題目要求利用QuartusⅡ軟件的文本輸入方式,設計一個五位循環左移寄存器,完成編譯和波形仿真后,下載到實驗平臺驗證電路功能。
2.電路設計設時鐘輸入端為CLK、并行數據輸入端為DATA、數據加載控制端為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雙向移位寄存器
雙向移位寄存器可以在工作模式控制端的控制下,能夠通過預置數據輸入端輸入并行數據,還能通過移位數據輸入端輸入串行數據,數據能從低位向高位移動,還能從高位移動到低位。
1.題目要求利用QuartusⅡ軟件的文本輸入方式,設計一個五位雙向移位寄存器,完成編譯和波形仿真后,下載到實驗平臺驗證電路功能。
2.電路設計設時鐘輸入端為CLK、預置數據輸入端為PRED、工作模式控制端為M(00是保持、01是右移、10是左移、11是預置數)、左移數據輸入端為DSL、右移數據輸入端為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');--相當于DOUT<=''00000''ELSEIFM(1)='0'THENIFM(0)='0'THENNULL;--NULL為空操作,保持ELSEDOUT<=DSR&DOUT(4DOWNTO1);--數據右移ENDIF;ELSIFM(0)='0'THENDOUT<=DOUT(3DOWNTO0)&DSL;--數據左移ELSEDOUT<=PRED;--預置數ENDIF;ENDIF;ENDIF;ENDPROCESS;ENDa;5.3.1用戶自定義數據類型(1)枚舉類型(ENUMERATED)
TYPE數據類型名IS(取值1,取值2,…);
這種數據類型應用廣泛,可以用字符來代替數字,簡化了邏輯電路中狀態的表示。例如設計描述一周每一天狀態的邏輯電路時,如果用數組000代表周一、001代表周二,依此類推,直到110代表周日。但這種表示方法對編寫和閱讀程序來說是不方便的。若改用枚舉數據類型表示則方便得多,可以把一個星期定義成一個名為week的枚舉數據類型:TYPEweekIS(Mon,Tue,Wed,Thu,Fri,Sat,Sun);這樣,周一到周日就可以用Mon到Sun來表示,直觀了很多。5.3.1用戶自定義數據類型(2)數組類型(ARRAY)。TYPE數據類型名ISARRAY數組下標范圍OF數組元素的數據類型;STANDARD程序包中預定義的整數類型表示范圍是32位有符號的二進制數,這么大范圍的數據之間的運算用硬件實現起來將消耗極大的資源,而應用中涉及的整數范圍通常很小,例如一個數碼管需要顯示的數據僅為0~9。由于這個原因,VHDL使用整數時,要求用RANGE語句為定義的整數限定一個范圍,VHDL綜合器根據用戶指定的范圍在硬件中將整數用相應的二進制數據表示。用戶自定義的整數類型可認為是STANDARD程序包中預定義整數類型的一個子類。其格式如下。TYPE整數類型名ISRANGE約束范圍;例如用戶定義一個用于數碼管顯示的數據類型,則可定義為:
TYPEdigitISRANGE0TO9;(3)用戶自定義子類型SUBTYPE子數據類型名IS數據類型名RANGE數據范圍;
數組類型是將相同類型的數據集合在一起所形成的數據類型,可以是一維的,也可以是多維的。數組類型定義格式如下:TYPE數據類型名ISARRAY數組下標范圍OF數組元素的數據類型;
如果數據類型沒有指定,則使用整數數據類型;如果用整數類型以外的其他類型,則需要在確定數據范圍后加上數據類型名。例如:TYPEbusISARRAY(15DOWNTO0)OFBIT;數組名稱為bus,共有16個元素,下標排序是15、14、…、1、0,各元素可分別表示為bus(15)、…、bus(0),數組類型為BIT。除了一維數組外,VHDL還可以定義二維、三維數組,例如定義一個16字、每字8位的RAM(隨機存儲器),可以定義為:TYPEram_16_8ISARRAY(0TO15)OFSTD_LOGIC_VECTOR(7DOWNTO0);5.3.1用戶自定義數據類型
用戶若對自己定義的數據作出一些限制,就形成了原自定義數據類型的子類型。對于每一個類型說明都定義了一個范圍,一個類型說明與其他類型說明所定義的范圍可以是不同的,在用VHDL對硬件描述時,有時一個對象可能取值的范圍是某個類型定義范圍的子集,這時就要用到子類型的概念。子類型的格式如下:SUBTYPE子數據類型名IS數據類型名RANGE數據范圍;例如:在STD_LOGIC_VECTOR數據類型上所形成的子類型:SUBTYPEiobusISSTD_LOGIC_VECTOR(4DOWNTO0);
子類型可以對原數據類型指定范圍而形成,也可以完全和原數據類型范圍一致。子類型常用于存儲器陣列等的數組描述場合。5.3.2數據類型間的轉換程序包名稱函數名稱功能STD_LOGIC_1164TO_BIT由STD_LOGIC轉換為BITTO_BITVECTOR由STD_LOGIC_VECTOR轉換為BIT_VECTORTO_STDLOGIC由BIT轉換為STD_LOGICTO_STDLOGICVECTER由BIT_VECTOR轉換為STD_LOGIC_VECOTRSTD_LOGIC_ARITHCONV_INTEGER由UNSIGNED,SIGNED轉換為INTEGERCONV_UNSIGNED由SIGNED,INTEGER轉換為UNSIGNEDCONV_STD_LOGIC_VECTOR由INTEGER,UNSDGNED,SIGNED類型轉換為
STD_LOGIC_VECTORSTD_LOGIC_UNSIGNEDCONV_INTEGER由STD_LOGIC_VECTOR轉換為INTEGER5.3.2數據類型間的轉換例如:把INTEGER數據類型的信號A轉換為STD_LOGIC_VECTOR數據類型的信號B,程序如下:SIGNALA:INTEGERRANGER0TO15;--定義信號ASIGNALB:STD_LOGIC_VECTOR(3DOWNTO0);--定義信號BB<=CONV_STD_LOGIC_VECTOR(A);--調用轉換函數注意:使用數據類型轉換函CONV_STD_LOGIC_VECTOR,需要調用IEEE庫中的STD_LOGIC_ARITH程序包。5.3.3元件例化語句1.元件聲明語句(COMPONENT)格式如下:COMPONENT元件名
PORT元件端口說明(與該元件源程序實體中的PORT部分相同)ENDCOMPONENT;2.元件例化語句(PORTMAP)格式如下:例化名:元件名PORTMAP(元件端口對應關系列表);信號之間有位置映射和名稱映射兩種映射(關聯)方式:(1)位置映射。就是被調用元件端口說明中信號的書寫順序及位置和PORTMAP語句中實際信號的書寫順序及位置一一對應。例如某元件的端口說明為:PORT(a,b:INBIT;c:OUTBIT);調用該元件時可使用:com1:u1PORTMAP(n1,n2,m);顯然n1對應a,n2對應b,m對應c,com1是例化名,u1是元件名。(2)名稱映射。就是將庫中已有的模塊的端口名稱賦予設計中的信號名。上例可改為:com1:u1PORTMAP(a=>n1,b=>n2,c=>m);用元件例化語句
實現4位移位寄存器的設計根據題目要求,調用D觸發器模塊dff,并使用元件例化語句設計的程序如下: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區間,DIN=1,在CP(時鐘)上升沿,DOUT=0001(移入數據“1”);在50~100ns區間,DIN=1,在CP上升沿,DOUT=0011(再次移入數據“1”)。其他區間的波形情況符合4位移位寄存器。5.3.4生成語句1.FOR工作模式的生成語句FOR工作模式常常用來進行
重復結構的描述,格式如下:[生成標號:]FOR循環變量IN取值范圍GENERATE并行語句;ENDGENERATE[生成標號];2.IF工作模式的生成語句IF工作模式的生成語句常用來
描述帶有條件選擇的結構。格式如下:[生成標號:]IF條件GENERATE并行語句;ENDGENERATE[生成標號];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語句
描述規則部分dffx:dffPORTMAP(q(i),cp,q(i+1));ENDGENERATE;ENDGENERATEreg;ENDstr;5.4.1LED點陣8行8列的LED點陣具有64個像素點,可以顯示數字和一些比較簡單的漢字。內部結構上由64個發光二極管組成,每個發光二極管是放置在行線和列線的交叉點上。5.4點陣顯示的設計使用1088AS(共陰極)點陣的某一行,設計并實現一個能夠異步復位的8路彩燈控制器,要求彩燈按照4種自動循環變化的花型閃爍。1.實體的確定分析設計題目,應該有1個時鐘脈沖輸入端、1個異步清零端和8個信號輸出端。設時鐘脈沖輸入端為CLK、異步復位端為CLR;輸出端口為LED。實體名為ledctrl。參考程序如下:ENTITYledctrlISPORT(CLKIN:INSTD_LOGIC;CLR:INSTD_LOGIC;LED:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDENTITYledctrl;5.4.2彩燈控制器2.結構體的確定在結構體中定義4個常量(F1、F2、F3、F4),代表4種花型;自定義只有5種取值的枚舉數組類型(STATE),用于記錄當前的4種花型和1個高阻狀態(復位狀態),使用狀態驅動,即用CASE語句判斷“當前狀態”并運行相應語句(某個花型),然后再將下一個狀態賦值給“當前狀態”;運行下一個狀態對應的語句(另一個花型),再改變“當前狀態”,利用狀態的變化驅動程序不斷運行。參考程序如下:ARCHITECTUREARTOFledctrlISTYPESTATEIS(S0,S1,S2,S3,S4);--自定義枚舉數組類型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;--狀態S0ELSIFRISING_EDGE(CLKIN)THENCASECURRSTATEISWHENS0=>--CURRSTATE=S0時,執行的語句FLOWER<="000000000000";CURRSTATE<=S1;--將CURRSTATE改為S1WHENS1=>FLOWER<=F1;--CURRSTATE=S1時,執行的語句CURRSTATE<=S2;--將CURRSTATE改為S2WHENS2=>FLOWER<=F2;CURRSTATE<=S3;WHENS3=>FLOWER<=F3;CURRSTATE<=S4;WHENS4=>FLOWER<=F4;CURRSTATE<=S1;--將CURRSTATE改為S1,實現循環運行ENDCASE;ENDIF;ENDPROCESS;LED<=FLOWER;ENDARCHITECTUREART;從仿真波形中可以看出,在0~50ns區間,CLR=1(異步復位有效),LED=00000000;在50~200ns區間,LED=00000000(狀態S0);在250~350ns區間,LED=01010101(狀態S1);在350~450ns區間,LED=001001001(狀態S2)。其他區間的波形情況符合題意。想一想、做一做:改成按列顯示,如何修改程序?彩燈控制器的仿真波形LED點陣可以顯示漢字或字符,只是此時的漢字或字符應以點陣來表示,取點越多,漢字或字符越逼真,通常8行8列的點陣可以用來顯示一些簡單的漢字。把要顯示的漢字用8位的二進制代碼(對應點陣的行或列)來表示,這一過程稱為取字模。
例如漢字“電”的十六進制字模為:10、7C、54、7C、54、7C、12、1E,其中“1”表示該點發光,“0”表示該點不發光。將字模賦值給點陣的每一列,在程序中采用逐行掃描的方法掃描點陣的每一行,使之輪流為低電平,于是每列字模的相應點被點亮。雖然漢字是逐行顯示的,但由于人眼的視覺暫留,且只要掃描速度足夠快,看到的還將是一個完整的漢字。
使用1088AS(共陰極)點陣設計并實現一個顯示漢字“電”的電路,要求顯示穩定、筆畫完整。5.4.3漢字的顯示
分析設計題目,點陣漢字的顯示是多行、多列的顯示,相當于數碼管的動態顯示。應該有1個時鐘脈沖輸入端、1個異步清零端、8個行信號輸出端和8個列信號輸出端。設時鐘脈沖輸入端為CLKIN、異步復位端為CLR;行信號輸出端口為ROLED、列信號輸出端口為COLED。文件名為ledword。參考程序如下:ENTITYledwordISPORT(CLKIN:INSTD_LOGIC;CLR:INSTD_LOGIC;ROLED,LEDCO:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDENTITYledword;1.實體的確定
在結構體中定義8個常量(F0~F7),代表漢字字模;自定義只有9種取值的枚舉數組類型(STATE),用于記錄當前的漢字字模和1個高阻狀態(復位狀態)。字模賦值給行信號,列信號(低電平)決定顯示字模某列。同樣使用狀態驅動。參考程序如下:ARCHITECTUREARTOFledwordISTYPESTATEIS(S0,S1,S2,S3,S4,S5,S6,S7,S8);SIGNALCURRSTATE:STATE;SIGNALtmproled,tmpledco:STD_LOGIC_VECTOR(7DOWNTO0);BEGINPROCESS(CLR,CLKIN)IS2.結構體的確定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;
由于實體中定義的STD_LOGIC信號類型不是VHDL默認類型,需要調用IEEE庫中的STD_LOGIC_1164程序包,因此需要在實體的前面調用IEEE庫,并使用該程序包。參考程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;3.庫和程序包的確定從仿真波形中可以看出,在0~50ns區間,CLR=1(異步復位有效),LEDCO=FF、ROLED=00000000(狀態S0);在150ns處,CLKIN上升沿右側,LEDCO=10、ROLED=01111111(狀態S1)。其他區間的波形情況符合題意。漢字顯示控制的仿真波形
使用1088AS(共陰極)點陣設計并實現漢字“電”的滾動顯示。要求:能夠異步復位、漢字從下到上循環滾動顯示。
把所有需顯示的漢字或字符的字模從上往下依次排好,一方面用足夠快的速度(即滿足視覺暫留的頻率)從上往下掃描整個點陣,顯示該時刻所掃描的漢字或字符,即顯示一個完整“畫面”;另外,用一個較慢的速度每次從下往上移動一行,即將“畫面”的首行移出,補充到“畫面”的末行,這時將顯示上方缺少首行、下方多個首行的“畫面”。不斷重復,視覺看上去就是滾動的效果了。5.4.4漢字的滾動顯示
分析設計題目,與漢字顯示相同,應該有1個時鐘脈沖輸入端、1個異步清零端、8個行信號輸出端和8個列信號輸出端。設時鐘脈沖輸入端為CLK、異步復位端為CLR;行信號輸出端口為ROLED、列信號輸出端口為COLED。文件名為rollword。參考程序如下:ENTITYrollwordISPORT(CLK:INSTD_LOGIC;CLR:INSTD_LOGIC;ROLED,LEDCO:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDENTITYrollword;1.實體的確定結構體中定義4個進程:復位和慢速信號產生進程、穩定“畫面”顯示進程、行掃描進程、行遞增計數進程,其中行遞增計數進程由慢速信號驅動,用于滾動“畫面”;其他進程由快速時鐘驅動,用于顯示穩定“畫面”。參考程序如下:ARCHITECTUREARTOFrollwordISSIGNALtmproled,tmpledco:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALrow,col,count:STD_LOGIC_VECTOR(2DOWNTO0);SIGNALCLKLOW:STD_LOGIC;BEGIN2.結構體的確定p0:PROCESS(CLR,CLK)IS--復位和慢速信號產生進程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--穩定“畫面”顯示進程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";
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 立體混凝土路面施工方案
- 校車租賃 包車合同范本
- 濟寧學院《漢語作為第二語言教學法》2023-2024學年第一學期期末試卷
- 中國石油大學(華東)《城市設計模型制作》2023-2024學年第二學期期末試卷
- 無錫太湖學院《病理》2023-2024學年第二學期期末試卷
- 唐山幼兒師范高等專科學校《海洋生物技術》2023-2024學年第二學期期末試卷
- 南通大學杏林學院《電氣工程專業綜合實訓》2023-2024學年第二學期期末試卷
- 2025的合同承包商管理程序(標準版)
- 南京郵電大學《中醫皮膚科學》2023-2024學年第二學期期末試卷
- 拆除原有欄桿施工方案
- 2024年抗癌新藥研發合作合同
- 免疫學檢驗技術-熒光免疫技術
- 2024-2030年版中國網吧行業市場運營模式及發展策略分析報告
- 2023年上半年系統集成項目管理工程師考試答案解析
- 臨床醫生個人職業規劃
- 腸穿孔護理疑難病例討論
- 【字節跳動盈利模式和核心競爭力探析(論文)12000字】
- 期中測試卷(試題)2024-2025學年三年級上冊數學人教版
- 機器的征途:空天科技學習通超星期末考試答案章節答案2024年
- 培訓學校應急管理機構及突發事件應急預案
- 學校內控工作小組成立方案
評論
0/150
提交評論