vhdl課程設計報告--多功能電子計時器_第1頁
已閱讀1頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  VHDL綜合設計</b></p><p><b>  實驗報告</b></p><p><b>  多功能電子計時器</b></p><p>  學 院 電子與信息學院 </p><p>  專 業(yè) 電子信息

2、科學類 </p><p>  評價等級 </p><p>  姓 名 </p><p>  班 級 </p><p>  提交日期 2013 年 2 月 27 日 </p><p>

3、;<b>  數(shù)字系統(tǒng)課程設計</b></p><p><b>  一、學時與學分</b></p><p>  課內(nèi)學時:2周學分:2.0</p><p><b>  二、教學目的與要求</b></p><p>  本課程設計是一實踐性課程,要求學生用自頂向下的模塊設計

4、方法和VHDL語言完成一個小型數(shù)字系統(tǒng)的設計,并可用可編程邏輯器件實現(xiàn)。</p><p><b>  三、教學安排</b></p><p>  1. 方案審核 </p><p>  要求2~3個學生自擬一個數(shù)字系統(tǒng)設計課題,其難度不得低于一個具有校時、整點報時

5、和鬧時功能的數(shù)字鐘。不允許抄襲他人的課題與方案。設計方案應包括:設計要求、詳細框圖、控制器流程圖。學生在規(guī)定時間內(nèi)將設計方案與指導教師討論,通過后方可進入下一階段學習(方案討論時間為15周3的課堂內(nèi))。</p><p>  2. 設計與實現(xiàn) </p><p>  在微機和進階實驗板平臺上完成,通過邏輯模擬和實

6、驗板平臺功能驗證。(因?qū)嶒炇野遄佑邢蓿埻瑢W們盡量利用課余時間到實驗室調(diào)試)</p><p>  3. 驗收 </p><p>  在進階實驗板上下載,由教師驗收平分。</p><p>  4. 完成一份設計報告</p><p><b> 

7、 四、評分標準</b></p><p><b>  比例: </b></p><p>  作品 80%</p><p>  報告 20%</p><p>  2. 從創(chuàng)新、思想、難度、設計成果的可靠性、合理性等方面綜合評價。</p><p>&l

8、t;b>  設計要求</b></p><p>  1. 本計時器存在電子時鐘、定時器和秒表三種功能,并可以通過開關的選擇,進行不同功能的切換。</p><p>  2. 電子時鐘包括:24時制的時間顯示、日期顯示、星期顯示,并具有調(diào)時、整點報時和鬧鐘功能。</p><p>  3. 定時器可以進行 0~9999秒的定時,中途可以暫停,繼續(xù)和停止,定

9、時結束會自動提醒。</p><p>  4. 秒表要求最大精度為0.01s,并且有暫停、繼續(xù)、重置按鈕</p><p><b>  進度安排和任務分工</b></p><p><b>  1. 任務分工</b></p><p><b>  確定方案</b></p>

10、<p><b>  模塊及模塊接口確定</b></p><p><b>  任務分工</b></p><p><b>  程序編寫</b></p><p><b>  各自仿真實現(xiàn)</b></p><p><b>  整體調(diào)試<

11、/b></p><p><b>  整體仿真</b></p><p><b>  后期修改調(diào)整</b></p><p><b>  2. 進度安排</b></p><p>  按模塊分工,以模塊難易程度均勻分工,力保成員都能真正參與到設計中來,拒絕打醬油</p>

12、;<p>  14周確定題目 15周做題目報告 </p><p><b>  期末前分工</b></p><p><b>  假期編寫各自模塊</b></p><p>  返校進去整合以及后期處理</p><p><b>  設計環(huán)境</b></p>

13、<p>  Quartus軟件,基于EP2C5T144C8芯片的開發(fā)板。</p><p><b>  整體設計</b></p><p>  (有QuartusII RTL Viewer工具生成)</p><p><b>  設計模塊分析</b></p><p>  1. LCD1602液

14、晶顯示時鐘脈沖模塊</p><p>  本實驗采用LCD1602液晶來顯示。1602液晶也叫1602字符型液晶,它是一種專門用來顯示字母、數(shù)字、符號等的點陣型液晶模塊。它由若干個5X7或者5X11等點陣字符位組成,每個點陣字符位都可以顯示一個字符,每位之間有一個點距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用,正因為如此所以它不能很好地顯示圖形。1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每

