【正文】
時鐘波形,可知比較模塊的設(shè)計(jì)滿足要求。輸入端口reset是定時模塊的復(fù)位信號,也是整個打鈴器的使能信號,低電平有效; k1是鬧鐘時間設(shè)定時、分切換按鍵,高電平時對時進(jìn)行調(diào)節(jié),低電平時對分進(jìn)行調(diào)節(jié);up_key是調(diào)整鬧鐘時間的累加按鍵,另一端接按鍵消抖模塊,每按一次計(jì)數(shù)加一;Q_tmpma、Q_tmpmb、Q_tmpha、Q_tmphb分別為鬧鐘時間的分低位、分高位、時低位時高位。由此可知當(dāng)key為低電平時可進(jìn)行調(diào)時、調(diào)分。圖27 分計(jì)數(shù)模塊符號圖如圖28所示為分計(jì)數(shù)模塊波形仿真圖。如圖25所示為按鍵消抖模塊波形仿真圖。在本設(shè)計(jì)初期完成后,下載程序測試時,撥動按鍵或者按下按鍵時顯示出現(xiàn)異常,這就需要加入按鍵消抖模塊。時基電路可以由石英晶體振蕩電路構(gòu)成,晶振頻率為25MHz,經(jīng)過分頻可得到秒脈沖信號?;诖嗽O(shè)計(jì)方案的數(shù)字鐘部分結(jié)構(gòu)組成如圖21所示。設(shè)計(jì)完成后需要進(jìn)行仿真,可以測試設(shè)計(jì)的邏輯功能和延時特性。 FPGA的優(yōu)點(diǎn)概括地說,F(xiàn)PGA器件具有下列優(yōu)點(diǎn):高密度、高速度、系列化、標(biāo)準(zhǔn)化、小型化、多功能、低功耗、低成本,設(shè)計(jì)靈活方便,可無限次反復(fù)編程,并可現(xiàn)場模擬調(diào)試驗(yàn)證。 FPGA的發(fā)展歷程作為一種可編程邏輯器件,現(xiàn)場可編程門陣列(Field Programmable Gate Array,F(xiàn)PGA)的出現(xiàn)是PLD發(fā)展變化的必然,他的出現(xiàn)推動著可編程邏輯器件的進(jìn)一步發(fā)展。諸如定時自動報警、定時啟閉電路、定時開關(guān)烘箱、通斷動力設(shè)備,甚至各種定時電氣的自動啟用等,所有這些,都是以時鐘數(shù)字化為基礎(chǔ)的。系統(tǒng)運(yùn)行穩(wěn)定,設(shè)計(jì)方法可行。系統(tǒng)主芯片采用美國Altera公司的EP3C40F484I7器件,由時鐘模塊、控制模塊、鬧鐘模塊、定時模塊、數(shù)據(jù)譯碼模塊、顯示以及報時等模塊組成,由按鍵進(jìn)行時鐘的校時、清零、啟停等。近些年,隨著科技的發(fā)展和社會的進(jìn)步,人們對時鐘的要求也越來越高,傳統(tǒng)的時鐘已不能滿足人們的需求。同時,借助于開發(fā)設(shè)計(jì)平臺,可以進(jìn)行系統(tǒng)的仿真和硬件測試等。隨后,出現(xiàn)了一類結(jié)構(gòu)稍微復(fù)雜的可編程芯片,即可編程邏輯陣列(Programmable Logic Array,PLA)。其設(shè)計(jì)流程包括設(shè)計(jì)輸入、編譯、仿真與定時分析、編程與驗(yàn)證。數(shù)字鐘實(shí)際上是一個對標(biāo)準(zhǔn)頻率(1HZ)進(jìn)行計(jì)數(shù)的計(jì)數(shù)電路。計(jì)滿后各計(jì)數(shù)器清零,重新計(jì)數(shù)。其中25k分頻的輸出作為按鍵消抖模塊的輸入時鐘信號,其頻率為1kHz;200分頻的輸出作為計(jì)時模塊調(diào)分模塊的時鐘輸入,其頻率為5Hz,;5分頻的輸出作為計(jì)時模塊中秒計(jì)時的輸入,為1Hz頻率的1s時鐘信號;50k分頻的輸出作為動態(tài)掃描模塊的輸入時鐘,其頻率為500Hz;250分頻的輸出作為計(jì)時模塊調(diào)時模塊的輸入時鐘,其頻率為2Hz。圖24 消抖模塊符號圖本設(shè)計(jì)的按鍵消抖模塊內(nèi)部電路相當(dāng)于一個D觸發(fā)器,該模塊在這里實(shí)現(xiàn)的比較簡單,原理是當(dāng)有按鍵按下的時候,d會變成高電平,當(dāng)有時鐘上升沿到來且按鍵按下時,q輸出高電平。由圖可以看出,隨著1s時鐘脈沖上升沿的到來,每來一次秒計(jì)數(shù)的低位就產(chǎn)生一個脈沖,當(dāng)計(jì)到9時變?yōu)?,秒計(jì)數(shù)的高位變?yōu)?,當(dāng)?shù)臀粸?,高位為5時,也就是計(jì)到59時,高、低位都變?yōu)?,且輸出co產(chǎn)生一個脈沖信號,由仿真圖可知滿足設(shè)計(jì)的要求。clk接分計(jì)時模塊的僅為輸出,給定時鐘信號,clr高電平清零無效,每次達(dá)到時鐘脈沖上升沿時,時計(jì)數(shù)低位sl計(jì)一個數(shù),計(jì)到9時向高位進(jìn)位,當(dāng)計(jì)到24時,高、低都變?yōu)榱悖?jì)數(shù)重新開始,由仿真圖可知此模塊設(shè)計(jì)滿足設(shè)計(jì)要求。本模塊主要由定時模塊、比較模塊組成,另外還有正常計(jì)時時間和定時時間輸出選擇切換模塊,連接基本數(shù)字鐘模塊的時、分、秒輸出,以及定時時間的時、分輸出,另一端連接動態(tài)顯示模塊,通過外部按鍵來選擇基本時鐘或者是鬧鐘時間設(shè)定的顯示。圖216 比較模塊設(shè)計(jì)框圖如圖217所示為比較模塊符號圖。圖221打鈴模塊波形仿真圖如圖221所示為打鈴模塊波形仿真圖。圖223 報警時長設(shè)定模塊波形仿真圖本設(shè)計(jì)需用兩個蜂鳴器,一個蜂鳴器用于學(xué)校作息時間報時,另外一個蜂鳴器用于鬧鐘報警。設(shè)計(jì)思路為:通過K2來進(jìn)行時間切換,當(dāng)K2為高電平時,輸出正常計(jì)時時間;當(dāng)K2為低電平時,輸出定時時間。若顯示器的位數(shù)不大于8位,則控制顯示器公共極電位只需一個8位I/O口(稱為掃描口或字位口),控制各位LED顯示器所顯示的字形也需要一個8位口(稱為數(shù)據(jù)口或字形口)。所謂動態(tài)掃描顯示方式是在顯示某一位LED顯示塊的數(shù)據(jù)的時候,讓其它位不顯示,然后在顯示下一位的數(shù)據(jù),同時關(guān)閉其他顯示塊。圖230 動態(tài)掃描模塊符號圖如圖231所示為動態(tài)掃描模塊波形仿真圖。 測試說明,最終結(jié)果與預(yù)期效果基本一致,時、分、秒能夠正常計(jì)數(shù)并可調(diào)節(jié)時間,學(xué)校上下課時間打鈴功能正常,并且可以通過按鍵調(diào)整作息時間以及報警時長。本設(shè)計(jì)中仍存在一定不足,用來控制學(xué)校打鈴器的按鍵為八個,數(shù)量較多,在實(shí)際應(yīng)用中會帶來不便,以后可以考慮進(jìn)一步優(yōu)化,如,可通過加入位選控制按鍵來實(shí)現(xiàn)節(jié)省按鍵資源,一鍵多用,便可以減少按鍵,實(shí)現(xiàn)同樣的控制功能。我會用百折不撓的決心,去越過每一道溝溝坎坎。end entity。 process (clk) is beginif clk39。 end architecture art。139。then if cqi=5 then cqi=1。entity t200 is port( clk :in std_logic。else 39。 end if。Architecture art of t50e issignal cqi : integer range 1 to 50e3。event and clk=39。(5)library ieee。 when cqi=250 and clk=39。 else cqi=cqi+1。q:out std_logic)。end architecture art。architecture SEC of SECOND isbeginprocess(cp,clr)variable t1,t0:std_logic_vector(3 downto 0)。 thenif t1=0101 and t0=1000 thenco=39。039。(2)分計(jì)數(shù)模塊library ieee。beginif clk39。elsif t01001 thent0:=t0+1。end if。use 。)thensh=0000。if(sl9)then sl=sl+1。end process。 c: out std_logic )。end one。END ctrl_memo。 Q_tmpmb:= 0。 THEN IF Q_tmphb=2 AND Q_tmpha=3 THEN Q_tmphb:=0。 ELSIF Q_tmpma=9 THEN Q_tmpma:=0。 Q_minueb=Q_tmpmb。QH_B:IN INTEGER RANGE 0 TO 9。 BEGIN SPEAK=CLK0 AND Y。ENTITY COMP_TIME ISPORT( K3: IN STD_LOGIC。 Q_HA amp。139。139。139。139。139。139。WHEN 0001010101010000 = Q_Y=39。WHEN 0001011001000101 = Q_Y=39。WHEN 0001100000110000 = Q_Y=39。WHEN 0001100100100000 = Q_Y=39。WHEN 0010000000010101 = Q_Y=39。WHEN 0010001000000000 = Q_Y=39。 END PROCESS。BEGIN IF reset=39。 END IF 。 speaktime : in INTEGER RANGE 0 TO 15。139。 ELSE tmp:=0。 USE 。Q_HAO,Q_MAO,Q_SAO:OUT INTEGER RANGE 0 TO 9。139。 Q_SAO=QSAI WHEN K2=39。use 。 mh:in std_logic_vector(3 downto 0)。 begin if (clk39。when 110 =num:=speaktimel(3 downto 0)。when 010 =num:=fl(3 downto 0)。case num is when0000=seg=00111111。 when1000=seg=01111111。end architecture。 when others=seg=00000000。 when0010=seg=01011011。when 001 =num:=mh(3 downto 0)。when 101 =num:=sh(3 downto 0)。139。 segout:out std_logic_vector(7 downto 0))。entity dongtaism2 is port(clk:in std_logic。 ELSE 0。 Q_MAO=QMAI WHEN K2=39。Q_MBO,Q_SBO: OUT INTEGER RANGE 0 TO 9)。 QSAI,QMAI,QHAI:IN INTEGER RANGE 0 TO 9。039。Q_20S=39。END s20。 speaktime=Q_tmpma。 THEN Q_tmpma:=0。(1)報警時長設(shè)定模塊LIBRARY ieee。 WHEN 0001010101000000 = Q_Y=39。 WHEN 0001010001000101 = Q_Y=39。 WHEN 0001001000000000 = Q_Y=39。 WHEN 0001000100000101 = Q_Y=39。 WHEN 0001000000010000 = Q_Y=39。 WHEN 0000100100010101 = Q_Y=39。139。139。139。139。139。139。 Q_MA。 Q_HB: IN STD_LOGIC_VECTOR(3 DOWNTO 0)。139。HARM_A,MARM_A: IN INTEGER RANGE 0 TO 9。 END PROCESS 。 ELSE Q_tmpma:=Q_tmpma+1。 ELSIF Q_tmpha=9 THEN Q_tmpha:=0。 Q_tmphb:= 0。 VARIABLE Q_tmpmb: INTEGER RANGE 0 TO 9。 USE 。architecture one of mux2to1 isbegin process(key) begin if key=39。(4)調(diào)時模塊library ieee。if(sh2)then sh=sh+1。elsif(clk39。cl