帶鬧鐘功能的24小時制鬧鐘系統(tǒng)的設(shè)計_第1頁
帶鬧鐘功能的24小時制鬧鐘系統(tǒng)的設(shè)計_第2頁
帶鬧鐘功能的24小時制鬧鐘系統(tǒng)的設(shè)計_第3頁
帶鬧鐘功能的24小時制鬧鐘系統(tǒng)的設(shè)計_第4頁
帶鬧鐘功能的24小時制鬧鐘系統(tǒng)的設(shè)計_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、江西理工大學(xué)應(yīng)用科學(xué)學(xué)院課程設(shè)計 SOPC/EDA綜合課程設(shè)計報告 設(shè)計題目:帶鬧鐘功能的24小時制鬧鐘系統(tǒng)的設(shè)計設(shè) 計 者: 學(xué) 號: 班 級: 指導(dǎo)老師: 完成時間: 設(shè)計報告綜合測試總評格式(10)內(nèi)容(40)圖表(10)答辯(20)平時(20)1目錄目錄1第一章 系統(tǒng)設(shè)計綜述21.1設(shè)計要求21.2要求分析2第二章 系統(tǒng)模塊分析42.1 譯碼器的設(shè)計42.2移位寄存器的設(shè)計:42.3鬧鐘寄存器的設(shè)計:42.4 時間計數(shù)器模塊設(shè)計: 42.5顯示驅(qū)動器的設(shè)計:52.6分頻器的設(shè)計:52.7控制器的設(shè)計:5第三章 鬧鐘系統(tǒng)的整體組裝7第四章

2、 系統(tǒng)子程序設(shè)計84.1、整個設(shè)計中將要用到的程序包定義程序P_ALARM.VHD84.2、譯碼器源程序DECODER.VHD84.3、寄存器源程序ALARM_REG.VHD94.4、時間計數(shù)器源程序ALARM_COUNTER.VHD104.5、移位寄存器源程序KEY_BUFFER.VHD114.6、顯示驅(qū)動器源程序DISPLAY_DRIVER.VHD124.7、分頻器源程序FQ_DIVIDER.VHD134.8、控制器源程序ALARM_CONTROLLER.VHD144.9、鬧鐘系統(tǒng)的整體組裝源程序ALARM_CLOCK.VHD17  第五章 心得體會 

3、;   19第六章 參考文獻201第一章 系統(tǒng)設(shè)計綜述 1.1設(shè)計要求 隨著電子技術(shù)與計算機技術(shù)的高速發(fā)展,電子電路的設(shè)計產(chǎn)品無處不在。開發(fā)周期短兼容性的電子設(shè)計自動化(EDA)已經(jīng)成為電子設(shè)計領(lǐng)域的潮流。本設(shè)計的研究目的也是利用EDA技術(shù)來實現(xiàn)帶鬧鐘功能的24小時計時器。分別介紹研究背景、發(fā)展動態(tài)、研究思路、系統(tǒng)原理、系統(tǒng)功能分析、系統(tǒng)結(jié)構(gòu)、各個模塊分析與設(shè)計以及主要工作過程。其中將重點介紹Quartus II 軟件進行各部分器件程序的編輯、綜合、波形仿真。從而實現(xiàn)了一種基于FPGA的精確可靠的數(shù)字鬧鐘系統(tǒng)。 &

4、#160;  計時器設(shè)計要求完成如下功能。 (1) 計時功能:這是 本計時器設(shè)計的基本功能,每隔一分鐘計時一次,并在顯示屏上顯示當(dāng)前時間。    (2) 鬧鐘功能:如果當(dāng)前時間與設(shè)置的鬧鐘時間相同,則揚聲器發(fā)出蜂鳴聲。    (3) 設(shè)置新的計時器時間:用戶用數(shù)字鍵09輸入新的時間,然后按 "TIME"鍵確認。(4) 設(shè)置新的鬧鐘時間:用戶用數(shù)字鍵“0”“9”輸入新的時間,然后按“ALARM”鍵確認。過程與(3)類似。    

