2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩32頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  EDA技術(shù)</b></p><p>  課 程 設(shè) 計 報 告</p><p>  課題 數(shù)字時鐘 </p><p>  姓 名 </p><p>  學(xué) 號 </p&g

2、t;<p>  專業(yè)班級 </p><p>  指導(dǎo)教師 </p><p>  時 間 </p><p><b>  課程設(shè)計任務(wù)書</b></p><p><b>  數(shù)字鐘

3、設(shè)計</b></p><p><b>  摘 要</b></p><p>  人類社會已進(jìn)入到高度發(fā)達(dá)的信息化社會。信息化社會的發(fā)展離不開電子信息產(chǎn)品開發(fā)技術(shù)、產(chǎn)品品質(zhì)的提高和進(jìn)步。實(shí)現(xiàn)這種進(jìn)步的主要原因就是電子設(shè)計技術(shù)和電子制造技術(shù)的發(fā)展,其核心就是電子設(shè)計自動化技術(shù),EDA技術(shù)的發(fā)展和推廣應(yīng)用又極大的推動了電子信息產(chǎn)業(yè)的發(fā)展。</p>

4、<p>  EDA技術(shù)在電子系統(tǒng)設(shè)計領(lǐng)域越來越普及,本設(shè)計主要利用VHDL語言在EDA平臺上設(shè)計一個電子數(shù)字鐘,它的計時為24小時小時制,顯示滿刻度為23時59分59秒,另外還具有校時功能和鬧鐘功能??偟某绦蛴蓭讉€各具不同功能的單元模塊程序拼接而成,其中包括分頻程序模塊、時分秒計時、校時程序模塊、鬧鐘控制器程序模塊、預(yù)制寄存器模塊、鬧鐘寄存器程序模塊和顯示驅(qū)動器程序設(shè)計。且使用QUARTUS II 軟件進(jìn)行電路波形仿真,下載到

5、EDA實(shí)驗(yàn)箱進(jìn)行驗(yàn)證。</p><p>  關(guān)鍵詞 數(shù)字鐘;EDA;vhdl語言</p><p><b>  目 錄</b></p><p><b>  課程設(shè)計任務(wù)書I</b></p><p><b>  摘 要II</b></p><p>

6、<b>  1設(shè)計概述1</b></p><p><b>  2設(shè)計方案2</b></p><p>  2.1系統(tǒng)設(shè)計方案2</p><p><b>  3設(shè)計實(shí)現(xiàn)4</b></p><p>  3.1鬧鐘控制器實(shí)現(xiàn)4</p><p>

7、;  3.2預(yù)置寄存器實(shí)現(xiàn)4</p><p>  3.3鬧鐘寄存器實(shí)現(xiàn)4</p><p>  3.4分頻電路實(shí)現(xiàn)5</p><p>  3.5時鐘計數(shù)器實(shí)現(xiàn)5</p><p>  3.6顯示驅(qū)動器實(shí)現(xiàn)5</p><p>  3.7頂層原件實(shí)現(xiàn)5</p><p><b

8、>  4設(shè)計驗(yàn)證6</b></p><p>  4.1鬧鐘控制器驗(yàn)證6</p><p>  4.2預(yù)置寄存器驗(yàn)證6</p><p>  4.3鬧鐘寄存器驗(yàn)證6</p><p>  4.4分頻電路驗(yàn)證7</p><p>  4.5時鐘計數(shù)器驗(yàn)證7</p><p

9、>  4.6顯示驅(qū)動器驗(yàn)證8</p><p><b>  5總結(jié)9</b></p><p><b>  參考文獻(xiàn)10</b></p><p><b>  附錄11</b></p><p><b>  設(shè)計概述</b></p>

10、<p>  數(shù)字鐘是一種用數(shù)字電路技術(shù)實(shí)現(xiàn)時、分、秒計時的鐘表。與機(jī)械鐘相比具有更高的準(zhǔn)確性和直觀性,具有更長的使用壽命,已得到廣泛的使用。數(shù)字鐘的設(shè)計方法有許多種,例如可用中小規(guī)模集成電路組成電子鐘,也可以利用專用的電子鐘芯片配以顯示電路及其所需要的外圍電路組成電子鐘,還可以利用單片機(jī)來實(shí)現(xiàn)電子鐘等等。這些方法都各有其特點(diǎn),其中利用單片機(jī)實(shí)現(xiàn)的電子鐘具有編程靈活,以便于功能的擴(kuò)展[1]。</p><p&