15、行16個字符液晶模塊(顯示字符和數(shù)字)。</p><p><b> ?。▓D片來源于網(wǎng)絡)</b></p><p>  用于將實驗板上的50MHz的信號分頻成為,適合于液晶顯示的時鐘頻率,經(jīng)過實驗的測試以及查閱相關的資料,1602的時鐘可用周期為5ms的信號,產(chǎn)生的信號適合于液晶顯示的正常工作。</p><p>  分頻器代碼實現(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;--脈沖信號的累計</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. 按鍵控制功能以及時間校準模塊</p><p>  通過實驗板上的4個按鍵實現(xiàn)多功能電子計時器的功能選擇,以及相應的時鐘的調(diào)校、鬧鐘的設定、鬧鐘的停止開啟、定時器的

19、設定和秒表的控制。</p><p>  其實現(xiàn)在于按鍵的輸入,經(jīng)過key1_reg2、key1_reg1,兩個中間信號的消抖,從而正確的讀取按鍵的變換,從而進行相應的操作改變。</p><p><b>  代碼實現(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>  通過一個按鍵的多次按下,用flag作為標志位,通過flag的累加分別執(zhí)行0、1、

25、2、3,,分別對應的時間顯示,鬧鐘,秒表,定時器。</p><p><b>  代碼實現(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的累加分別對因不同的功能顯示</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進入不同的功能</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>  時間+萬年歷模塊</b><

30、/p><p>  整個模塊共有六個進程:分別是調(diào)校時間的閃爍進程、時間日期輸出進程、時鐘萬年歷邏輯進程、鬧鐘進程、鬧鈴進程、鬧鐘設置進程。</p><p>  閃爍進程,通過標志位的scan_flag的取反,進行顯示和不顯示的切換,從而達到閃爍的效果。</p><p>  時間日期輸出進程,通過各自時間日期的temp信號的改變,賦予相應的輸出管教,來顯示時間同時時間的計

31、時。</p><p>  時鐘萬年歷邏輯進程,即時間24時制的VHDL邏輯表示以及萬年歷中關于月份閏年不閏年的邏輯關系。</p><p>  鬧鐘進程:通過IF語句判斷當前時間是否為設定的時間,盡在鬧鐘打開以及時間到達的時候才起作用,從而設置鬧鈴標志位。</p><p>  鬧鈴進程:控制鬧鈴的響起。</p><p>  鬧鐘設置進程:進行鬧

32、鐘的設定。</p><p>  實現(xiàn)代碼:見附錄1。</p><p><b>  5. 秒表模塊</b></p><p>  此模塊共有三個進程,分別為顯示時間進程、秒表計時進程和秒表控制進程。</p><p>  顯示時間進程:同時間顯示進程。</p><p>  秒表計時進程:通過最小精度毫

33、秒計時,來進行最高99:99.99的計時,該進程實現(xiàn)了秒表的內(nèi)部實現(xiàn)邏輯。</p><p>  秒表控制進程:通過狀態(tài)機控制復位、停止、計時,暫停的不同狀態(tài),來實現(xiàn)對于秒表的控制。</p><p><b>  ASM圖:</b></p><p>  實現(xiàn)代碼:見附錄2。</p><p><b>  6. 定時器

34、模塊</b></p><p>  本模塊利用狀態(tài)機,用flag,分別來控制定時設置、定時、暫停繼續(xù)、停止</p><p><b>  ASM圖:</b></p><p>  實現(xiàn)代碼:見附錄3。</p><p><b>  7. 三路選通器</b></p><p>

35、;  根據(jù)模式選擇模塊的選擇,選通不同的顯示內(nèi)容,實現(xiàn)時間、定時器以及秒表的分別顯示。</p><p><b>  代碼實現(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ū)動</p><p>  本模塊是有了狀態(tài)機的嵌套。先使用一個狀態(tài)機對1602進行顯示模式,顯示的位置等各種屬性的設置,然后再在顯示內(nèi)容的地方再用一個狀態(tài)機來顯示時間日期等內(nèi)容。</p><p>  通過上面的設置和狀態(tài)機的搭配,達到了使用VHDL

45、對1602進行驅(qū)動的目的。</p><p>  代碼實現(xiàn):見附錄4。</p><p><b>  總體功能描述</b></p><p>  1. 顯示第一行固定為萬年歷的顯示,第二行則是功能顯示,默認為時鐘;</p><p>  2. 功能切換由4個按鍵完成;</p><p>  3. 時鐘,鬧鈴

46、,秒表,定時器間的切換由key1完成,按該按鈕依次切換;</p><p>  4. 在時鐘狀態(tài)下,按key4進行功能切換,按第一下時鐘停止運行,隨著按key4,依次為年,月,日,星期,時,分,秒的修改,修改狀態(tài)下,按key3為加,key2為減,key4為確定;</p><p>  5. 在鬧鈴狀態(tài)下,按下key4可以修改鬧鈴時間,依次為時,分,鬧鈴開關,key2,key3的功能同上,鬧鈴響

47、起時,按key2停止;</p><p>  6. 在秒表狀態(tài)下,按下key4可暫停/開始的切換,key3停止,key2重置,僅在停止狀態(tài)下才能進行重置操作;</p><p>  7. 在定時器狀態(tài)下,按下key4可設定定時時間時長,最大時長為99:59:59,設定好以后,按key3可開始/暫停定時,暫?;虻褂嫊r結束狀態(tài)下,按key2可自動重載為上次設定定時時間,定時結束后,會有鈴聲提示,按

48、key2鍵停止響聲。</p><p><b>  系統(tǒng)的仿真與調(diào)試</b></p><p>  因為單獨的模塊管腳過多,單個模塊無法編譯成功,故這次設計沒有在軟件上進行仿真,調(diào)試全都在自己購買的學習板上完成。</p><p>  本次調(diào)試遇到的問題主要都是LCD1602上顯示的問題。譬如寫定時器的模塊時,第一行的萬年歷顯示正常,第二行開頭的TI

49、MER也顯示正常,但后面的顯示卻出現(xiàn)亂碼。首先在程序上把后面的程序都改為某個字符的靜態(tài)輸出,下載到板子上以后發(fā)現(xiàn)顯示正常,便可確定是定時器運行的進程部分出現(xiàn)問題。第一次認真看了內(nèi)部邏輯以后發(fā)現(xiàn)不到問題,然后便把內(nèi)部的東西都忽略了看外圍的代碼,最后發(fā)現(xiàn)漏寫時鐘的邊沿觸發(fā),添加后便能正常顯示。</p><p>  類似的調(diào)試方法在本次實踐中屢屢出現(xiàn),主要便歸結為:若是功能出現(xiàn)問題就檢查代碼的邏輯性,若是顯示問題,先把

50、出現(xiàn)問題部分改為靜態(tài)輸出,逐步找出問題根源,若無問題再檢查代碼的邏輯問題,從里到外找出癥結所在。</p><p><b>  總結</b></p><p>  本次課程設計選取的題目算不上困難,在這次設計過程中,主要是鍛煉對LCD1602的顯示功能自學能力,團隊合作能力,并使自己的代碼寫得更規(guī)范。沿著設計的進展,代碼條理性明顯加強,縮進等細節(jié)也逐漸形成了自己的風格。&

51、lt;/p><p><b>  附錄:</b></p><p><b>  部分模塊代碼:</b></p><p><b>  時間萬年歷模塊代碼</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>  --時鐘,萬年歷部分</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";-- 時間,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>  --鬧鐘部分信號</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";--鬧鐘時間顯示</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);--鬧鈴開關顯示</p><p>  SIGNAL scan_flag : std_logic;--產(chǎn)生閃爍的標志</p><p>  SIGNAL C_flag : integer RANGE 0 TO 8 := 0;--時鐘狀態(tài)的標志</p><p>  SIGNAL A_fla

75、g : integer RANGE 0 TO 3 := 0;--鬧鈴狀態(tài)的標志</p><p>  SIGNAL r_flag : std_logic;--鬧鈴響,停的標志</p><p>  SIGNAL r_SW : std_logic :='0';--鬧鈴開關的狀態(tài)位</p><p>  SIGNAL ring_temp :

76、 std_logic := '0';</p><p><b>  BEGIN</b></p><p>  PROCESS(clk)--產(chǎn)生調(dià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)--鬧鈴,時間顯示的狀態(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的進程</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)--萬年歷,時鐘的調(diào)整與進行</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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論