5、(5) 顯示所設(shè)置的鬧鐘時間:在正常計時顯示狀態(tài)下,用戶直接按下“ALARM”鍵,則已設(shè)置的鬧鐘時間將顯示在顯示屏上。      1.2要求分析 根據(jù)本設(shè)計的要求,鬧鐘系統(tǒng)包括以下幾個子系統(tǒng):1用于鍵盤輸入的緩沖器2用于時鐘計時的計數(shù)器;3用于保存鬧鐘時間的寄存器;4用于顯示的氣短數(shù)碼管閑事電路和控制以上各個電路協(xié)同工作的控制器。 各部分的功能: (1)譯碼器(DECOER)可將KEYPAD信號轉(zhuǎn)換為0-9的整數(shù)可直觀額表示和處理用戶輸入的數(shù)字。(2)鍵盤緩沖器(KEY-BUFFER)是一個移位寄存器,暫

6、存用戶鍵入的數(shù)字并且實現(xiàn)用戶鍵入數(shù)字在顯示器上從左到右依次顯示,由上圖我們可以看出KEY_BUFFER的時鐘端連接的是外部KEY_DOWN的信號。這個表示用戶輸入一個數(shù)字KEY_BUFFER移位一次。(3)分頻器(FQ_DIVIER)將較高速的外部時鐘頻率成為每分鐘一次的時鐘頻率以便進行時鐘的計時。(4)計數(shù)器(ALARM_COUNTER)實際上市一個異步復(fù)位、異步置數(shù)的累加器,通常情況下進行時間累加計數(shù)必要時可置入新時鐘值然后從該值開始新的計數(shù)。(5)寄存器(ALARM_REG)用于保存用戶設(shè)置的鬧鐘時間,是一個異步復(fù)位寄存器。(6)顯示器(DISPLAY_DRIVER)根據(jù)需要顯示當(dāng)前時間

7、,用戶設(shè)置的鬧鐘時間或用戶通過鍵盤鍵入的新時間,同時判斷當(dāng)前時間是否已經(jīng)到了鬧鐘實際上是一個多路選擇器加比較器。(7)控制器(ALARM_CONTEOLLER)設(shè)計的核心部分,按設(shè)計的要求產(chǎn)生相應(yīng)的控制邏輯,以控制其他個部分額工作。第二章 系統(tǒng)模塊分析 2.1 譯碼器的設(shè)計:  本模塊的功能是將每次按下難找那個系統(tǒng)的數(shù)字鍵盤后產(chǎn)生的一個數(shù)字所對應(yīng)的10位二進制數(shù)據(jù)信號轉(zhuǎn)換為1為10進制整數(shù)信號;以作為小時,分鐘計數(shù)的四個數(shù)字之一,其中,KEYPAD為輸入端口,接受10位二進制數(shù)據(jù)信號;VALUE為輸出端口,輸出相應(yīng)的1位十進制整數(shù)信號。 2.2

8、移位寄存器的設(shè)計:  本模塊的功能是在CLK端口輸入信號的上升沿同步下,將KEY端口的輸入信號移入NEW_TIME端口的輸出信號最低位,原有的信息依次向左移,最高位信息丟失;RESET端口的輸入信號對NEW_TIME端口輸出信號進行異步清零復(fù)位。    儲存鍵入的數(shù)字,并實現(xiàn)鍵入數(shù)字在顯示屏上從左到右的顯示,RESET端口的輸入信號對NEW_TIME端口的輸出信號清零,在CLK端口輸入信號的上升沿同步下,KEY端口的輸入信號移入NEW_TIME端口的輸出信號最低位,依次左移,最高為丟失,由圖可知,程序功能正常。 2.3鬧鐘寄