11、gt;  數(shù)字鐘無非就是分頻計數(shù),設(shè)計出60進(jìn)制,24進(jìn)制計數(shù)器,在這里,秒分計數(shù)是60進(jìn)制,時計數(shù)是24進(jìn)制,對1Hz信號進(jìn)行60分頻也就產(chǎn)生了分計數(shù)脈沖,對1Hz進(jìn)行3600分頻也就產(chǎn)生了時計數(shù)脈沖,為了方便校時,系統(tǒng)設(shè)計時未直接采用試驗(yàn)箱上的1Hz作為基準(zhǔn)時鐘源,而是對1kHz進(jìn)行1000分頻產(chǎn)生秒脈沖,1000分頻作為校時與鬧鐘時間設(shè)置脈沖,為方便調(diào)鬧鐘,采用了數(shù)據(jù)選擇器選擇輸出正常走時或鬧鐘時間。利用位選信號進(jìn)行動態(tài)掃描,點(diǎn)亮

12、數(shù)碼管,顯示正常的計時時間。</p><p><b>  設(shè)計方案</b></p><p><b>  設(shè)計要求</b></p><p>  在EDA實(shí)驗(yàn)箱上利用FPGA、LED彩燈及數(shù)碼管實(shí)現(xiàn)數(shù)字鐘設(shè)計,功能要求如下:</p><p>  由試驗(yàn)箱上的時鐘信號經(jīng)分頻產(chǎn)生秒脈沖;</p>

13、<p>  用60進(jìn)制和24進(jìn)制實(shí)現(xiàn)計時;</p><p>  可手動校時,能分別進(jìn)行時分的校正;</p><p>  可設(shè)置鬧時功能,當(dāng)計時到預(yù)定時間時,揚(yáng)聲器發(fā)出鬧鈴信號; </p><p><b>  系統(tǒng)設(shè)計方案</b></p><p>  經(jīng)過參考和分析后[2][3],得到數(shù)字鐘設(shè)計的總體設(shè)計方案

14、,總體設(shè)計方案的組成模塊及模塊間的關(guān)系如下圖所示:</p><p>  圖 21數(shù)字鐘設(shè)計原理圖</p><p>  數(shù)字時鐘設(shè)計總體設(shè)計方案中各模塊的主要功能如下:</p><p>  鬧鐘控制器模塊:通過有限狀態(tài)機(jī)(FSM)的方式來實(shí)現(xiàn)。估計設(shè)計要求及端口設(shè)置,需要五個狀態(tài)來實(shí)現(xiàn):</p><p>  S0:表示電路初態(tài)即正常時鐘計數(shù)狀

15、態(tài),完成計時功能;</p><p>  S1:接收預(yù)置數(shù)字輸入狀態(tài)。在狀態(tài)S0時用戶按下“key”鍵后進(jìn)入此狀態(tài)。在此狀態(tài)下,顯示屏上顯示的是用戶預(yù)置的數(shù)字。</p><p>  S2:設(shè)置新的鬧鐘時間。在狀態(tài)S1時用戶按下“alarm”鍵后進(jìn)入此狀態(tài)。</p><p>  S3:設(shè)置新的計時器時間。在狀態(tài)S1時用戶按下“time”鍵后進(jìn)入此狀態(tài)。</p>

16、;<p>  S4:顯示鬧鐘時間。在狀態(tài)S0時用戶直接按下“alarm”鍵后進(jìn)入此狀態(tài)。在此狀態(tài)下,顯示屏上顯示的是所設(shè)置的鬧鐘時間。注意:在此狀態(tài)下,用戶按下“alarm”鍵后,顯示屏上保持顯示鬧鐘時間,經(jīng)過一段時間以后,再返回狀態(tài)S0顯示計時器時間。</p><p>  預(yù)置寄存器模塊:這是一個預(yù)置數(shù)字產(chǎn)生器和移位寄存器的結(jié)合體。</p><p>  鬧鐘寄存器模塊:在鬧

17、鐘上升沿同步下,根據(jù)load_new_a端口的輸入信號控制alarm_time端口的輸出。</p><p>  分頻模塊:將clk_in端口輸入的時鐘信號分頻后送給clk_out端口。</p><p>  時間計數(shù)模塊:由分頻電路的clk_out輸出提供1Hz的計數(shù)脈沖,實(shí)現(xiàn)秒分時的計時。</p><p>  顯示驅(qū)動模塊:根據(jù)三個位選信號的動態(tài)掃描,讓數(shù)碼管點(diǎn)亮并

18、顯示時間和預(yù)置數(shù)。</p><p>  頂層模塊:調(diào)用以上所有模塊,完成實(shí)驗(yàn)設(shè)計。</p><p><b>  設(shè)計實(shí)現(xiàn)</b></p><p><b>  鬧鐘控制器實(shí)現(xiàn)</b></p><p>  Clk為時鐘外部,rst為復(fù)位信號。當(dāng)key為高電平時,表示用戶按下數(shù)字鍵(“0”~“9”)。當(dāng)a

