【正文】
constant clk_period : time := 1ms。 signal qth : integer :=0。signal alarmh : std_logic:=39。architecture one of test issignal clkh : std_logic:=39。小時testbenchlibrary ieee。end process。process(alarmh,ha)beginif alarmh=39。039。clk3=39。elsif(clkh39。139。鬧鈴對比 hy: out integer range 0 to 23) 。預定小時時間 hs: in integer range 0 to 23。entity hour isport ( clkh: in std_logic。END。mns=0。139。setmn = 39。 end process。 wait for clk_period/2。 end ponent。 qtmn : out integer:=0。 alarmmn : in std_logic:=39。 ponent minute port( clkmn : in std_logic:=39。 signal clk2 : std_logic。139。039。use 。qtmn=qmn。139。 end if。139。event and clkmn=39。 then if mns=0 then qmn=qmn。 end minute。 qtmn: out integer range 0 to 59。 setmn: in std_logic。 Minute模塊library ieee。 wait for clk_period*10。 wait。039。 Stimulus process stim_proc: process begin sets=39。 clks = 39。 begin DUT :second port map(clks,sets,alarms,sa,ss,qts,clk1,sx,sy)。 clk1 : out std_logic。 alarms : in std_logic。 signal sy : integer :=0。 signal ss : integer :=0。139。entity test is end test。end miao。end if。end process。 clk1=39。) then if(qs=59) then qs=0。 end if。begin process(clks,sets,ss) begin if sets=39。 sx: out integer range 0 to 59。 sa: in integer range 0 to 59。use 。直至我最終完成了整個數據電子鐘的設計。程序中我使用了較為標準的格式,提高了代碼的可讀性。在使用modelsim的過程中,使我更加深入地了解了其功能的運用,并且掌握其編寫激勵testbench的方式。通過把所以模塊的綜合,最終可以在總模塊是看出最終實現具有年月日時分秒的計數時鐘,并且實現隨時設置時間(只要把set置‘1’,則可以把輸入端設置的時間作為開始計時的時間參數),同時還支持鬧鈴的功能,由圖14可以看出,設置的鬧鈴時間是12:30,當時鐘到達12:30后,ring作為鬧鈴信號置1提醒,同時還支持閏年提醒功能,由圖15可以看出,當是閏年時,ring作為閏年的提醒信號置1提醒。Hour模塊: 圖5 結果分析:預置初值為8,所以計數從8計數到23,再回0,其中ha表示鬧鈴預置的時間,其他注釋和以上模塊的大致相同Day模塊:2013年一月31天 圖6閏年2月29天 結果分析:時間預置是2013年(即非閏年),12,初始值為1,因此計數從1計數到31天,如果預置為2月,則計數到28天 圖7 此是從總模塊拿出來的,可以看到2016年閏年時2月為29天非閏年2月28天 圖8此模塊是從總模塊拿出來的,2014年為非閏年時,2月為28天月份4月30天 圖9此模塊為2014年非閏年時4月模塊是30天Month模塊: 圖10 結果分析:預置初始時間為12月,因此計數從12之后回1,再從1計數到12,輸出clk4的控制年模塊的時鐘信號Years模塊: 圖11 結果分析:開始預置時間是2013年,則計數從2013開始 鬧鈴alarm模塊2016是閏年,則ring=1 圖12 結果分析:設定鬧鈴的時間為12點30分,如果比較時間相同的話,ring=1,否則為0,同樣如果當年是閏年,ring=1,會提醒。 end if。139。end if。elsif (s1a=s2a and mn1a=mn2a and h1a=h2a and d1a=d2a and m1a=m2a and y1a=y2a) then ring=39。當上一個模塊的控制信號來臨時,year模塊開始從0計數并一直計數下去,由于要求初始時間為2012,我們可以利用“signal q:integer:=2012。139。end process。 clk3=39。) then if(q=12) then q=1。如果要設置初值,則令setd=‘1’,然后再設置想要數值ds。 end if。 elsif qd30 then qd=qd+1。 end if。139。039。 clk2=39。039。 clk2=39。 clk2=39。 elsif (monthin=2) then if(qd=29) then qd=1。 elsif qd31 then qd=qd+1。139。 else qd=ds?!辟x初始值,這樣計數器就會從14開始計數。end if。 elsif q23 then q=q+1。139。 當clk上升沿來臨時,minute模塊開始從0計數到59,并輸出一個控制信號clk1控制minute模塊,此時clk1=1 ,并回到0然后循環(huán)計數,此時clk1=0。 elsif qmn59 then qmn=qmn+1。139。 else qmn=mns。當需要設置時間時,即sets=‘1’,則把預定好的初值ss賦給輸出信號qs。 end if。139。event and clks=39。 then if ss=0 then qs=qs。按照設計內容和要求以及所有的設計思路與原理,綜合考慮后,采用例化語句方法,設計模塊化的結構:頂層設計實體為electronic_clock(數字鐘)模塊,其下又分為:years(年)、month(月)、day(日)、hour(時)、minute(分)、second(秒)、alarm_clock(鬧鐘)7個模塊。六、設計思想: 這次課題論文要求設計顯示年月日時分秒、陽歷轉陰歷的數字電子鐘,且能可隨時進行時間校對和支持鬧鈴功能以及閏年提醒功能。其代碼具有良好的可讀性和易理解性,源程序經Altera公司的ModelSimSE 6.1軟件完成綜合、仿真,四、設計要求:采用自頂向下的設計思想。突出了其作為硬件描述語言的良好的可讀性、可移植性和易理解等優(yōu)點,并通過ModelSim SE 、仿真。設計中根據系統(tǒng)的功能要求合理劃分出層次,進行分級設計和仿真驗證,將較為復雜的數字系統(tǒng)邏輯簡化為基本的模型從而降低實現的難度。本文提出了以VHDL語言為手段,設計了多功能數字鐘。備注:用硬件描述語言VHDL設計系統(tǒng),用Modelsim軟件仿真,用Design piler軟件或Synplify軟件綜合成電路網表。七、設計原理: 本次實驗的電子數字鐘的設計采用異步計時的方式,即各個時間模塊每一個輪回后,輸出一個高電平作為緊接下一個的時間模塊的時鐘信號;校正設置時間是通過set端控制,即如果為高電平時,就把預定好的時間參數(sset、mnset、hset、dset、mset、yset)作為要設置的時間,同時也通過此辦法來校正時間的參數;鬧鈴時間控制是通過alarm端控制,即作為高電平時,把預定好的時間參數(salarm、mnalarm、halarm、dalarm、malarm、yalarm)作為鬧鈴的時間參數預制;鬧鈴功能實現是通過一個比較器,即當前的電子鐘時間和預定的時間是否一致,如果一致,鬧鈴ring輸出‘1’,否則為‘0’,同時也可以作為閏年的提醒功能。139。elsif(clks39。 clk1=39。039。當clk上升沿來臨時,second模塊開始從0計數到59,并輸出一個控制信號clk1控制minute模塊,此時clk1=1 ,并回到0然后循環(huán)計數,此時clk1=0。 then if mns=0 then qmn=qmn。event and clkmn=39。139。 end if。event and clk=39。139。 end if。由于要求初始時間為14,我們可以利用“signal q:integer:=14。 then if ds=0 then qd=qd。event and clkd=39。139。 end if。 elsif qd29 then qd=qd+1。 elsif ((monthin=4) or (monthin=6) or (monthin=9) or (monthin=11)) then if(qd=30) then qd=1。 clk2=39。 elsif ((monthin=1) or (monthin=3) or (monthin=5) or (monthin=7) or (monthin=8) or (monthin=10) or (monthin=12)) then if(qd=31) then qd=1。 clk2=39。 clk2=39。039。139。 end if。如果是非閏年,并且是1月,day模塊開始則從1計數到31,而如果是2月,則day模塊開始計時從1計數到29,如果其他月份時,則計數從1到30,之后并輸出一個控制信號clk2控制month模塊,此時clk2=1 ,計數到最大值時都會回到1然后循環(huán)計數,此時clk2=0。139。 elsif q12 then q=q+1。end if。event and clk=39。end process。139。039。 Set時間校對模塊:process(set,hs) ——這是小時模塊的set,其他計時模塊與其相同 begin if set=39。 end if。)十、各個模塊的波形仿真結果:初始值second模塊 圖2出現時鐘信號判別計數終值 圖3 結果分析:預置初始值為0,因此由0計數到59,之后出現進位clk1=1.minute模塊 圖4 結果分析:預置初值為12,因此由12計數到59,最終回