9、存器的設(shè)計:鬧鐘寄存模塊的功能是在時鐘上升沿同步下,根據(jù)LOAD_NEW_A端口的輸入信號控制ALARM_TIME端口的輸出;當(dāng)控制信號有效時,把NEW_ALARM_TIME端口的輸入信號值輸出;RESET端口輸入信號隨ALAR_TIME端口的輸出進行異步的清零復(fù)位。 異步復(fù)為寄存器,從圖中可以看到當(dāng)控制信號為高電平寄存器把NEW_ALARM_TIME端口的輸入信號值(即鬧鐘時間)輸出,程序功能正常。 2.4 時間計數(shù)器模塊設(shè)計: 當(dāng)RESET端口輸入信號為高電平時,對CURRENT_TIME端口輸出信號清零復(fù)位;當(dāng)LOAD_NEW_C端口輸入信號為高電平時,將N

10、EW_CURRENT_TIME端口的輸入信號輸出給CURRENT_TIME端口。RESET端口的控制優(yōu)先于LAOD_NEW_C端口。當(dāng)這兩個控制信號都無效時,在時鐘上升沿同步下,對CURRENT_TIME端口輸出信號累加1,并根據(jù)小時,分鐘的規(guī)律處理進位  計數(shù)器實際是一個異步復(fù)位、異步指數(shù)的累加器,由圖可以看出,當(dāng)沒有新的地輸入值時,只是進行時鐘累加計數(shù),在輸入新的時鐘值時又開始新的計數(shù)。 2.5顯示驅(qū)動器的設(shè)計:            

11、60;                 本模塊的功能是當(dāng)SHOW_NEW_TIME端口輸入信號有效時,根據(jù)NEW_TIME端口輸入信號,產(chǎn)生相應(yīng)的四個七段數(shù)碼顯示器的驅(qū)動數(shù)據(jù),并在DISPLAY端口輸出該信號沒為高電平時,根據(jù)ALARM_TIME端口的輸入信號產(chǎn)生相應(yīng)的四個七段數(shù)碼顯示管的驅(qū)動數(shù)據(jù),并在DISPLAY端口輸出該信號:為低電平時,根據(jù)CURRENT_TIME端口的輸入信號,對DISPLAY端口進行驅(qū)動,當(dāng)ALAR

12、M_TIME端口的輸入信號值與CURRENT_TIME端口的輸入喜好值相同時,SOUND_ALARM端口的輸出信號有效,反之無效。顯示器的功能是根據(jù)需要的顯示當(dāng)前時間、設(shè)置的鬧鐘時間或通過鍵盤輸入的新時間同時判斷當(dāng)前時間是否和設(shè)定的時間一致是一個多路選擇加比較器,從仿真圖中看到相應(yīng)的輸入輸出,程序功能正常  2.6分頻器的設(shè)計: 模塊的功能是將CLK_IN端口輸入的時鐘信號分頻后送給CLK_OUT端口:當(dāng)RESET端口輸入信號有效時,CLK_OUT端口輸出信號清零。 分頻器將比較高速的外部時鐘頻率分成每分鐘一次的時鐘頻率,以便進行時鐘計數(shù),從仿真圖上可以

13、看到CLK_IN端口的輸入的時鐘信號分頻后輸出,當(dāng)RESET端口為高電平時,輸出端口CLK_OUT輸出信號清零 2.7控制器的設(shè)計: 控制器的功能是控制各模塊協(xié)同工作的,端口及各自作用為:a、CLK為外部始時鐘信號,REXET為復(fù)位信號。b、當(dāng)KEY為高電平時(KEY=1),表示按下數(shù)字鍵(“0”“9”)。c、當(dāng)ALARM_BUTTON為高電平時,表示按下“ALARM”鍵。d、當(dāng)TIEM_BUTTON為高電平時,表示按下“TIME”。e、當(dāng)LOAD_NEW_A為高電平時,控制加載新的鬧鐘時間。f、當(dāng)LOAD_NEW_C為高電平時,控制設(shè)置新的時間值。g、當(dāng)SHOW_NEW_