19、larm_button為高電平時,表示用戶按下alarm鍵。當(dāng)time_button為高電平時,表示用戶按下time鍵。當(dāng)load_new_a為高電平時,控制加載新的鬧鐘時間值。當(dāng)load_new_c為高電平時,控制設(shè)置新的時間。 </p><p>  當(dāng)show_new_time為高電平時,控制數(shù)碼管顯示新的時間值;當(dāng)其為低電平,show_a為高電平時,控制顯示鬧鐘時間,否則,顯示當(dāng)前時間。圖3.1

20、為鬧鐘控制器示意圖。</p><p><b>  預(yù)置寄存器實(shí)現(xiàn)</b></p><p>  這是一個預(yù)置數(shù)字產(chǎn)生器和移位寄存器的結(jié)合體。通過對key進(jìn)行操作,選擇輸入欲預(yù)置的數(shù)字,暫存用戶輸入的數(shù)字,且用戶每輸入一個數(shù)字,暫存數(shù)字移位一次,實(shí)現(xiàn)用戶輸入數(shù)字在顯示屏上從右到左的依次顯示。圖3.2為預(yù)置寄存器示意圖。</p><p><b&

21、gt;  鬧鐘寄存器實(shí)現(xiàn)</b></p><p>  鬧鐘寄存器模塊的功能是在時鐘上升沿同步下,根據(jù)load_new_a端口的輸入信號控制alarm_time端口的輸出;當(dāng)控制信號為高電平時,把new_alarm_time端口的輸入信號值輸出;rst端口輸入信號對alarm_time端口輸出進(jìn)行異步的清零復(fù)位。圖3.3為鬧鐘寄存器的示意圖。 </p><p

22、><b>  分頻電路實(shí)現(xiàn)</b></p><p>  本模塊的功能是將clk_in端口輸入的時鐘信號分頻后送給clk_out端口;當(dāng)rst端口輸入信號為高電平時,clk_out端口輸出信號清零。圖3.4為分頻電路示意圖。

23、 </p><p><b>  時鐘計數(shù)器實(shí)現(xiàn)</b></p><p>  時間計數(shù)器模塊的功能是當(dāng)rst端口輸入信號為高電平時,對current_time端口輸出信號清零復(fù)位;當(dāng)load_new_c端口輸入信號為高電平時,將new_current_time端口的輸入信號輸出給current_time端口。Rst端口的控制優(yōu)于

24、load_new_c端口。當(dāng)這兩個控制信號都無效時,在時鐘上升沿同步下,對current_time端口輸出信號累加1,并根據(jù)小時,分鐘,秒的規(guī)律處理進(jìn)位。圖3.5為時間計數(shù)器示意圖。 </p><p><b>  顯示驅(qū)動器實(shí)現(xiàn)</b></p><p>  本模塊的功能是

25、:當(dāng)show_new_time端口輸入信號有效時,根據(jù)new_time端口輸入信號,產(chǎn)生相應(yīng)的6個待顯示的數(shù)據(jù);當(dāng)show_new_time端口輸入信號無效時,判斷show_a端口的輸入信號,為高電平時,據(jù)alarm_time端口的輸入信號產(chǎn)生相應(yīng)的6個待顯示的數(shù)據(jù);為低電平時,據(jù)current_time端口的輸入信號,產(chǎn)生相應(yīng)的6個待顯示的數(shù)據(jù)。對于各個待顯示的數(shù)據(jù),根據(jù)動態(tài)掃描顯示方式在driver端口輸出相應(yīng)的數(shù)據(jù)顯示驅(qū)動信息和數(shù)

26、碼管選擇信息。當(dāng)alarm_time端口的輸入信號值與current_time端口的輸入信號值相同時,sound_alarm端口的輸出信號有效,反之無效。圖3.6為顯示驅(qū)動示意圖。</p><p><b>  頂層原件實(shí)現(xiàn)</b></p><p>  根據(jù)原理圖,定義端口的輸入和輸出信號。內(nèi)部就是對各個模塊的原件例,實(shí)現(xiàn)功能。</p><p>

27、<b>  設(shè)計驗(yàn)證</b></p><p><b>  鬧鐘控制器驗(yàn)證</b></p><p>  對鬧鐘控制模塊進(jìn)行仿真,得到仿真圖如下:</p><p>  圖 41鬧鐘控制器仿真圖</p><p>  當(dāng)clk事件發(fā)生,key和alarm_button為高電平時,在下一個時鐘上升沿到來時,

28、show_new_time有值的改變。當(dāng)rst為高電平時,show_new_time清零。</p><p><b>  預(yù)置寄存器驗(yàn)證</b></p><p>  對預(yù)置寄存器模塊進(jìn)行仿真,得到仿真圖如下:</p><p>  圖 42預(yù)置寄存器仿真圖</p><p>  時鐘事件發(fā)生時,keynum有0到9的順環(huán)輸出

