版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> VHDL綜合設(shè)計(jì)</b></p><p><b> 實(shí)驗(yàn)報(bào)告</b></p><p><b> 多功能電子計(jì)時(shí)器</b></p><p> 學(xué) 院 電子與信息學(xué)院 </p><p> 專 業(yè) 電子信息
2、科學(xué)類 </p><p> 評(píng)價(jià)等級(jí) </p><p> 姓 名 </p><p> 班 級(jí) </p><p> 提交日期 2013 年 2 月 27 日 </p><p>
3、;<b> 數(shù)字系統(tǒng)課程設(shè)計(jì)</b></p><p><b> 一、學(xué)時(shí)與學(xué)分</b></p><p> 課內(nèi)學(xué)時(shí):2周學(xué)分:2.0</p><p><b> 二、教學(xué)目的與要求</b></p><p> 本課程設(shè)計(jì)是一實(shí)踐性課程,要求學(xué)生用自頂向下的模塊設(shè)計(jì)
4、方法和VHDL語言完成一個(gè)小型數(shù)字系統(tǒng)的設(shè)計(jì),并可用可編程邏輯器件實(shí)現(xiàn)。</p><p><b> 三、教學(xué)安排</b></p><p> 1. 方案審核 </p><p> 要求2~3個(gè)學(xué)生自擬一個(gè)數(shù)字系統(tǒng)設(shè)計(jì)課題,其難度不得低于一個(gè)具有校時(shí)、整點(diǎn)報(bào)時(shí)
5、和鬧時(shí)功能的數(shù)字鐘。不允許抄襲他人的課題與方案。設(shè)計(jì)方案應(yīng)包括:設(shè)計(jì)要求、詳細(xì)框圖、控制器流程圖。學(xué)生在規(guī)定時(shí)間內(nèi)將設(shè)計(jì)方案與指導(dǎo)教師討論,通過后方可進(jìn)入下一階段學(xué)習(xí)(方案討論時(shí)間為15周3的課堂內(nèi))。</p><p> 2. 設(shè)計(jì)與實(shí)現(xiàn) </p><p> 在微機(jī)和進(jìn)階實(shí)驗(yàn)板平臺(tái)上完成,通過邏輯模擬和實(shí)
6、驗(yàn)板平臺(tái)功能驗(yàn)證。(因?qū)嶒?yàn)室板子有限,請(qǐng)同學(xué)們盡量利用課余時(shí)間到實(shí)驗(yàn)室調(diào)試)</p><p> 3. 驗(yàn)收 </p><p> 在進(jìn)階實(shí)驗(yàn)板上下載,由教師驗(yàn)收平分。</p><p> 4. 完成一份設(shè)計(jì)報(bào)告</p><p><b>
7、 四、評(píng)分標(biāo)準(zhǔn)</b></p><p><b> 比例: </b></p><p> 作品 80%</p><p> 報(bào)告 20%</p><p> 2. 從創(chuàng)新、思想、難度、設(shè)計(jì)成果的可靠性、合理性等方面綜合評(píng)價(jià)。</p><p>&l
8、t;b> 設(shè)計(jì)要求</b></p><p> 1. 本計(jì)時(shí)器存在電子時(shí)鐘、定時(shí)器和秒表三種功能,并可以通過開關(guān)的選擇,進(jìn)行不同功能的切換。</p><p> 2. 電子時(shí)鐘包括:24時(shí)制的時(shí)間顯示、日期顯示、星期顯示,并具有調(diào)時(shí)、整點(diǎn)報(bào)時(shí)和鬧鐘功能。</p><p> 3. 定時(shí)器可以進(jìn)行 0~9999秒的定時(shí),中途可以暫停,繼續(xù)和停止,定
9、時(shí)結(jié)束會(huì)自動(dòng)提醒。</p><p> 4. 秒表要求最大精度為0.01s,并且有暫停、繼續(xù)、重置按鈕</p><p><b> 進(jìn)度安排和任務(wù)分工</b></p><p><b> 1. 任務(wù)分工</b></p><p><b> 確定方案</b></p>
10、<p><b> 模塊及模塊接口確定</b></p><p><b> 任務(wù)分工</b></p><p><b> 程序編寫</b></p><p><b> 各自仿真實(shí)現(xiàn)</b></p><p><b> 整體調(diào)試<
11、/b></p><p><b> 整體仿真</b></p><p><b> 后期修改調(diào)整</b></p><p><b> 2. 進(jìn)度安排</b></p><p> 按模塊分工,以模塊難易程度均勻分工,力保成員都能真正參與到設(shè)計(jì)中來,拒絕打醬油</p>
12、;<p> 14周確定題目 15周做題目報(bào)告 </p><p><b> 期末前分工</b></p><p><b> 假期編寫各自模塊</b></p><p> 返校進(jìn)去整合以及后期處理</p><p><b> 設(shè)計(jì)環(huán)境</b></p>
13、<p> Quartus軟件,基于EP2C5T144C8芯片的開發(fā)板。</p><p><b> 整體設(shè)計(jì)</b></p><p> (有QuartusII RTL Viewer工具生成)</p><p><b> 設(shè)計(jì)模塊分析</b></p><p> 1. LCD1602液
14、晶顯示時(shí)鐘脈沖模塊</p><p> 本實(shí)驗(yàn)采用LCD1602液晶來顯示。1602液晶也叫1602字符型液晶,它是一種專門用來顯示字母、數(shù)字、符號(hào)等的點(diǎn)陣型液晶模塊。它由若干個(gè)5X7或者5X11等點(diǎn)陣字符位組成,每個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符,每位之間有一個(gè)點(diǎn)距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用,正因?yàn)槿绱怂运荒芎芎玫仫@示圖形。1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每
15、行16個(gè)字符液晶模塊(顯示字符和數(shù)字)。</p><p><b> ?。▓D片來源于網(wǎng)絡(luò))</b></p><p> 用于將實(shí)驗(yàn)板上的50MHz的信號(hào)分頻成為,適合于液晶顯示的時(shí)鐘頻率,經(jīng)過實(shí)驗(yàn)的測(cè)試以及查閱相關(guān)的資料,1602的時(shí)鐘可用周期為5ms的信號(hào),產(chǎn)生的信號(hào)適合于液晶顯示的正常工作。</p><p> 分頻器代碼實(shí)現(xiàn)如下:</
16、p><p> PROCESS(clk)</p><p> VARIABLE clk_out : std_logic := '0';</p><p><b> BEGIN</b></p><p> IF clk'event AND clk = '1' THEN</p>
17、<p> count <= count + 1;--脈沖信號(hào)的累計(jì)</p><p> IF count = 124999 THEN</p><p> clk_out := NOT clk_out;</p><p><b> END IF;</b></p><p> clk_l
18、cd <= clk_out;</p><p><b> END IF;</b></p><p> END PROCESS;</p><p> 2. 按鍵控制功能以及時(shí)間校準(zhǔn)模塊</p><p> 通過實(shí)驗(yàn)板上的4個(gè)按鍵實(shí)現(xiàn)多功能電子計(jì)時(shí)器的功能選擇,以及相應(yīng)的時(shí)鐘的調(diào)校、鬧鐘的設(shè)定、鬧鐘的停止開啟、定時(shí)器的
19、設(shè)定和秒表的控制。</p><p> 其實(shí)現(xiàn)在于按鍵的輸入,經(jīng)過key1_reg2、key1_reg1,兩個(gè)中間信號(hào)的消抖,從而正確的讀取按鍵的變換,從而進(jìn)行相應(yīng)的操作改變。</p><p><b> 代碼實(shí)現(xiàn):</b></p><p> PROCESS(clk)</p><p> VARIABLE count
20、: integer RANGE 0 TO 500000;</p><p><b> BEGIN</b></p><p> IF rising_edge(clk) THEN</p><p> count := count + 1;</p><p> IF(count = 500000) THEN</p>
21、<p> count := 0;</p><p> key1_reg1<=key1;</p><p> key2_reg1<=key2;</p><p> key3_reg1<=key3;</p><p> key4_reg1<=key4;</p><p><b&g
22、t; END IF;</b></p><p> key1_reg2<=key1_reg1;</p><p> key2_reg2<=key2_reg1;</p><p> key3_reg2<=key3_reg1;</p><p> key4_reg2<=key4_reg1;</p>
23、<p> key1_out<=key1_reg2 AND (NOT key1_reg1); --消抖</p><p> key2_out<=key2_reg2 AND (NOT key2_reg1);</p><p> key3_out<=key3_reg2 AND (NOT key3_reg1);</p><p> key4
24、_out<=key4_reg2 AND (NOT key4_reg1);</p><p><b> END IF;</b></p><p> END PROCESS;</p><p> 3. 功能模式選擇模塊</p><p> 通過一個(gè)按鍵的多次按下,用flag作為標(biāo)志位,通過flag的累加分別執(zhí)行0、1、
25、2、3,,分別對(duì)應(yīng)的時(shí)間顯示,鬧鐘,秒表,定時(shí)器。</p><p><b> 代碼實(shí)現(xiàn):</b></p><p> PROCESS(clk)</p><p><b> BEGIN</b></p><p> IF rising_edge(clk) THEN</p><p&g
26、t; IF(key='1') THEN</p><p> flag <= flag + 1; --flag的累加分別對(duì)因不同的功能顯示</p><p><b> END IF;</b></p><p><b> END IF;</b></p><p> END
27、PROCESS;</p><p> PROCESS(clk)</p><p><b> BEGIN</b></p><p> IF rising_edge(clk) THEN</p><p> CASE flag IS--用case語句分別根據(jù)flag進(jìn)入不同的功能</p><p>
28、 WHEN 0 => mode_out <= "1000";</p><p> WHEN 1 => mode_out <= "0100";</p><p> WHEN 2 => mode_out <= "0010";</p><p> WHEN 3 => m
29、ode_out <= "0001";</p><p><b> END CASE;</b></p><p><b> END IF;</b></p><p> END PROCESS;</p><p><b> 時(shí)間+萬年歷模塊</b><
30、/p><p> 整個(gè)模塊共有六個(gè)進(jìn)程:分別是調(diào)校時(shí)間的閃爍進(jìn)程、時(shí)間日期輸出進(jìn)程、時(shí)鐘萬年歷邏輯進(jìn)程、鬧鐘進(jìn)程、鬧鈴進(jìn)程、鬧鐘設(shè)置進(jìn)程。</p><p> 閃爍進(jìn)程,通過標(biāo)志位的scan_flag的取反,進(jìn)行顯示和不顯示的切換,從而達(dá)到閃爍的效果。</p><p> 時(shí)間日期輸出進(jìn)程,通過各自時(shí)間日期的temp信號(hào)的改變,賦予相應(yīng)的輸出管教,來顯示時(shí)間同時(shí)時(shí)間的計(jì)
31、時(shí)。</p><p> 時(shí)鐘萬年歷邏輯進(jìn)程,即時(shí)間24時(shí)制的VHDL邏輯表示以及萬年歷中關(guān)于月份閏年不閏年的邏輯關(guān)系。</p><p> 鬧鐘進(jìn)程:通過IF語句判斷當(dāng)前時(shí)間是否為設(shè)定的時(shí)間,盡在鬧鐘打開以及時(shí)間到達(dá)的時(shí)候才起作用,從而設(shè)置鬧鈴標(biāo)志位。</p><p> 鬧鈴進(jìn)程:控制鬧鈴的響起。</p><p> 鬧鐘設(shè)置進(jìn)程:進(jìn)行鬧
32、鐘的設(shè)定。</p><p> 實(shí)現(xiàn)代碼:見附錄1。</p><p><b> 5. 秒表模塊</b></p><p> 此模塊共有三個(gè)進(jìn)程,分別為顯示時(shí)間進(jìn)程、秒表計(jì)時(shí)進(jìn)程和秒表控制進(jìn)程。</p><p> 顯示時(shí)間進(jìn)程:同時(shí)間顯示進(jìn)程。</p><p> 秒表計(jì)時(shí)進(jìn)程:通過最小精度毫
33、秒計(jì)時(shí),來進(jìn)行最高99:99.99的計(jì)時(shí),該進(jìn)程實(shí)現(xiàn)了秒表的內(nèi)部實(shí)現(xiàn)邏輯。</p><p> 秒表控制進(jìn)程:通過狀態(tài)機(jī)控制復(fù)位、停止、計(jì)時(shí),暫停的不同狀態(tài),來實(shí)現(xiàn)對(duì)于秒表的控制。</p><p><b> ASM圖:</b></p><p> 實(shí)現(xiàn)代碼:見附錄2。</p><p><b> 6. 定時(shí)器
34、模塊</b></p><p> 本模塊利用狀態(tài)機(jī),用flag,分別來控制定時(shí)設(shè)置、定時(shí)、暫停繼續(xù)、停止</p><p><b> ASM圖:</b></p><p> 實(shí)現(xiàn)代碼:見附錄3。</p><p><b> 7. 三路選通器</b></p><p>
35、; 根據(jù)模式選擇模塊的選擇,選通不同的顯示內(nèi)容,實(shí)現(xiàn)時(shí)間、定時(shí)器以及秒表的分別顯示。</p><p><b> 代碼實(shí)現(xiàn):</b></p><p> PROCESS(clk)</p><p><b> BEGIN</b></p><p> IF rising_edge(clk) THEN&
36、lt;/p><p> IF key0='1' OR key1='1' THEN</p><p> DO0 <= DI0;</p><p> DO1 <= DI1;</p><p> DO2 <= DI2;</p><p> DO3 <= DI3;</p
37、><p> DO4 <= DI4;</p><p> DO5 <= DI5;</p><p> DO6 <= DI6;</p><p> DO7 <= DI7;</p><p> DO8 <= DI8;</p><p> DO9 <= DI9;<
38、/p><p> DO10 <= DI10;</p><p> DO11 <= DI11;</p><p> DO12 <= DI12;</p><p> ELSIF key2='1' THEN</p><p> DO0 <= DII0;</p><p&g
39、t; DO1 <= DII1;</p><p> DO2 <= DII2;</p><p> DO3 <= DII3;</p><p> DO4 <= DII4;</p><p> DO5 <= DII5;</p><p> DO6 <= DII6;</p>
40、<p> DO7 <= DII7;</p><p> DO8 <= DII8;</p><p> DO9 <= DII9;</p><p> DO10 <= DII10;</p><p> DO11 <= DII11;</p><p> DO12 <= DII
41、12;</p><p><b> ELSE</b></p><p> DO0 <= DIII0;</p><p> DO1 <= DIII1;</p><p> DO2 <= DIII2;</p><p> DO3 <= DIII3;</p><
42、;p> DO4 <= DIII4;</p><p> DO5 <= DIII5;</p><p> DO6 <= DIII6;</p><p> DO7 <= DIII7;</p><p> DO8 <= DIII8;</p><p> DO9 <= DIII9;&
43、lt;/p><p> DO10 <= DIII10;</p><p> DO11 <= DIII11;</p><p> DO12 <= DIII12;</p><p><b> END IF;</b></p><p><b> END IF;</b>
44、</p><p> END PROCESS;</p><p> 8. LCD1602液晶顯示驅(qū)動(dòng)</p><p> 本模塊是有了狀態(tài)機(jī)的嵌套。先使用一個(gè)狀態(tài)機(jī)對(duì)1602進(jìn)行顯示模式,顯示的位置等各種屬性的設(shè)置,然后再在顯示內(nèi)容的地方再用一個(gè)狀態(tài)機(jī)來顯示時(shí)間日期等內(nèi)容。</p><p> 通過上面的設(shè)置和狀態(tài)機(jī)的搭配,達(dá)到了使用VHDL
45、對(duì)1602進(jìn)行驅(qū)動(dòng)的目的。</p><p> 代碼實(shí)現(xiàn):見附錄4。</p><p><b> 總體功能描述</b></p><p> 1. 顯示第一行固定為萬年歷的顯示,第二行則是功能顯示,默認(rèn)為時(shí)鐘;</p><p> 2. 功能切換由4個(gè)按鍵完成;</p><p> 3. 時(shí)鐘,鬧鈴
46、,秒表,定時(shí)器間的切換由key1完成,按該按鈕依次切換;</p><p> 4. 在時(shí)鐘狀態(tài)下,按key4進(jìn)行功能切換,按第一下時(shí)鐘停止運(yùn)行,隨著按key4,依次為年,月,日,星期,時(shí),分,秒的修改,修改狀態(tài)下,按key3為加,key2為減,key4為確定;</p><p> 5. 在鬧鈴狀態(tài)下,按下key4可以修改鬧鈴時(shí)間,依次為時(shí),分,鬧鈴開關(guān),key2,key3的功能同上,鬧鈴響
47、起時(shí),按key2停止;</p><p> 6. 在秒表狀態(tài)下,按下key4可暫停/開始的切換,key3停止,key2重置,僅在停止?fàn)顟B(tài)下才能進(jìn)行重置操作;</p><p> 7. 在定時(shí)器狀態(tài)下,按下key4可設(shè)定定時(shí)時(shí)間時(shí)長,最大時(shí)長為99:59:59,設(shè)定好以后,按key3可開始/暫停定時(shí),暫?;虻褂?jì)時(shí)結(jié)束狀態(tài)下,按key2可自動(dòng)重載為上次設(shè)定定時(shí)時(shí)間,定時(shí)結(jié)束后,會(huì)有鈴聲提示,按
48、key2鍵停止響聲。</p><p><b> 系統(tǒng)的仿真與調(diào)試</b></p><p> 因?yàn)閱为?dú)的模塊管腳過多,單個(gè)模塊無法編譯成功,故這次設(shè)計(jì)沒有在軟件上進(jìn)行仿真,調(diào)試全都在自己購買的學(xué)習(xí)板上完成。</p><p> 本次調(diào)試遇到的問題主要都是LCD1602上顯示的問題。譬如寫定時(shí)器的模塊時(shí),第一行的萬年歷顯示正常,第二行開頭的TI
49、MER也顯示正常,但后面的顯示卻出現(xiàn)亂碼。首先在程序上把后面的程序都改為某個(gè)字符的靜態(tài)輸出,下載到板子上以后發(fā)現(xiàn)顯示正常,便可確定是定時(shí)器運(yùn)行的進(jìn)程部分出現(xiàn)問題。第一次認(rèn)真看了內(nèi)部邏輯以后發(fā)現(xiàn)不到問題,然后便把內(nèi)部的東西都忽略了看外圍的代碼,最后發(fā)現(xiàn)漏寫時(shí)鐘的邊沿觸發(fā),添加后便能正常顯示。</p><p> 類似的調(diào)試方法在本次實(shí)踐中屢屢出現(xiàn),主要便歸結(jié)為:若是功能出現(xiàn)問題就檢查代碼的邏輯性,若是顯示問題,先把
50、出現(xiàn)問題部分改為靜態(tài)輸出,逐步找出問題根源,若無問題再檢查代碼的邏輯問題,從里到外找出癥結(jié)所在。</p><p><b> 總結(jié)</b></p><p> 本次課程設(shè)計(jì)選取的題目算不上困難,在這次設(shè)計(jì)過程中,主要是鍛煉對(duì)LCD1602的顯示功能自學(xué)能力,團(tuán)隊(duì)合作能力,并使自己的代碼寫得更規(guī)范。沿著設(shè)計(jì)的進(jìn)展,代碼條理性明顯加強(qiáng),縮進(jìn)等細(xì)節(jié)也逐漸形成了自己的風(fēng)格。&
51、lt;/p><p><b> 附錄:</b></p><p><b> 部分模塊代碼:</b></p><p><b> 時(shí)間萬年歷模塊代碼</b></p><p> LIBRARY IEEE;</p><p> USE IEEE.std_logi
52、c_1164.ALL;</p><p> USE IEEE.std_logic_unsigned.ALL;</p><p> ENTITY clock IS</p><p><b> PORT(</b></p><p> clk_LCD : IN std_logic;</p><p>
53、clk : IN std_logic;</p><p> key1,key2,key3 : IN std_logic;</p><p> C_sel,A_sel : IN std_logic;</p><p> D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11,D12,D13,D14,D15,D16,D17,D18,D19,D20,D
54、21,D22,D23:OUT std_logic_vector(7 DOWNTO 0);</p><p> ring : OUT std_logic</p><p><b> );</b></p><p> END ENTITY;</p><p> ARCHITECTURE behav OF clock IS&l
55、t;/p><p> --時(shí)鐘,萬年歷部分</p><p> CONSTANT MON : std_logic_vector(23 DOWNTO 0) := "010011010100111101001110";--周一到周日的ASCII碼</p><p> CONSTANT TUE : std_logic_vector(23 DOWNTO 0
56、) := "010101000101010101000101";</p><p> CONSTANT WED : std_logic_vector(23 DOWNTO 0) := "010101110100010101000100";</p><p> CONSTANT THU : std_logic_vector(23 DOWNTO 0) :=
57、 "010101000100100001010101";</p><p> CONSTANT FIR : std_logic_vector(23 DOWNTO 0) := "010001100100100101010010";</p><p> CONSTANT SAT : std_logic_vector(23 DOWNTO 0) := &qu
58、ot;010100110100000101010100";</p><p> CONSTANT SUN : std_logic_vector(23 DOWNTO 0) := "010100110101010101001110";</p><p> SIGNAL y1 :std_logic_vector(7 DOWNTO 0) := "001100
59、10";--日期,yyyy-mm-dd</p><p> SIGNAL y2 :std_logic_vector(7 DOWNTO 0) := "00110000";</p><p> SIGNAL y3 :std_logic_vector(7 DOWNTO 0) := "00110001";</p><p&g
60、t; SIGNAL y4 :std_logic_vector(7 DOWNTO 0) := "00110011";</p><p> SIGNAL month :std_logic_vector(15 DOWNTO 0) := "0011000000110010";</p><p> SIGNAL date1 :std_logic_vector
61、(7 DOWNTO 0) := "00110010";</p><p> SIGNAL date2 :std_logic_vector(7 DOWNTO 0) := "00111000";</p><p> SIGNAL wd :std_logic_vector(23 DOWNTO 0) := "01010100010101010100
62、0101";--星期</p><p> SIGNAL h1 : std_logic_vector(7 DOWNTO 0) := "00110010";-- 時(shí)間,hh:mm:ss</p><p> SIGNAL h2 : std_logic_vector(7 DOWNTO 0) := "00110011";</p>
63、;<p> SIGNAL m1 : std_logic_vector(7 DOWNTO 0) := "00110101";</p><p> SIGNAL m2 : std_logic_vector(7 DOWNTO 0) := "00111001";</p><p> SIGNAL s1 : std_logic_vector(7
64、 DOWNTO 0) := "00110101";</p><p> SIGNAL s2 : std_logic_vector(7 DOWNTO 0) := "00110000";</p><p><b> --顯示寄存器</b></p><p> SIGNAL y1_temp :std_logi
65、c_vector(7 DOWNTO 0);--DAY</p><p> SIGNAL y2_temp :std_logic_vector(7 DOWNTO 0);</p><p> SIGNAL y3_temp :std_logic_vector(7 DOWNTO 0);</p><p> SIGNAL y4_temp :std_logic_vector
66、(7 DOWNTO 0);</p><p> SIGNAL month_temp :std_logic_vector(15 DOWNTO 0);</p><p> SIGNAL date1_temp :std_logic_vector(7 DOWNTO 0);</p><p> SIGNAL date2_temp :std_logic_vector(7 DOW
67、NTO 0);</p><p> SIGNAL wd_temp :std_logic_vector(23 DOWNTO 0);--WEEKDAY</p><p> SIGNAL h1_temp : std_logic_vector(7 DOWNTO 0);-- TIME</p><p> SIGNAL h2_temp : std_logic_vec
68、tor(7 DOWNTO 0);</p><p> SIGNAL m1_temp : std_logic_vector(7 DOWNTO 0);</p><p> SIGNAL m2_temp : std_logic_vector(7 DOWNTO 0);</p><p> SIGNAL s1_temp : std_logic_vector(7 DOWNTO
69、0);</p><p> SIGNAL s2_temp : std_logic_vector(7 DOWNTO 0);</p><p> SIGNAL wd_state : integer RANGE 0 TO 6 := 4;</p><p><b> --鬧鐘部分信號(hào)</b></p><p> CONSTANT
70、 r_on : std_logic_vector(23 DOWNTO 0) := "010011110100111000100000";</p><p> CONSTANT r_off : std_logic_vector(23 DOWNTO 0) := "010011110100011001000110";</p><p> SIGNAL A_
71、h1 : std_logic_vector(7 DOWNTO 0) := "00110000";--鬧鐘時(shí)間顯示</p><p> SIGNAL A_h2 : std_logic_vector(7 DOWNTO 0) := "00110000";</p><p> SIGNAL A_m1 : std_logic_vector(7 DOWN
72、TO 0) := "00110000";</p><p> SIGNAL A_m2 : std_logic_vector(7 DOWNTO 0) := "00110000";</p><p> SIGNAL A_h1_temp : std_logic_vector(7 DOWNTO 0);</p><p> SIGNAL
73、 A_h2_temp : std_logic_vector(7 DOWNTO 0);</p><p> SIGNAL A_m1_temp : std_logic_vector(7 DOWNTO 0);</p><p> SIGNAL A_m2_temp : std_logic_vector(7 DOWNTO 0);</p><p> SIGNAL r_stat
74、e : std_logic_vector(23 DOWNTO 0);--鬧鈴開關(guān)顯示</p><p> SIGNAL scan_flag : std_logic;--產(chǎn)生閃爍的標(biāo)志</p><p> SIGNAL C_flag : integer RANGE 0 TO 8 := 0;--時(shí)鐘狀態(tài)的標(biāo)志</p><p> SIGNAL A_fla
75、g : integer RANGE 0 TO 3 := 0;--鬧鈴狀態(tài)的標(biāo)志</p><p> SIGNAL r_flag : std_logic;--鬧鈴響,停的標(biāo)志</p><p> SIGNAL r_SW : std_logic :='0';--鬧鈴開關(guān)的狀態(tài)位</p><p> SIGNAL ring_temp :
76、 std_logic := '0';</p><p><b> BEGIN</b></p><p> PROCESS(clk)--產(chǎn)生調(diào)整時(shí)間時(shí)閃爍的標(biāo)志</p><p> VARIABLE count : integer RANGE 0 TO 10000000 := 0;</p><p>&l
77、t;b> BEGIN</b></p><p> IF rising_edge(clk) THEN</p><p> count := count + 1;</p><p> IF count = 10000000 THEN</p><p> count := 0;</p><p> sca
78、n_flag <= NOT scan_flag;</p><p><b> END IF;</b></p><p><b> END IF;</b></p><p> END PROCESS;</p><p> PROCESS(clk)--鬧鈴,時(shí)間顯示的狀態(tài)切換。</p&g
79、t;<p><b> BEGIN</b></p><p> IF rising_edge(clk) THEN</p><p> IF key1='1' THEN</p><p> IF C_sel='1' THEN</p><p> IF C_flag = 8 TH
80、EN</p><p> C_flag <= 0;</p><p><b> ELSE</b></p><p> C_flag <= C_flag + 1;</p><p><b> END IF;</b></p><p> ELSIF A_sel=
81、9;1' THEN</p><p> IF A_flag = 3 THEN</p><p> A_flag <= 0;</p><p><b> ELSE</b></p><p> A_flag <= A_flag + 1;</p><p><b> END
82、 IF;</b></p><p><b> END IF;</b></p><p><b> END IF;</b></p><p><b> END IF;</b></p><p> END PROCESS;</p><p> P
83、ROCESS(clk_LCD)--輸出到LCD的進(jìn)程</p><p><b> BEGIN</b></p><p> IF clk_LCD'EVENT AND clk_LCD='1' THEN</p><p> D0 <= y1_temp;</p><p> D1 <= y2
84、_temp;</p><p> D2 <= y3_temp;</p><p> D3 <= y4_temp;</p><p> D4 <= month_temp(15 DOWNTO 8);</p><p> D5 <= month_temp(7 DOWNTO 0);</p><p>
85、D6 <= date1_temp;</p><p> D7 <= date2_temp;</p><p> D8 <= wd_temp(23 DOWNTO 16);</p><p> D9 <= wd_temp(15 DOWNTO 8);</p><p> D10 <= wd_temp(7 DOWNTO
86、0);</p><p> IF C_sel='1' THEN</p><p> D11 <= "01000011";</p><p> D12 <= "01001100";</p><p> D13 <= "01001111";</p&
87、gt;<p> D14 <= "01000011";</p><p> D15 <= "01001011";</p><p> D16 <= h1_temp;</p><p> D17 <= h2_temp;</p><p> D18 <= m1_t
88、emp;</p><p> D19 <= m2_temp;</p><p> D20 <= "00111010";</p><p> D21 <= s1_temp;</p><p> D22 <= s2_temp;</p><p> D23 <= "
89、00100000";</p><p> ELSIF A_sel='1' THEN</p><p> D11 <= "01000001";</p><p> D12 <= "01001100";</p><p> D13 <= "0100000
90、1";</p><p> D14 <= "01010010";</p><p> D15 <= "01001101";</p><p> D16 <= A_h1_temp;</p><p> D17 <= A_h2_temp;</p><p&
91、gt; D18 <= A_m1_temp;</p><p> D19 <= A_m2_temp;</p><p> D20 <= "00100000";</p><p> D21 <= r_state(23 DOWNTO 16);</p><p> D22 <= r_state(15
92、 DOWNTO 8);</p><p> D23 <= r_state(7 DOWNTO 0);</p><p><b> END IF;</b></p><p><b> END IF;</b></p><p> END PROCESS;</p><p>
93、PROCESS(clk)--萬年歷,時(shí)鐘的調(diào)整與進(jìn)行</p><p> VARIABLE year : INTEGER RANGE 0 TO 9999;</p><p> VARIABLE count_1hz : integer RANGE 0 TO 50000000;</p><p><b> BEGIN</b></p>
94、<p> IF clk'EVENT AND clk='1' THEN</p><p> year := CONV_INTEGER(y1-"00110000")*1000+CONV_INTEGER(y2-"00110000")*100+CONV_INTEGER(y3-"00110000")*10+CONV_INTE
95、GER(y4-"00110000");</p><p> CASE C_flag IS</p><p><b> WHEN 0 =></b></p><p> count_1hz := count_1hz + 1;</p><p> IF count_1hz = 50000000 THE
96、N</p><p> count_1hz := 0;</p><p> IF s2 >= "00111001" THEN</p><p> s2 <= "00110000";</p><p> IF s1 >= "00110101" THEN</p&g
97、t;<p> s1 <= "00110000";</p><p> IF m2 >= "00111001" THEN</p><p> m2 <= "00110000";</p><p> IF m1 >= "00110101" THEN&l
98、t;/p><p> m1 <= "00110000";</p><p> IF h1 <= "00110001" THEN</p><p> IF h2 >= "00111001" THEN</p><p> h2 <= "00110000&qu
99、ot;;</p><p> h1 <= h1 + '1';</p><p><b> ELSE</b></p><p> h2 <= h2 + '1';</p><p><b> END IF;</b></p><p>&l
100、t;b> ELSE</b></p><p> IF h2 >= "00110011" THEN</p><p> h2 <= "00110000";</p><p> h1 <= "00110000";</p><p> wd_state
101、 <= wd_state + 1;</p><p> IF month="0011000000110001" OR month="0011000000110011" OR month="0011000000110101" OR month="0011000000110111" OR month="0011000000
102、111000" OR month="0011000100110000" OR month="0011000100110010" THEN</p><p> IF date1="00110011" AND date2="00110001" THEN</p><p> date1 <= &quo
103、t;00110000";</p><p> date2 <= "00110001";</p><p> IF month = "0011000100110010" THEN</p><p> month(15 DOWNTO 8) <= "00110000";</p>
104、<p> month(7 DOWNTO 0) <= "00110001";</p><p> IF y4="00111001" THEN</p><p> y4 <= "00110000";</p><p> IF y3="00111001" THEN&l
105、t;/p><p> y3 <= "00110000";</p><p> IF y2="00111001" THEN</p><p> y2 <= "00110000";</p><p> IF y1="00111001" THEN</p&g
106、t;<p> y1 <= "00110000";</p><p><b> ELSE</b></p><p> y1 <= y1 + '1';</p><p><b> END IF;</b></p><p><b>
107、 ELSE</b></p><p> y2 <= y2 + '1';</p><p><b> END IF;</b></p><p><b> ELSE</b></p><p> y3 <= y3 + '1';</p>
108、<p><b> END IF;</b></p><p><b> ELSE</b></p><p> y4 <= y4 + '1';</p><p><b> END IF;</b></p><p><b> ELSE<
109、;/b></p><p> month(7 DOWNTO 0) <= month(7 DOWNTO 0) + '1';</p><p><b> END IF;</b></p><p> ELSIF date2="00111001" THEN</p><p> da
110、te1 <= date1 + '1';</p><p> date2 <= "00110000";</p><p><b> ELSE</b></p><p> date2 <= date2 + '1';</p><p><b> E
111、ND IF;</b></p><p> ELSIF month="0011000000110010" THEN</p><p> IF ((year MOD 4 = 0) AND (NOT(year MOD 100 = 0))) OR (year MOD 400 = 0) THEN</p><p> IF date1="
112、;00110010" AND date2="00111001" THEN</p><p> date1 <= "00110000";</p><p> date2 <= "00110001";</p><p> month(7 DOWNTO 0) <= month(7 DO
113、WNTO 0) + '1';</p><p> ELSIF date2="00111001" THEN</p><p> date1 <= date1 + '1';</p><p> date2 <= "00110000";</p><p><b&
114、gt; ELSE</b></p><p> date2 <= date2 + '1';</p><p><b> END IF;</b></p><p><b> ELSE</b></p><p> IF date1="00110010"
115、; AND date2="00111000" THEN</p><p> date1 <= "00110000";</p><p> date2 <= "00110001";</p><p> month(7 DOWNTO 0) <= month(7 DOWNTO 0) + '
116、;1';</p><p> ELSIF date2="00111001" THEN</p><p> date1 <= date1 + '1';</p><p> date2 <= "00110000";</p><p><b> ELSE</
117、b></p><p> date2 <= date2 + '1';</p><p><b> END IF;</b></p><p><b> END IF;</b></p><p><b> ELSE</b></p><
118、p> IF date1="00110011" AND date2="00110000" THEN</p><p> date1 <= "00110000";</p><p> date2 <= "00110001";</p><p> IF month = &q
119、uot;0011000000111001" THEN</p><p> month(15 DOWNTO 8) <= month(15 DOWNTO 8) + '1';</p><p> month(7 DOWNTO 0) <= "00110000";</p><p><b> ELSE<
120、/b></p><p> month(7 DOWNTO 0) <= month(7 DOWNTO 0) + '1';</p><p><b> END IF;</b></p><p> ELSIF date2="00111001" THEN</p><p> dat
121、e1 <= date1 + '1';</p><p> date2 <= "00110000";</p><p><b> ELSE</b></p><p> date2 <= date2 + '1';</p><p><b> EN
122、D IF;</b></p><p><b> END IF;</b></p><p><b> ELSE</b></p><p> h2 <= h2 + '1';</p><p><b> END IF;</b></p>
123、<p><b> END IF;</b></p><p><b> ELSE</b></p><p> m1 <= m1 + '1';</p><p><b> END IF;</b></p><p><b> ELSE<
124、;/b></p><p> m2 <= m2 + '1';</p><p><b> END IF;</b></p><p><b> ELSE</b></p><p> s1 <= s1 + '1';</p><p>
125、;<b> END IF;</b></p><p><b> ELSE</b></p><p> s2 <= s2 + '1';</p><p><b> END IF;</b></p><p><b> END IF;</b&g
126、t;</p><p> y1_temp <= y1;</p><p> y2_temp <= y2;</p><p> y3_temp <= y3;</p><p> y4_temp <= y4;</p><p> month_temp <= month;</p>
127、<p> date1_temp <= date1;</p><p> date2_temp <= date2;</p><p> wd_temp <= wd;</p><p> h1_temp <= h1;</p><p> h2_temp <= h2;</p><p>
128、; m1_temp <= m1;</p><p> m2_temp <= m2;</p><p> s1_temp <= s1;</p><p> s2_temp <= s2;</p><p><b> WHEN 1 =></b></p><p> cou
129、nt_1hz := 0;</p><p> WHEN 2 =>--SET year</p><p> IF scan_flag='0' THEN</p><p> count_1hz := 0;</p><p> y1_temp <= "00100000";</p>&l
130、t;p> y2_temp <= "00100000";</p><p> y3_temp <= "00100000";</p><p> y4_temp <= "00100000";</p><p><b> ELSE</b></p>&l
131、t;p> count_1hz := 0;</p><p> y1_temp <= y1;</p><p> y2_temp <= y2;</p><p> y3_temp <= y3;</p><p> y4_temp <= y4;</p><p><b> END
132、IF;</b></p><p> IF key2='1' THEN--INCREASE</p><p> IF y4 >= "00111001" THEN</p><p> y4 <= "00110000";</p><p> IF y3 >= &
133、quot;00111001" THEN</p><p> y3 <= "00110000";</p><p> IF y2 = "00111001" THEN</p><p> y2 <= "00110000";</p><p> IF y1 = &qu
134、ot;00111001" THEN</p><p> y1 <= "00110000";</p><p><b> ELSE</b></p><p> y1 <= y1 + '1';</p><p><b> END IF;</b>&
135、lt;/p><p><b> ELSE</b></p><p> y2 <= y2 + '1';</p><p><b> END IF;</b></p><p><b> ELSE</b></p><p> y3 <=
136、 y3 + '1';</p><p><b> END IF;</b></p><p><b> ELSE</b></p><p> y4 <= y4 + '1';</p><p><b> END IF;</b></p>
137、;<p> ELSIF key3='1' THEN--DECREASE</p><p> IF y4 = "00110000" THEN</p><p> y4 <= "00111001";</p><p> IF y3 = "00110000" THEN<
138、;/p><p> y3 <= "00111001";</p><p> IF y2 = "00110000" THEN</p><p> y2 <= "00111001";</p><p> IF y1 = "00110000" THEN</
139、p><p> y1 <= "00111001";</p><p><b> ELSE</b></p><p> y1 <= y1 - '1';</p><p><b> END IF;</b></p><p><b&g
140、t; ELSE</b></p><p> y2 <= y2 - '1';</p><p><b> END IF;</b></p><p><b> ELSE</b></p><p> y3 <= y3 - '1';</p>
141、;<p><b> END IF;</b></p><p><b> ELSE</b></p><p> y4 <= y4 - '1';</p><p><b> END IF;</b></p><p><b> END
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 多功能計(jì)時(shí)器課程設(shè)計(jì)
- 課程設(shè)計(jì)---vhdl秒表計(jì)時(shí)器
- 匯編課程設(shè)計(jì)報(bào)告--- 計(jì)時(shí)器
- 多功能計(jì)時(shí)器的設(shè)計(jì)
- 數(shù)字電子24秒計(jì)時(shí)器-課程設(shè)計(jì)報(bào)告
- 匯編課程設(shè)計(jì)報(bào)告--計(jì)時(shí)器
- 課程設(shè)計(jì)報(bào)告---倒計(jì)時(shí)器
- 時(shí)鐘計(jì)時(shí)器課程設(shè)計(jì)
- 籃球計(jì)時(shí)器課程設(shè)計(jì)
- 電子課程設(shè)計(jì)報(bào)告--籃球比賽倒計(jì)時(shí)器
- 電子課程設(shè)計(jì)報(bào)告---籃球競(jìng)賽30s計(jì)時(shí)器
- 微機(jī)原理課程設(shè)計(jì)-計(jì)時(shí)器
- 24秒計(jì)時(shí)器課程設(shè)計(jì)
- 倒計(jì)時(shí)器課程設(shè)計(jì)
- 微機(jī)課程設(shè)計(jì)--搶答計(jì)時(shí)器
- 課程設(shè)計(jì)--倒計(jì)時(shí)計(jì)時(shí)器的設(shè)計(jì)
- 象棋競(jìng)賽計(jì)時(shí)器設(shè)計(jì)---數(shù)電課程設(shè)計(jì)報(bào)告
- 課程設(shè)計(jì)報(bào)告-籃球30秒倒數(shù)計(jì)時(shí)器
- 籃球比賽計(jì)時(shí)器(課程設(shè)計(jì))
- led數(shù)字倒計(jì)時(shí)器課程設(shè)計(jì)報(bào)告
評(píng)論
0/150
提交評(píng)論