14、TIME為高電平時,控制顯示新的時間值,即通過數(shù)字鍵輸入的時間;否則,當(dāng)SHOW_NEW_TIME為低電平時,根據(jù)SHOW_A信號的值控制顯示當(dāng)前時間或鬧鐘時間.此時,當(dāng)SHOW_A為高電平時,控制顯示鬧鐘時間,否則,顯示當(dāng)前時間.      控制器的功能可以通過有限狀態(tài)自動機(FSM)的方式來實現(xiàn).根據(jù)設(shè)計的具體要求及端口設(shè)置,需要五個狀態(tài)實現(xiàn): S0:表示電路初態(tài)即正常時鐘計數(shù)狀態(tài),完成前面設(shè)計功能a的工作.S1:接受鍵盤輸入狀態(tài).在狀態(tài)S0時用換下數(shù)字鍵后進入此狀態(tài).在此狀態(tài)下,顯示屏上顯示的是鍵入的數(shù)字.S2:設(shè)置新

15、的鬧鐘時間.在狀態(tài)S1時按下ALARM鍵后進入比賽.S3:設(shè)置新的計時器時間.在狀態(tài)S1時按下TIME鍵后進入此狀態(tài).S4:顯示鬧鐘時間.在狀態(tài)S0時按下ALARM鍵后進入此狀態(tài).在此狀態(tài)下,顯示屏上顯示的是所設(shè)置的鬧鐘時間.在此狀態(tài)下,按下ALARM鍵后,顯示屏上保持顯示鬧鐘時間,經(jīng)過一段時間以后,再返回狀態(tài)S0顯示計時器時間. 第三章 鬧鐘系統(tǒng)的整體組裝前面已經(jīng)完成了計數(shù)器各個總成部分的設(shè)計。下面把這些組成部分組裝起來,形成完整的總體設(shè)計。該計時器命名為ALARM_CLOCK,其外部端口如下圖所示。 對應(yīng)5種不同的狀態(tài),是鬧鐘系統(tǒng)分別執(zhí)行正常技術(shù)狀態(tài)(S0),

16、鍵盤輸入狀態(tài)(S1),設(shè)置鬧鐘時間狀態(tài)(S2),設(shè)置計數(shù)器狀態(tài)(S3),顯示鬧鐘時間狀態(tài)(S4).操作流程如下(1) 給定CLK輸入信號,其他輸入給定無效電平,鬧鐘工作于正常計數(shù)狀態(tài)。(2)給定CLK輸入信號,并用數(shù)字鍵入  ,鬧鐘處于鍵盤輸入數(shù)字狀態(tài),輸出不變。(3)給定CLK輸入信號,并用數(shù)字鍵入1235,同時給定ALARM_BUTTON有效電平,鬧鐘時間設(shè)置狀態(tài),顯示頻顯示該鬧鐘時間。(4)給定CLK輸入信號,并用數(shù)字鍵鍵入1235,同時給定ALARM_TIME有效電平,鬧鐘處于新的計數(shù)時間設(shè)置狀態(tài),顯示頻顯示改時間,并把它作為計時時間起點。(5)給定CLK

17、輸入信號,并用數(shù)字鍵鍵入1235,同時給定ALARM_BUTTON有效電平,鬧鐘顯示頻顯示的為鬧鐘時間。第四章 系統(tǒng)子程序設(shè)計4.1、整個設(shè)計中將要用到的程序包定義程序P_ALARM.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;PACKAGE P_ALARM IS  SUBTYPE T_DIGITAL IS INTEGER RANGE 0 TO 9;  SUBTYPE T_SHORT   IS INTEGER RANGE 0 TO 65535;  TY

18、PE T_CLOCK_TIME IS ARRAY (3 DOWNTO 0) OF T_DIGITAL;  TYPE T_DISPLAY IS ARRAY (3 DOWNTO 0) OF STD_LOGIC_VECTOR(6 DOWNTO 0);  TYPE SEG7 IS ARRAY (0 TO 9) OF STD_LOGIC_VECTOR(6 DOWNTO 0);  CONSTANT SEVEN_SEG: SEG7 :=("0111111",      

19、                           "0000110",                   

20、0;             "1011011",                                 &q

21、uot;1001111",                                 "1100110",          

22、0;                      "1101101",                        &#

23、160;        "1111101",                                 "0000111", 

24、0;                               "1111111",               &#

25、160;                 "1110011" );  TYPE KEYPAD9 IS ARRAY (0 TO 9) OF STD_LOGIC_VECTOR (9 DOWNTO 0);  CONSTANT KEYNUMBER: KEYPAD9 :=( "0000000001", -0    &#

26、160;                                  "0000000010", -1           

27、                            "0000000100", -2                 

28、0;                     "0000001000", -3                        &#

29、160;              "0000010000", -4                               

30、        "0000100000", -5                                     

31、0; "0001000000", -6                                       "0010000000", -7 

32、                                      "0100000000", -8       

33、0;                               "1000000000"  );-9END PACKAGE P_ALARM; 4.2、譯碼器源程序DECODER.VHDLIBRARY IEEE;USE IEEE.STD_L