29、。Rst的復(fù)位信號對keynum的輸出沒有影響,因?yàn)樗鼈儾皇峭贿M(jìn)程。</p><p><b>  鬧鐘寄存器驗(yàn)證</b></p><p>  對鬧鐘寄存器模塊進(jìn)行仿真,得到仿真圖如下:</p><p>  圖 43鬧鐘寄存器仿真圖</p><p>  讓load_new_a置高電平時,new_alarm_time有值

30、的改變。波形中沒有對alarm_time的設(shè)置,故此沒有它的相關(guān)波形。</p><p><b>  分頻電路驗(yàn)證</b></p><p>  對分頻模塊進(jìn)行仿真,得到仿真圖如下:</p><p>  對1Khz的時鐘進(jìn)行1000分頻。后經(jīng)rst復(fù)位后,clk_out輸出為低。</p><p>  時鐘計數(shù)器驗(yàn)證 &l

31、t;/p><p>  對時鐘計數(shù)器模塊進(jìn)行仿真,得到仿真圖如下:</p><p>  圖 45時鐘計數(shù)仿真圖</p><p>  在1KHz的脈沖下計數(shù)器計時。Rst為高電平時,時間復(fù)位。</p><p><b>  顯示驅(qū)動器驗(yàn)證</b></p><p>  對顯示驅(qū)動器模塊進(jìn)行仿真,得到仿真

32、圖如下:</p><p>  圖 46顯示驅(qū)動仿真圖</p><p>  伴隨著時鐘信號,位選有選擇的選中某個數(shù)碼管,并點(diǎn)亮它們。</p><p>  由于各個模塊仿真結(jié)果均達(dá)到了設(shè)計要求,因此可以將設(shè)計下載到試驗(yàn)箱上進(jìn)行驗(yàn)證。</p><p>  表 1端口和引腳的對應(yīng)關(guān)系</p><p><b>  總

33、結(jié)</b></p><p>  本實(shí)驗(yàn)我們實(shí)現(xiàn)了數(shù)字鐘設(shè)計中的計時功能,還有兩塊設(shè)置時間和鬧鐘的時間沒有在實(shí)驗(yàn)箱上實(shí)現(xiàn)。通過這次課程設(shè)計,加深了我對EDA這門課程的了解,并且更加熟悉軟件的操作。在這次課程設(shè)計中,我的主要任務(wù)是查閱各種相關(guān)資料,并且整理選擇其中需要的的確是很有難度。但在組員和其他同學(xué)以及老師的幫助下,我們還是收集了一些重要的代碼。但盡管資料豐富,可惜自己平時的學(xué)習(xí)沒有到位。還是未能順利

34、相對有用的部分進(jìn)行歸納。雖然中間遇到了不少的難題,在眾多的復(fù)雜資料中找出完成整個實(shí)驗(yàn),在設(shè)置時間鬧鈴是遇到的難題,始終難以克服。加上時間有限,只能留下這個遺憾。但是在未來的學(xué)習(xí)生活中,我會更加嚴(yán)格要求自己,努力克服這些難題。</p><p><b>  參考文獻(xiàn)</b></p><p>  百度文庫.數(shù)字鐘設(shè)計[EB/OL]. http://baike.baidu.c

35、om/link?url=MWdwBL06cnRZqwHfU2IOx4jIbR75C1QW1hwlhbrRbrvvf-V_BlgFo0_jyYL__ESeNDFLJ2WpNzwlHYE5EIVA_K,2014-1-6</p><p>  劉艷昌,王廷雨.基于FPGA的數(shù)字鐘系統(tǒng)設(shè)計[J].河南科技學(xué)院學(xué)報.2013,41(4):86-95</p><p>  孫維功.基于VHDL語言的數(shù)字鐘

36、設(shè)計[J].高科技產(chǎn)品研發(fā).2012,50-51</p><p>  中華文本庫.動態(tài)掃描數(shù)碼管顯示VHDL[EB/OL]. http://www.chinadmd.com/file/uazizp3vooarpxuox3piztiu_1.html,2014-1-7</p><p>  譚會生.EDA技術(shù)及應(yīng)用實(shí)踐[M]. 第二版.湖南:湖南大學(xué)出版社,2010.299-314 </p

37、><p><b>  附錄</b></p><p>  附錄1:鬧鐘控制器模塊</p><p>  PACKAGE P_ALARM IS --定義一個P_ALARM包</p><p>  subtype t_digital is integer range 0 to 9;</p>

38、;<p>  subtype t_short is integer range 0 to 65535;</p><p>  type t_clock_time is array(5 downto 0) of t_digital;</p><p>  type t_display is array(5 downto 0) of t_digital;</p><

39、;p>  end PACKAGE P_ALARM;</p><p>  library ieee;</p><p>  use ieee.std_logic_1164.all;</p><p>  use work.P_ALARM.all;</p><p>  entity control is </p><p>

40、;<b>  port(</b></p><p>  key:in std_logic; --若key=‘1’,則預(yù)置數(shù)被選中 </p><p>  alarm_button:in std_logic; --鬧鈴設(shè)置按鈕</p><p>  time_button:in std_logic

41、; --時間設(shè)置按鈕</p><p>  clk:in std_logic; --時間輸入</p><p>  rst:in std_logic; --復(fù)位信號</p><p>  load_new_a: out std_logic; --lo

42、ad_new_a=‘1’,控制加載新的鬧鐘時間值</p><p>  load_new_c:out std_logic; --load_new_c=‘1’,控制加載新的時間值</p><p>  show_new_time:out std_logic; --show_new_time=‘1’,控制數(shù)碼管顯示新的時間值</p><p&

43、gt;  show_a: out std_logic); --show_new_time=‘0’,且show_a=‘1’,控制顯示鬧--鐘時間,否則,顯示當(dāng)前時間</p><p>  end entity control;</p><p>  architecture art of control is </p><p>  type t

44、_state is(s0,s1,s2,s3,s4);</p><p>  constant key_timeout:t_short:=500;</p><p>  constant show_alarm_timeout:t_short:=500;</p><p>  signal curr_state:t_state;</p><p>  s

45、ignal next_state:t_state;</p><p>  signal counter_k:t_short;</p><p>  signal enable_count_k:std_logic;</p><p>  signal count_k_end:std_logic;</p><p>  signal counter_a:

46、t_short;</p><p>  signal enable_count_a:std_logic;</p><p>  signal count_a_end:std_logic;</p><p><b>  begin</b></p><p>  p1: process(clk,rst)

47、 --初始狀態(tài)</p><p><b>  begin</b></p><p>  if rst='1' then</p><p>  curr_state<=S0;</p><p>  elsif clk'event and clk='1' t

48、hen</p><p>  curr_state<=next_state;</p><p><b>  end if;</b></p><p>  end process p1;</p><p>  p2:process(key,alarm_button,time_button,curr_state,count_a

49、_end,count_k_end) --狀態(tài)轉(zhuǎn)換</p><p><b>  begin</b></p><p>  next_state<=curr_state;</p><p>  load_new_a<='0';</p><p>  load_new_c<='0'

50、;;</p><p>  show_a<='0';</p><p>  show_new_time<='0';</p><p>  enable_count_k<='0';</p><p>  enable_count_a<='0';</p>

51、<p>  case curr_state is</p><p>  when S0=>if (key='0') then --正常計時</p><p>  next_state<=S1;</p><p>  show_new_time<='1';</p><

52、p>  elsif (alarm_button='1') then</p><p>  next_state<=S4;</p><p>  show_a<='1';</p><p><b>  else</b></p><p>  next_state<=S0;&l

53、t;/p><p><b>  end if;</b></p><p>  when S1=>if (key='1') then --接收預(yù)置數(shù)字輸入狀態(tài)</p><p>  next_state<=S1;</p><p>  show_new_time<='1

54、';</p><p>  elsif (alarm_button='1') then</p><p>  next_state<=S2;</p><p>  load_new_a<='1';</p><p>  elsif (time_button='1') then<

55、/p><p>  next_state<=S3;</p><p>  load_new_c<='1';</p><p><b>  else</b></p><p>  if (count_k_end='1') then</p><p>  next_sta

56、te<=S0;</p><p><b>  else</b></p><p>  next_state<=S1;</p><p><b>  end if;</b></p><p>  enable_count_k<='1';</p><p>

57、;<b>  end if;</b></p><p>  show_new_time<='1';</p><p>  when S2=>if (alarm_button='1') then --設(shè)置新的鬧鐘時間</p><p>  next_state<=S2;</p>&l

58、t;p>  load_new_a<='1';</p><p><b>  else</b></p><p>  next_state<=S0;</p><p><b>  end if;</b></p><p>  when S3=>if (time_butt

59、on='1') then --設(shè)置新的計時時間</p><p>  next_state<=S3;</p><p>  load_new_c<='1';</p><p><b>  else</b></p><p>  next_state<=S0;</p

60、><p><b>  end if;</b></p><p>  when S4=>if (key='1') then --顯示鬧鐘時間</p><p>  next_state<=S1;</p><p><b>  else</b></p>

61、<p>  next_state<=S4;</p><p>  if (count_a_end='1') then</p><p>  next_state<=S0;</p><p><b>  else</b></p><p>  next_state<=S4;</p&

62、gt;<p>  show_a<='1';</p><p><b>  end if;</b></p><p>  enable_count_a<='1';</p><p><b>  end if;</b></p><p>  when o

63、thers=>null;</p><p><b>  end case;</b></p><p>  end process p2;</p><p>  count_key:process(enable_count_k,clk) --key進(jìn)程</p><p><b>  begi