34、OGIC_1164.ALL;USE WORK.P_ALARM.ALL;ENTITY DECODER ISPORT(KEYPAD:IN STD_LOGIC_VECTOR(9 DOWNTO 0);     VALUE:OUT T_DIGITAL);END ENTITY DECODER;ARCHITECTURE ART OF DECODER ISBEGINWITH KEYPAD SELECTVALUE<=0 WHEN "0000000001",1 WHEN "0000000010",  

35、;      2 WHEN "0000000100",        3 WHEN "0000001000",        4 WHEN "0000010000",        5 WHEN "0000100000"

36、,        6 WHEN "0001000000",        7 WHEN "0010000000",        8 WHEN "0100000000",        9 WHEN "1000

37、000000",        0 WHEN OTHERS;END ARCHITECTURE ART; 4.3、寄存器源程序ALARM_REG.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE WORK.P_ALARM.ALL;ENTITY ALARM_REG IS  PORT(NEW_ALARM_TIME:IN T_CLOCK_TIME;      LOAD_NEW_A

38、:IN STD_LOGIC;      CLK:IN STD_LOGIC;      RESET:IN STD_LOGIC;      ALARM_TIME:OUT T_CLOCK_TIME);END ENTITY ALARM_REG;ARCHITECTURE ART OF ALARM_REG IS  BEGIN  PROCESS(CLK, RESET)  

39、BEGIN  IF RESET='1'THEN    ALARM_TIME<=(0,0,0,0);    ELSE    IF RISING_EDGE(CLK) THEN    IF LOAD_NEW_A='1' THEN    ALARM_TIME<=NEW_ALARM_TIME;    EL

40、SIF LOAD_NEW_A/='0'THEN    ASSERT FALSE REPORT "UNCERTAIN LOAD_NEW_ALARM CONTROL!"  SEVERITY WARNING;    END IF;    END IF;    END IF;  END PROCESS;END ARCHITECTURE ART;  4

41、.4、時間計數(shù)器源程序ALARM_COUNTER.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE WORK.P_ALARM.ALL;ENTITY ALARM_COUNTER IS  PORT(NEW_CURRENT_TIME:IN T_CLOCK_TIME;       LOAD_NEW_C:IN STD_LOGIC;       CLK:IN STD_LOGIC;  

42、     RESET:IN STD_LOGIC;       CURRENT_TIME:OUT T_CLOCK_TIME);END ENTITY ALARM_COUNTER;ARCHITECTURE ART OF ALARM_COUNTER IS  SIGNAL I_CURRENT_TIME:T_CLOCK_TIME;  BEGIN  PROCESS(CLK, RESET, LOAD_NEW_C) 

43、0;VARIABLE C_T:T_CLOCK_TIME;  BEGIN  IF RESET='1' THEN  I_CURRENT_TIME<=(0, 0, 0, 0);  ELSIF LOAD_NEW_C='1' THEN  I_CURRENT_TIME<=NEW_CURRENT_TIME;  ELSIF RISING_EDGE(CLK) THEN     C_T:=I_CURRE

44、NT_TIME;     IF C_T(0)<9 THEN         C_T(0):=C_T(0)+1;     ELSE         C_T(0):=0;     IF C_T(1)<5 THEN    &