64、n</b></p><p>  if(enable_count_k='0') then</p><p>  counter_k<=0;</p><p>  count_k_end<='0';</p><p>  elsif clk'event and clk='1'

65、; then</p><p>  if (counter_k>=key_timeout) then</p><p>  count_k_end<='1';</p><p><b>  else</b></p><p>  counter_k<=counter_k+1; </p>

66、;<p><b>  end if;</b></p><p><b>  end if;</b></p><p>  end process count_key;</p><p>  count_alarm:process(enable_count_a,clk) --鬧鐘進(jìn)程</p>

67、<p><b>  begin</b></p><p>  if (enable_count_a='0') then</p><p>  counter_a<=0;</p><p>  count_a_end<='0';</p><p>  elsif clk&#

68、39;event and clk='1' then</p><p>  if (counter_a>=show_alarm_timeout) then</p><p>  count_a_end<='1';</p><p><b>  else</b></p><p>  co

69、unter_a<=counter_a+1;</p><p><b>  end if;</b></p><p><b>  end if;</b></p><p>  end process count_alarm;</p><p>  end architecture art;

70、 </p><p>  附錄2:預(yù)置寄存器模塊</p><p>  library ieee;</p><p>  use ieee.std_logic_1164.all;</p><p>  use ieee.std_logic_unsigned.all;</p><p>  use work.P_ALARM.al

71、l;</p><p>  entity keybuffer is</p><p>  port(key:in std_logic; -- key輸入</p><p>  clk:in std_logic; --經(jīng)分頻后的時鐘脈沖信號</p><p>  rst:in std_

72、logic; --復(fù)位</p><p>  keynum:out std_logic_vector(3 downto 0); --預(yù)置數(shù)產(chǎn)生</p><p>  new_time:out t_clock_time); --新的鬧鐘時間或新的計時時間</p><p>  end entity keyb

73、uffer;</p><p>  architecture art of keybuffer is</p><p>  signal n_t:t_clock_time;</p><p>  signal cnt:std_logic_vector(3 downto 0);</p><p>  signal temp:t_digital;<

74、;/p><p><b>  begin</b></p><p>  process(clk)</p><p><b>  begin</b></p><p>  if clk'event and clk='1' then --內(nèi)部0到9的計時</p&g

75、t;<p>  if cnt=9 then</p><p>  cnt<="0000";</p><p><b>  else</b></p><p>  cnt<=cnt+1;</p><p><b>  end if;</b></p>

76、<p><b>  end if;</b></p><p>  temp<=conv_integer(cnt);</p><p>  keynum<=cnt;</p><p>  end process;</p><p>  shift:process(rst,key)

77、 --復(fù)位和新的時間或鬧鐘時間的產(chǎn)生</p><p><b>  begin</b></p><p>  if rst='1' then</p><p>  n_t(5)<=0;</p><p>  n_t(4)<=0;</p><p>  n_t

78、(3)<=0;</p><p>  n_t(2)<=0;</p><p>  n_t(1)<=0;</p><p>  n_t(0)<=0;</p><p>  elsif key'event and key='1' then</p><p>  for i in 5 d

79、ownto 1 loop</p><p>  n_t(i)<=n_t(i-1);</p><p><b>  end loop;</b></p><p>  n_t(0)<=temp;</p><p><b>  end if;</b></p><p>  end

80、 process shift;</p><p>  new_time<=n_t;</p><p>  end architecture art;</p><p>  附錄3:鬧鐘寄存器模塊</p><p>  library ieee;</p><p>  use ieee.std_logic_1164.all;

81、</p><p>  use work.P_ALARM.all;</p><p>  entity reg is</p><p><b>  port(</b></p><p>  new_alarm_time:in t_clock_time; --接收預(yù)置寄存器的new_time后,作為輸入</p>

82、<p>  load_new_a:in std_logic; --控制加載新的鬧鐘時間</p><p>  clk:in std_logic; --經(jīng)分頻后的脈沖輸入</p><p>  rst:in std_logi; --復(fù)位</p><p>  alarm

83、_time:out t_clock_time --鬧鐘</p><p><b>  );</b></p><p>  end entity reg;</p><p>  architecture art of reg is</p><p><b>  begin </b></p

84、><p>  process(clk,rst)</p><p><b>  begin</b></p><p>  if rst='1' then --讓秒分時清零</p><p>  alarm_time(0)<=0;</p>

85、<p>  alarm_time(1)<=0;</p><p>  alarm_time(2)<=0;</p><p>  alarm_time(3)<=0;</p><p>  alarm_time(4)<=0;</p><p>  alarm_time(5)<=0;</p><

86、p><b>  else</b></p><p>  if clk'event and clk='1' then</p><p>  if load_new_a='1' then --控制新的鬧鐘時間</p><p>  alarm_time&