45、#160;    C_T(1):=C_T(1)+1;     ELSE         C_T(1):=0;     IF C_T(3)<2 THEN         IF C_T(2)<9 THEN     

46、0;         C_T(2):=C_T(2)+1;         ELSE               C_T(2):=0;           

47、60;   C_T(3):=C_T(3)+1;         END IF;      ELSE        IF C_T(2)<3 THEN            C_T(2):=C_T(2)+1; 

48、;       ELSE            C_T(2):=0;            C_T(3):=0;        END IF;     

49、0;  END IF;        END IF;        END IF;    I_CURRENT_TIME<=C_T;    END IF;  END PROCESS;  CURRENT_TIME<=I_CURRENT_TIME;END ARCHITECTURE ART;&#

50、160; 4.5、移位寄存器源程序KEY_BUFFER.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE WORK.P_ALARM.ALL;ENTITY KEY_BUFFER IS  PORT(KEY:IN T_DIGITAL;       CLK:IN STD_LOGIC;       RESET:IN STD_LOGIC;    

51、0;  NEW_TIME:OUT T_CLOCK_TIME);END ENTITY KEY_BUFFER;ARCHITECTURE ART OF KEY_BUFFER IS  SIGNAL N_T:T_CLOCK_TIME;  BEGIN  SHIFT:PROCESS(RESET, CLK)  BEGIN     IF (RESET='1') THEN      

52、0;N_T<=(0, 0, 0, 0);       ELSIF (CLK'EVENT AND CLK='1') THEN       FOR I IN 3 DOWNTO 1 LOOP       N_T(I)<=N_T(I-1);       END LOOP; 

53、0;     N_T(0)<=KEY;    END IF;    END PROCESS SHIFT;    NEW_TIME<=N_T;END ARCHITECTURE ART;  4.6、顯示驅(qū)動器源程序DISPLAY_DRIVER.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE WORK.P_ALARM.ALL;ENTITY DISPLAY

54、_DRIVER IS PORT(ALARM_TIME:IN T_CLOCK_TIME;      CURRENT_TIME:IN T_CLOCK_TIME;      NEW_TIME:IN T_CLOCK_TIME;      SHOW_NEW_TIME:IN STD_LOGIC;      SHOW_A:IN STD_LOGIC; &

55、#160;    SOUND_ALARM:OUT STD_LOGIC;      DISPLAY:OUT T_DISPLAY);END ENTITY DISPLAY_DRIVER;ARCHITECTURE ART OF DISPLAY_DRIVER IS  SIGNAL DISPLAY_TIME: T_CLOCK_TIME;  BEGIN  CTRL:PROCESS(ALARM_TIME, CURRENT_TIME, NEW_TIME,

56、 SHOW_A, SHOW_NEW_TIME)  BEGIN     SOUND_LP: FOR I IN ALARM_TIME'RANGE LOOP     IF NOT(ALARM_TIME(I)=CURRENT_TIME(I) THEN          SOUND_ALARM<='0'    

57、0;     EXIT SOUND_LP;       ELSE          SOUND_ALARM<='1'      END IF;      END LOOP SOUND_LP;    

58、   IF SHOW_NEW_TIME='1' THEN          DISPLAY_TIME<=NEW_TIME;       ELSIF SHOW_A='1' THEN          DISPLAY_TIME<=ALARM_TIME;

59、0;      ELSIF SHOW_A='0' THEN          DISPLAY_TIME<=CURRENT_TIME;       ELSE         ASSERT FALSE REPORT "UNCERTAIN DISPLAY

60、_DRIVER CONTROL!"         SEVERITY WARNING;     END IF;END PROCESS CTRL;DISP:PROCESS(DISPLAY_TIME)BEGIN       FOR I IN DISPLAY_TIME'RANGE LOOP       &#

61、160; DISPLAY(I)<=SEVEN_SEG(DISPLAY_TIME(I);       END LOOP;       END PROCESS DISP;END ARCHITECTURE ART;  4.7、分頻器源程序FQ_DIVIDER.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE WORK.P_ALARM.ALL;ENTITY FQ_DIVIDER IS

62、  PORT(CLK_IN:IN STD_LOGIC;       RESET:IN STD_LOGIC;       CLK_OUT:OUT STD_LOGIC);END ENTITY FQ_DIVIDER;ARCHITECTURE ART OF FQ_DIVIDER IS  CONSTANT DIVIDE_PERIOD:T_SHORT:=6000;  BEGIN  DIVI

63、DE_CLK: PROCESS(CLK_IN, RESET)   VARIABLE CNT : T_SHORT;  BEGIN  IF(RESET='1') THEN     CNT:=0;     CLK_OUT<='0'  ELSIF RISING_EDGE(CLK_IN) THEN    IF(CNT<(DIVIDE_

64、PERIOD/2) THEN    CLK_OUT<='1'    CNT:=CNT+1;     ELSIF(CNT<(DIVIDE_PERIOD-1) THEN    CLK_OUT<='0'    CNT:=CNT+1;  ELSE    CNT:=0; 

65、0;   END IF;     END IF;     END PROCESS DIVIDE_CLK;END ARCHITECTURE ART;  4.8、控制器源程序ALARM_CONTROLLER.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE WORK.P_ALARM.ALL;ENTITY ALARM_CONTROLLER ISPORT(KEY : IN STD_LOGIC; &#

66、160;   ALARM_BUTTON : IN STD_LOGIC;     TIME_BUTTON : IN STD_LOGIC;     CLK : IN STD_LOGIC;     RESET : IN STD_LOGIC;     LOAD_NEW_A : OUT STD_LOGIC;     LOAD_N

67、EW_C : OUT STD_LOGIC;     SHOW_NEW_TIME : OUT STD_LOGIC;     SHOW_A : OUT STD_LOGIC);END ENTITY ALARM_CONTROLLER;ARCHITECTURE ART OF ALARM_CONTROLLER ISTYPE T_STATE IS (S0, S1, S2, S3, S4);CONSTANT KEY_TIMEOUT : T_SHORT:=500;CONSTANT SHOW_ALARM_TIMEO

68、UT : T_SHORT:=500;SIGNAL CURR_STATE : T_STATE;SIGNAL NEXT_STATE : T_STATE;SIGNAL COUNTER_K : T_SHORT;SIGNAL ENABLE_COUNT_K : STD_LOGIC;SIGNAL COUNT_K_END : STD_LOGIC; SIGNAL COUNTER_A : T_SHORT;SIGNAL ENABLE_COUNT_A : STD_LOGIC;SIGNAL COUNT_A_END : STD_LOGIC;BEGIN PROCESS(CLK, RESET) 

69、 BEGIN  IF RESET='1' THEN    CURR_STATE<=S0;  ELSIF RISING_EDGE(CLK) THEN    CURR_STATE<=NEXT_STATE;  END IF;END PROCESS;PROCESS(KEY, ALARM_BUTTON, TIME_BUTTON, CURR_STATE, COUNT_A_END, COUNT_K_END)  B

70、EGIN  NEXT_STATE<=CURR_STATE;  LOAD_NEW_A<='0'  LOAD_NEW_C<='0'  SHOW_A<='0'  SHOW_NEW_TIME<='0'  ENABLE_COUNT_K<='0'  ENABLE_COUNT_A<='0'  CASE CURR_S

71、TATE IS  WHEN S0=>     IF (KEY='1') THEN        NEXT_STATE<=S1;        SHOW_NEW_TIME<='1'     ELSIF (ALARM_BUTTON='1') THEN

72、0;       NEXT_STATE<=S4;        SHOW_A<='1'     ELSE        NEXT_STATE<=S0;     END IF;  WHEN S1=> &

73、#160;   IF (KEY='1') THEN        NEXT_STATE<=S1;     ELSIF (ALARM_BUTTON='1') THEN        NEXT_STATE<=S2;        LOAD_

74、NEW_A<='1'     ELSIF (TIME_BUTTON='1') THEN        NEXT_STATE<=S3;        LOAD_NEW_C<='1'     ELSE      

75、60; IF (COUNT_K_END='1') THEN          NEXT_STATE<=S0;        ELSE          NEXT_STATE<=S1;        EN

76、D IF;        ENABLE_COUNT_K<='1'     END IF;          SHOW_NEW_TIME<='1'  WHEN S2=>     IF (ALARM_BUTTON='1') THEN

77、60;       NEXT_STATE<=S2;        LOAD_NEW_A<='1'     ELSE        NEXT_STATE<=S0;     END IF;  WHEN S3=>&#

78、160;    IF (TIME_BUTTON='1') THEN        NEXT_STATE<=S3;        LOAD_NEW_C<='1'     ELSE        NEXT_STATE<=S0

79、;     END IF;  WHEN S4=>     IF (KEY='1') THEN        NEXT_STATE<=S1; ELSE    NEXT_STATE<=S4;IF (COUNT_A_END='1') THENNEXT_STATE<=S0;  EL

80、SE    NEXT_STATE<=S4;SHOW_A<='1'END IF;ENABLE_COUNT_A<='1'END IF;WHEN OTHERS=>NULL;END CASE;END PROCESS;COUNT_KEY: PROCESS(ENABLE_COUNT_K, CLK)BEGINIF (ENABLE_COUNT_K='0') THEN   COUNTER_K<=0;   COUNT_K_END<=

81、'0'   ELSIF (RISING_EDGE(CLK) THEN   IF (COUNTER_K>=KEY_TIMEOUT) THEN   COUNT_K_END<='1'   ELSE   COUNTER_K<=COUNTER_K+1;    END IF;    END IF;END PROCESS COUNT

82、_KEY;COUNT_ALARM: PROCESS(ENABLE_COUNT_A, CLK)   BEGIN   IF (ENABLE_COUNT_A='0') THEN      COUNTER_A<=0;      COUNT_A_END<='0'   ELSIF RISING_EDGE(CLK) THEN   

83、;IF (COUNTER_A>=SHOW_ALARM_TIMEOUT) THEN      COUNT_A_END<='1'      ELSE      COUNTER_A<=COUNTER_A+1;      END IF;    END IF;END PROCESS COUNT_

84、ALARM;END ARCHITECTURE ART;  4.9、鬧鐘系統(tǒng)的整體組裝源程序ALARM_CLOCK.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE WORK.P_ALARM.ALL;ENTITY ALARM_CLOCK IS  PORT(KEYPAD: IN STD_LOGIC_VECTOR(9 DOWNTO 0);       KEY_DOWN: IN STD

85、_LOGIC;       ALARM_BUTTON: IN STD_LOGIC;       TIME_BUTTON: IN STD_LOGIC;       CLK : IN STD_LOGIC;       RESET: IN STD_LOGIC;     

86、60; DISPLAY: OUT T_DISPLAY;       SOUND_ALARM:OUT STD_LOGIC);END ENTITY ALARM_CLOCK;ARCHITECTURE ART OF ALARM_CLOCK IS  COMPONENT DECODER IS  PORT( KEYPAD:IN STD_LOGIC_VECTOR(9 DOWNTO 0);        VALUE

87、 :OUT T_DIGITAL);  END COMPONENT DECODER;  COMPONENT KEY_BUFFER IS  PORT(KEY:IN T_DIGITAL;       CLK:IN STD_LOGIC;       RESET:IN STD_LOGIC;       NEW_TIME:OUT T_CLO

88、CK_TIME);  END COMPONENT KEY_BUFFER;  COMPONENT ALARM_CONTROLLER IS  PORT(KEY:IN STD_LOGIC;       ALARM_BUTTON:IN STD_LOGIC;       TIME_BUTTON:IN STD_LOGIC;       CL

89、K:IN STD_LOGIC;       RESET:IN STD_LOGIC;       LOAD_NEW_A:OUT STD_LOGIC;       LOAD_NEW_C:OUT STD_LOGIC;       SHOW_NEW_TIME:OUT STD_LOGIC;       SHOW_A:OUT STD_LOGIC);  END COMPONENT ALARM_CONTROLLER;  COMPONENT ALA

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論