87、lt;=new_alarm_time;</p><p><b>  end if;</b></p><p><b>  end if;</b></p><p><b>  end if;</b></p><p>  end process;</p><p&g

88、t;  end architecture art;</p><p>  附錄4:分頻電路模塊</p><p>  library ieee;</p><p>  use ieee.std_logic_1164.all;</p><p>  use work.P_ALARM.all;</p><p>  entity d

89、ivider is</p><p><b>  port(</b></p><p>  clk_in:in std_logic;</p><p>  rst:in std_logic;</p><p>  clk_out:out std_logic);</p><p>  end entity d

90、ivider;</p><p>  architecture art of divider is</p><p>  signal cnt_freq:integer range 0 to 999;</p><p>  signal clk_1Hz:std_logic;</p><p>  constant divide_period:t_sh

91、ort:=6000;</p><p><b>  begin</b></p><p>  process(clk_in,rst)</p><p>  variable cnt:t_short;</p><p><b>  begin</b></p><p>  if rst

92、='1' then --復(fù)位</p><p><b>  cnt:=0;</b></p><p>  clk_out<='0';</p><p>  elsif (clk_in'event and clk_in='1') then

93、 --分頻</p><p>  if (cnt<=(divide_period/2)) then</p><p>  clk_out<='1';</p><p>  cnt:= cnt+1;</p><p>  elsif (cnt < (divide_period-1)) then</p>

94、<p>  clk_out<='0';</p><p>  cnt:= cnt+1;</p><p><b>  else</b></p><p><b>  cnt:=0;</b></p><p><b>  end if;</b></p

95、><p><b>  end if;</b></p><p>  end process;</p><p>  end architecture art;</p><p>  附錄5:時間計數(shù)器模塊</p><p>  library ieee;</p><p>  use i

96、eee.std_logic_1164.all;</p><p>  use work.P_ALARM.all;</p><p>  entity counter is</p><p><b>  port(</b></p><p>  new_current_time:in t_clock_time;</p>

97、<p>  load_new_c,clk,rst:in std_logic;</p><p>  current_time:out t_clock_time);</p><p>  end entity counter;</p><p>  architecture art of counter is</p><p>  sig

98、nal i_current_time:t_clock_time;</p><p><b>  begin </b></p><p>  process(clk,rst,load_new_c)</p><p>  variable c_t:t_clock_time;</p><p><b>  begin<

99、/b></p><p>  if clk'event and clk='1' then</p><p>  if rst='1' then --復(fù)位</p><p>  i_current_time(5)<=0;</p><p>

100、  i_current_time(4)<=0;</p><p>  i_current_time(3)<=0;</p><p>  i_current_time(2)<=0;</p><p>  i_current_time(1)<=0;</p><p>  i_current_time(0)<=0;</p

101、><p>  elsif load_new_c='1' then --計時</p><p>  i_current_time<=new_current_time; </p><p>  else </p><p&

102、gt;  c_t:=i_current_time;</p><p>  if c_t(0)<9 then</p><p>  c_t(0):=c_t(0)+1;</p><p><b>  else</b></p><p>  c_t(0):=0;</p><p>  if c_t(1)&l

103、t;5 then</p><p>  c_t(1):=c_t(1)+1;</p><p><b>  else</b></p><p>  c_t(1):=0;</p><p>  if c_t(2)<9 then</p><p>  c_t(2):=c_t(2)+1;</p>

104、<p><b>  else</b></p><p>  c_t(2):=0;</p><p>  if c_t(3)<5 then</p><p>  c_t(3):=c_t(3)+1;</p><p><b>  else </b></p><p>  

105、c_t(3):=0;</p><p>  if c_t(5)<2 then</p><p>  if c_t(4)<9 then</p><p>  c_t(4):=c_t(4)+1;</p><p><b>  else</b></p><p>  c_t(4):=0;</p

106、><p>  c_t(5):=c_t(5)+1;</p><p><b>  end if;</b></p><p><b>  else</b></p><p>  if c_t(4)<3 then</p><p>  c_t(4):=c_t(4)+1;</p>

107、;<p><b>  else</b></p><p>  c_t(4):=0;</p><p>  c_t(5):=0;</p><p><b>  end if;</b></p><p><b>  end if;</b></p><p&g

108、t;<b>  end if;</b></p><p><b>  end if;</b></p><p><b>  end if;</b></p><p>  i_current_time<=c_t;</p><p><b>  end if;</b&

109、gt;</p><p>  i_current_time<=c_t;</p><p><b>  end if;</b></p><p><b>  end if;</b></p><p>  end process;</p><p>  current_time<

110、;=i_current_time;</p><p>  end architecture art;</p><p>  附錄6:顯示驅(qū)動模塊</p><p>  library ieee;</p><p>  use ieee.std_logic_1164.all;</p><p>  use ieee.std_log

111、ic_arith.all;</p><p>  use ieee.std_logic_unsigned.all;</p><p>  use work.P_ALARM.all;</p><p>  entity driver is</p><p><b>  port(</b></p><p> 

112、 keynum:in std_logic_vector(3 downto 0);</p><p>  clk:in std_logic;</p><p>  alarm_time:in t_clock_time;</p><p>  current_time:in t_clock_time;</p><p>  new_time:in t_c

113、lock_time;</p><p>  show_new_time:in std_logic;</p><p>  show_a:in std_logic;</p><p>  sound_alarm:out std_logic;</p><p>  ledw:out std_logic_vector(2 downto 0);</p&

114、gt;<p>  seg7:out std_logic_vector(7 downto 0)</p><p><b>  );</b></p><p>  end entity driver;</p><p>  architecture art of driver is</p><p>  signal

115、display_time:t_clock_time;</p><p>  signal temp:integer range 0 to 9;</p><p>  signal cnt:std_logic_vector(2 downto 0);</p><p><b>  begin</b></p><p>  a1: p

116、rocess(alarm_time,current_time,show_a,show_new_time)</p><p><b>  begin</b></p><p>  sound_lp:for i in alarm_time'range loop</p><p>  if not(alarm_time(i)=current_tim

117、e(i)) then</p><p>  sound_alarm<='0';</p><p><b>  else</b></p><p>  sound_alarm<='1';</p><p><b>  end if;</b></p>&

118、lt;p>  end loop sound_lp;</p><p>  if show_new_time='1' then</p><p>  display_time<=new_time;</p><p>  elsif show_a='1' then</p><p>  display_tim

119、e<=alarm_time;</p><p>  elsif show_a='0' then</p><p>  display_time<=current_time;</p><p><b>  end if;</b></p><p>  end process a1;</p>

120、<p>  a2: process(clk)</p><p><b>  begin</b></p><p>  if clk'event and clk='1' then --位選</p><p>  if cnt="111" then</p>

121、;<p>  cnt<="000";</p><p><b>  else</b></p><p>  cnt<=cnt+'1';</p><p><b>  end if;</b></p><p><b>  end if;&

122、lt;/b></p><p>  end process a2;</p><p>  ledw<=cnt;</p><p>  a3:process(cnt) --譯碼輸出</p><p><b>  begin</b></p

123、><p>  case cnt is</p><p>  when "000"=>temp<=display_time(0);</p><p>  when "001"=>temp<=display_time(1);</p><p>  when "010"=&g

124、t;temp<=display_time(2);</p><p>  when "011"=>temp<=display_time(3);</p><p>  when "100"=>temp<=display_time(4);</p><p>  when "101"=>

125、;temp<=display_time(5);</p><p>  when "111"=>temp<=conv_integer(keynum);</p><p>  when others=>temp<=0;</p><p><b>  end case;</b></p>&

126、lt;p>  case temp is --0 到9的段碼</p><p>  when 0=>seg7<="00111111";</p><p>  when 1=>seg7<="00000110";</p><p>  when 2=&g

127、t;seg7<="01011011";</p><p>  when 3=>seg7<="01001111";</p><p>  when 4=>seg7<="01100110";</p><p>  when 5=>seg7<="01101101&qu

128、ot;;</p><p>  when 6=>seg7<="01111101";</p><p>  when 7=>seg7<="00000111";</p><p>  when 8=>seg7<="01111111";</p><p>  w

129、hen 9=>seg7<="01101111";</p><p>  when others=>seg7<="01101111";</p><p><b>  end case;</b></p><p>  end process a3;</p><p> 

130、 end architecture art;</p><p>  附錄7:頂層原件模塊</p><p>  library ieee;</p><p>  use ieee.std_logic_1164.all;</p><p>  use ieee.std_logic_arith.all;</p><p>  use

131、 ieee.std_logic_unsigned.all;</p><p>  use work.P_ALARM.all;</p><p>  entity d_clock is</p><p>  port(key:in std_logic;</p><p>  clk:in std_logic;</p><p> 

132、 alarm_button:in std_logic;</p><p>  time_button:in std_logic;</p><p>  rst:in std_logic;</p><p>  sound_alarm:out std_logic;</p><p>  ledw:out std_logic_vector(2 downt

133、o 0);</p><p>  seg7:out std_logic_vector(7 downto 0)</p><p><b>  );</b></p><p>  end entity d_clock;</p><p>  architecture art of d_clock is</p><

134、p>  signal keynum1:std_logic_vector(3 downto 0);</p><p>  signal new_time1,current_time1,alarm_time1:t_clock_time;</p><p>  signal clk_out1,load_new_a1,load_new_c1,show_new_time1,show_a1:std_

溫馨提示

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

評論

0/150

提交評論