在日常學(xué)習(xí)、工作或生活中,大家總少不了接觸作文或者范文吧,通過文章可以把我們那些零零散散的思想,聚集在一塊。那么我們?cè)撊绾螌懸黄^為完美的范文呢?下面我給大家整理了一些優(yōu)秀范文,希望能夠幫助到大家,我們一起來看一看吧。
eda課程設(shè)計(jì)題目 eda課程設(shè)計(jì)數(shù)字時(shí)鐘篇一
學(xué) 院: 機(jī)電工程學(xué)院
題 目: 數(shù)字時(shí)鐘電路設(shè)計(jì) 課 程: 《電子系統(tǒng)設(shè)計(jì)自動(dòng)化》課程設(shè)計(jì) 專業(yè)班級(jí): 電信10級(jí)2 班 學(xué)生姓名: 劉星 秦玉杰 王艷艷 學(xué) 號(hào): 1004101035 1004101036 1004101038
完成日期:2013年 12 月 27 日
摘要:
eda(electronic design automation)電子設(shè)計(jì)自動(dòng)化,就是以大規(guī)模可編程器件為設(shè)計(jì)載體,以硬件描述語言為系統(tǒng)邏輯描述的主要表達(dá)方式,通過相關(guān)的軟件,自動(dòng)完成用軟件方式設(shè)計(jì)的電子系統(tǒng)到硬件系統(tǒng),最終形成集成電子系統(tǒng)或?qū)S眉尚酒1敬螌?shí)習(xí)利用quartusii為設(shè)計(jì)軟件、vhdl為硬件描述語言,結(jié)合所學(xué)的數(shù)字電路的知識(shí)設(shè)計(jì)一個(gè)24時(shí)多功能數(shù)字鐘,具有正常時(shí)、分、秒計(jì)時(shí),動(dòng)態(tài)顯示,清零、快速校時(shí)校分、整點(diǎn)報(bào)時(shí)、花樣顯示等功能。利用硬件描述語言vhdl對(duì)設(shè)計(jì)系統(tǒng)的各個(gè)子模塊進(jìn)行邏輯描述,采用模塊化的設(shè)計(jì)思想完成頂層模塊的設(shè)計(jì),通過軟件編譯、邏輯化簡、邏輯分割、邏輯綜合優(yōu)化、邏輯布線、邏輯仿真,最終將設(shè)計(jì)的軟件系統(tǒng)下載設(shè)計(jì)實(shí)驗(yàn)系統(tǒng),對(duì)設(shè)計(jì)的系統(tǒng)進(jìn)行硬件測(cè)試。
一、課程設(shè)計(jì)基本要求和任務(wù)
《eda課程設(shè)計(jì)》是繼《模擬電子技術(shù)基礎(chǔ)》、《數(shù)字電子技術(shù)基礎(chǔ)》課程后,電信專業(yè)學(xué)生在電子技術(shù)實(shí)驗(yàn)技能方面綜合性質(zhì)的實(shí)驗(yàn)訓(xùn)練課程,是電子技術(shù)基礎(chǔ)的一個(gè)部分。1.1 目的和任務(wù)
(1)通過課程設(shè)計(jì)使學(xué)生能熟練掌握一種eda軟件(quartusii)的使用方法,能熟練進(jìn)行設(shè)計(jì)輸入、編譯、管腳分配、下載等過程,為以后進(jìn)行工程實(shí)際問題的研究打下設(shè)計(jì)基礎(chǔ)。
(2)通過課程設(shè)計(jì)使學(xué)生能利用eda軟件(quartusii)進(jìn)行至少一 個(gè)電子技術(shù)綜合問題的設(shè)計(jì),設(shè)計(jì)輸入可采用圖形輸入法或vhdl硬件描述語言輸入法。(3)通過課程設(shè)計(jì)使學(xué)生初步具有分析、尋找和排除電子電路中常見 故障的能力。
(4)通過課程設(shè)計(jì)使學(xué)生能獨(dú)立寫出嚴(yán)謹(jǐn)?shù)?、有理論根?jù)的、實(shí)事求是的、文理通順的字跡端正的課程設(shè)計(jì)報(bào)告。1.2 功能要求:
(1)具有時(shí)、分、秒計(jì)數(shù)顯示功能,以24小時(shí)循環(huán)計(jì)時(shí)。(2)時(shí)鐘計(jì)數(shù)顯示時(shí)有l(wèi)ed燈的花樣顯示。(3)具有調(diào)節(jié)小時(shí)、分鐘、秒及清零的功能。(4)具有整點(diǎn)報(bào)時(shí)功能。
1.3 總體方框圖:
本系統(tǒng)可以由秒計(jì)數(shù)器、分鐘計(jì)數(shù)器、小時(shí)計(jì)數(shù)器、整點(diǎn)報(bào)時(shí)、分的調(diào)整以及小時(shí)的調(diào)整和一個(gè)頂層文件構(gòu)成。采用自頂向下的設(shè)計(jì)方法,子模塊利用vhdl語言設(shè)計(jì),頂層文件用原理圖的設(shè)計(jì)方法。顯示:小時(shí)采用24進(jìn)制,而分鐘均是采用6進(jìn)制和10進(jìn)制的組合。1.4 設(shè)計(jì)原理:
數(shù)字鐘電路設(shè)計(jì)要求所設(shè)計(jì)電路就有以下功能:時(shí)、分、秒計(jì)時(shí)顯示,清零,時(shí)、分調(diào)節(jié),整點(diǎn)報(bào)時(shí)及花樣顯示。分、秒計(jì)時(shí)原理相似,可以采用60進(jìn)制bcd碼計(jì)數(shù)器進(jìn)計(jì)時(shí);小時(shí)采用24進(jìn)制bcd碼進(jìn)行計(jì)時(shí);在設(shè)計(jì)時(shí)采用試驗(yàn)電路箱上的模式7電路,不需要進(jìn)行譯碼電路的設(shè)計(jì);所設(shè)計(jì)電路具有驅(qū)動(dòng)揚(yáng)聲器和花樣顯示的led燈信號(hào)產(chǎn)生。試驗(yàn)箱模式7的電路如圖一所示:圖一模式七實(shí)驗(yàn)電路圖
1.5 性能指標(biāo)及功能設(shè)計(jì):
(1)時(shí)鐘計(jì)數(shù):完成時(shí)、分、秒的正確計(jì)時(shí)并且顯示所計(jì)的數(shù)字;對(duì)秒、分——60進(jìn)制計(jì)數(shù),即從0到59循環(huán)計(jì)數(shù),時(shí)鐘——24進(jìn)制計(jì)數(shù),即從0到23循環(huán)計(jì)數(shù),并且在數(shù)碼管上顯示數(shù)值。
2.2 模塊劃分自頂向下分解
2.3 模塊描述
時(shí)鐘計(jì)時(shí)模塊完成時(shí)、分、秒計(jì)數(shù),及清零、調(diào)節(jié)時(shí)和分鐘的功能。時(shí)、分、秒計(jì)數(shù)的原理相同,均為bcd碼輸出的計(jì)數(shù)器,其中分和秒均為六十進(jìn)制bcd碼計(jì)數(shù)器,小時(shí)為二十四進(jìn)制bcd碼計(jì)數(shù)器。設(shè)計(jì)一個(gè)具有異步清零和設(shè)置輸出功能的六十進(jìn)制bcd碼計(jì)數(shù)器,再設(shè)計(jì)一個(gè)具有異步清零和設(shè)置輸出功能的二十四進(jìn)制計(jì)數(shù)器,然后將它們通過一定的組合構(gòu)成時(shí)鐘計(jì)時(shí)模塊。各個(gè)輸入/輸出端口的作用為:
(1)clk為計(jì)時(shí)時(shí)鐘信號(hào),reset為異步清零信號(hào);
(2)sethour為小時(shí)設(shè)置信號(hào),setmin為分鐘設(shè)置信號(hào);(3)daout[5?0]為小時(shí)的bcd碼輸出, daout[6...0]為秒和分鐘的bcd碼輸出,enmin和enhour為使能輸出信號(hào)。
(4)在時(shí)鐘整點(diǎn)的時(shí)候產(chǎn)生揚(yáng)聲器驅(qū)動(dòng)信號(hào)和花樣顯示信號(hào)。由時(shí)鐘計(jì)時(shí)模塊中分鐘的進(jìn)行信號(hào)進(jìn)行控制。當(dāng)contr_en為高電平時(shí),將輸入信號(hào)clk送到輸出端speak用于驅(qū)動(dòng)揚(yáng)聲器,同時(shí)在clk的控制下,輸出端lamp[2..0]進(jìn)行循環(huán)移位,從而控制led燈進(jìn)行花樣顯示。輸出控制模塊有揚(yáng)聲器控制器和花樣顯示控制器兩個(gè)子模塊組成 2.4 頂層電路圖
頂層文件是由四個(gè)模塊組成,分別是時(shí)、分、秒計(jì)數(shù)器和報(bào)警的vhdl語言封裝而成。經(jīng)過鎖定引腳再重新編譯獲得如下頂層原理電路圖:
三、方案實(shí)現(xiàn)
3.1 各模塊仿真及描述
(1)秒計(jì)數(shù)器模塊仿真圖:將標(biāo)準(zhǔn)秒信號(hào)送入”秒計(jì)數(shù)器”,秒計(jì)數(shù)器采用60進(jìn)制計(jì)數(shù)器,每累計(jì)60秒發(fā)出一個(gè)分脈沖信號(hào),該信號(hào)將作為分計(jì)數(shù)器的時(shí)鐘脈沖,daout代表秒輸出。
(2)分計(jì)數(shù)器電路仿真圖:也采用60進(jìn)制計(jì)數(shù)器,每累計(jì)60分鐘,發(fā)出一個(gè)時(shí)脈沖信號(hào),該信號(hào)將被送到時(shí)計(jì)數(shù)器,daout端口代表分鐘輸出
(3)小時(shí)計(jì)數(shù)器電路仿真圖:時(shí)計(jì)數(shù)器采用12進(jìn)制計(jì)時(shí)器,可實(shí)現(xiàn)對(duì)24小時(shí)累 計(jì)。每累計(jì)12小時(shí),發(fā)出一個(gè)脈沖信號(hào)。
引腳配置完成后再進(jìn)行一次全程編譯,無誤則可以下載到試驗(yàn)箱上進(jìn)行硬件測(cè)試。硬件驗(yàn)證的方法如下:選擇實(shí)驗(yàn)?zāi)J?;時(shí)鐘脈沖clk與clock0(1024hz)信號(hào)相連;鍵8和鍵5均為低電平,時(shí)鐘正常計(jì)時(shí),數(shù)碼管1和2顯示秒,數(shù)碼管4和5顯示分鐘,數(shù)碼管7和8顯示小時(shí);鍵8為高電平時(shí),時(shí)鐘清零;鍵5為高電平時(shí),按下鍵7和鍵4進(jìn)行調(diào)時(shí)調(diào)分操作;當(dāng)時(shí)鐘為整點(diǎn)的時(shí)候,三個(gè)發(fā)光二極管進(jìn)行循環(huán)移位操作,同時(shí)揚(yáng)聲器發(fā)聲。
五、心得體會(huì)
經(jīng)過源程序的編輯、邏輯綜合、邏輯適配、編程下載成功后,在eda實(shí)驗(yàn)開發(fā)系統(tǒng)進(jìn)行硬件驗(yàn)證時(shí)卻發(fā)現(xiàn)實(shí)驗(yàn)結(jié)果不正確,揚(yáng)聲器無法發(fā)聲。經(jīng)檢查,自己設(shè)計(jì)的管腳文件有錯(cuò)。將管腳鎖定文件修改后,重新進(jìn)行邏輯適配、編程下載成功后,實(shí)驗(yàn)結(jié)果仍然不正確,百思不得其解。無奈之下,決定重頭開始排查每一步的細(xì)節(jié),確定各個(gè)模塊的功能完全實(shí)現(xiàn)并且頂層模塊功能正確。修改之后,重新進(jìn)行邏輯適配、編程下載驗(yàn)證,實(shí)驗(yàn)結(jié)果完全正確。
這次eda課程設(shè)計(jì)歷時(shí)兩個(gè)星期,在整整兩個(gè)星期的日子里,不僅鞏固了以前所學(xué)過的知識(shí),而且學(xué)到了很多書本上學(xué)不到的知識(shí),同時(shí)鍛煉了自己的能力,使自己對(duì)以后的路有了更加清楚的認(rèn)識(shí),對(duì)未來有了更多的信心。這次課程設(shè)計(jì),進(jìn)一步加深了我對(duì)eda的了解,使我對(duì)quartusii的基本操作有所了解,使我對(duì)應(yīng)用軟件的方法設(shè)計(jì)硬件系統(tǒng)有了更加濃厚的興趣。通過這次課程設(shè)計(jì),我懂得了理論與實(shí)際相結(jié)合的重要性,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合,從實(shí)踐中得出結(jié)論,才能真正提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。在設(shè)計(jì)的過程中,我遇到許多問題,畢竟是第一次應(yīng)用vhdl進(jìn)行硬件電路系統(tǒng)的設(shè)計(jì),許多eda的知識(shí)還沒有充分的掌握,遇到困難也是在所難免的,同時(shí)發(fā)現(xiàn)了自己的不足之處:學(xué)習(xí)知識(shí)表面化,沒有深入了解它們的原理??偟膩碚f,這次設(shè)計(jì)的數(shù)字時(shí)鐘電路還是比較成功的,盡管在設(shè)計(jì)中遇到了很多問題,最后在老師的辛勤指導(dǎo)、同學(xué)的幫助和自己不斷思考下,終于迎刃而解,有點(diǎn)小小的成就感,覺得平時(shí)所學(xué)的知識(shí)有了實(shí)用的價(jià)值,達(dá)到了理論與實(shí)際相結(jié)合的目的。最后,對(duì)給過我?guī)椭乃型瑢W(xué)和指導(dǎo)老師再次表示忠心的感謝!
參考文獻(xiàn)
[1] 崔健明.《電子電工eda仿真技術(shù)》 高等教育出版社 2000年 [2] 盧杰,賴毅.《vhdl與數(shù)字電路設(shè)計(jì)》 科學(xué)出版社 2001年 [3] 潘松,黃繼業(yè).《eda技術(shù)實(shí)用教程》 科學(xué)出版社 2002年 [4] 朱運(yùn)利.《eda技術(shù)應(yīng)用》 電子工業(yè)出版社 2004年 [5] 張明.《vhdl實(shí)用教程》 電子科技大學(xué)出版社 1999年
[6] 彭介華.《電子技術(shù)課程設(shè)計(jì)與指導(dǎo)》 高等教育出版 1997年
library ieee;
use ;use ;entity minute is port(clk,clk1,reset,sethour:in std_logic;enhour:out std_logic;daout:out std_logic_vector(6 downto 0));end entity minute;architecture fun of minute is signal count :std_logic_vector(6 downto 0);signal enhour_1, enhour_2: std_logic;--enmin_1為59分時(shí)的進(jìn)位信號(hào) begin--enmin_2由clk調(diào)制后的手動(dòng)調(diào)時(shí)脈沖信號(hào)串 daout<=count;enhour_2<=(sethour and clk1);--sethour為手動(dòng)調(diào)時(shí)控制信號(hào),高電平有效 enhour<=(enhour_1 or enhour_2);process(clk,reset,sethour)begin if(reset='0')then--若reset為0,則異步清零 count<=“0000000”;elsif(clk'event and clk='1')then--否則,若clk上升沿到 if(count(3 downto 0)=“1001”)then--若個(gè)位計(jì)時(shí)恰好到“1001”即9 if(count <16#60#)then--又若count小于16#60#,即60 if(count=“1011001”)then--又若已到59d enhour_1<='1';--則置進(jìn)位為1 count<=“0000000”;--count復(fù)0 else count<=count+7;--若count未到59d,則加7,即作“加6校正” end if;--使前面的16#60#的個(gè)位轉(zhuǎn)變?yōu)?421bcd的容量 else count<=“0000000”;--count復(fù)0(有此句,則對(duì)無效狀態(tài)電路可自啟動(dòng))end if;--end if(count<16#60#)elsif(count <16#60#)then count<=count+1;--若count<16#60#則count加1 enhour_1<='0' after 100 ns;--沒有發(fā)生進(jìn)位 else count<=“0000000”;--否則,若count不小于16#60# count復(fù)0 end if;--end if(count(3 downto 0)=“1001”)end if;--end if(reset='0')end process;end fun;
3、時(shí)計(jì)數(shù)器模塊的vhdl語言:
library ieee;use ;use ;
if(clk'event and clk='1')then if(dain=“0000000”)then speak<=count1(1);if(count1>=“10”)then count1<=“00”;--count1為三進(jìn)制加法計(jì)數(shù)器 else count1<=count1+1;end if;end if;end if;end process speaker;lamper:process(clk)begin if(rising_edge(clk))then if(count<=“10”)then if(count=“00”)then lamp<=“001”;--elsif(count=“01”)then lamp<=“010”;elsif(count=“10”)then lamp<=“100”;end if;count<=count+1;else count<=“00”;end if;end if;end process lamper;end fun;
循環(huán)點(diǎn)亮三只燈
eda課程設(shè)計(jì)題目 eda課程設(shè)計(jì)數(shù)字時(shí)鐘篇二
課 程 設(shè) 計(jì) 報(bào) 告
設(shè)計(jì)題目:用vhdl語言實(shí)現(xiàn)數(shù)字鐘的設(shè)計(jì)
班 級(jí):電子1002班 學(xué) 號(hào):20102625 姓 名:于曉 指導(dǎo)教師:李世平、李寧 設(shè)計(jì)時(shí)間:2012年12月
摘要
數(shù)字鐘是一種用數(shù)字電路技術(shù)實(shí)現(xiàn)時(shí)、分、秒計(jì)時(shí)的鐘表。本設(shè)計(jì)主要是實(shí)現(xiàn)數(shù)字鐘的功能,程序用vhdl語言編寫,整體采用top-to-down設(shè)計(jì)思路,具有基本的顯示年月日時(shí)分秒和星期的功能,此外還有整點(diǎn)報(bào)時(shí)功能。該數(shù)字鐘的實(shí)現(xiàn)程序分為頂層模塊、年月模塊、日模塊、時(shí)分秒定時(shí)模塊、數(shù)碼管顯示模塊、分頻模塊、星期模塊,此外還有一個(gè)庫。該程序主要是用了元件例化的方法,此外還有進(jìn)程等重要語句。
沒有脈沖時(shí),顯示時(shí)分秒,set按鈕產(chǎn)生第一個(gè)脈沖時(shí),顯示年月日,第2個(gè)脈沖到來時(shí)可預(yù)置年份,第3個(gè)脈沖到來時(shí)可預(yù)置月份,依次第4、5、6、7、8個(gè)脈沖到來時(shí)分別可預(yù)置日期、時(shí)、分、秒、星期,第 9個(gè)脈沖到來時(shí)設(shè)置星期后預(yù)置結(jié)束,正常工作,顯示的是時(shí)分秒和星期。調(diào)整設(shè)置通過up來控制,up為高電平,upclk有脈沖到達(dá)時(shí),預(yù)置位加1,否則減1。當(dāng)整點(diǎn)到達(dá)時(shí),報(bào)時(shí)器會(huì)鳴響,然后手動(dòng)按鍵停止報(bào)時(shí)。
關(guān)鍵詞:數(shù)字鐘,vhdl,元件例化,數(shù)碼管
1、課程設(shè)計(jì)目的
掌握利用可編程邏輯器件和eda設(shè)計(jì)工具進(jìn)行電子系統(tǒng)設(shè)計(jì)的方法
2、課程設(shè)計(jì)內(nèi)容及要求
設(shè)計(jì)實(shí)現(xiàn)一個(gè)具有帶預(yù)置數(shù)的數(shù)字鐘,具有顯示年月日時(shí)分秒的功能。用6個(gè)數(shù)碼管顯示時(shí)分秒,set按鈕產(chǎn)生第一個(gè)脈沖時(shí),顯示切換年月日,第2個(gè)脈沖到來時(shí)可預(yù)置年份,第3個(gè)脈沖到來時(shí)可預(yù)置月份,依次第4、5、6、7個(gè)脈沖到來時(shí)分別可預(yù)置日期、時(shí)、分、秒,第 8個(gè)脈沖到來后預(yù)置結(jié)束,正常工作,顯示的是時(shí)分秒。up為高電平時(shí),upclk有脈沖到達(dá)時(shí),預(yù)置位加1.否則減1,還可以在此基礎(chǔ)上增加其它功能。
3、vhdl程序設(shè)計(jì)
3.1整體設(shè)計(jì)思路
本設(shè)計(jì)采用top-down 模式設(shè)計(jì),分模塊進(jìn)行,各功能都使用元件例化方式設(shè)計(jì),主要有l(wèi)ed顯示模塊、時(shí)分秒定時(shí)模塊、日期模塊、年月模塊、分頻模塊、星期模塊,此外還創(chuàng)建了一個(gè)程序包,用來實(shí)現(xiàn)年月日、時(shí)分秒的加減調(diào)整。主要運(yùn)用了過程語句、元件例化語句、信號(hào)賦值語句、和順序語句
圖3-1-1 整體結(jié)構(gòu)圖
圖3-1-2 頂層模塊引腳圖
3.2各模塊設(shè)計(jì)思路
3.2.1 普通計(jì)數(shù)器(時(shí)、分、秒、月、年計(jì)數(shù)器)設(shè)計(jì)
時(shí)鐘模塊通過調(diào)用程序包的時(shí)分秒加減過程語句實(shí)現(xiàn)兩個(gè)六十進(jìn)制,一個(gè)二十四進(jìn)制,秒的進(jìn)位信號(hào)作為分的計(jì)數(shù)時(shí)鐘信號(hào),分的進(jìn)位信號(hào)作為時(shí)的時(shí)鐘信號(hào)。時(shí)的進(jìn)位信號(hào)通過管腳映射到日期模塊的計(jì)數(shù)時(shí)鐘信號(hào)。
定時(shí)功能在時(shí)分秒模塊中,是由分計(jì)數(shù)器在到達(dá)59時(shí)產(chǎn)生一個(gè)脈沖,讓speaker產(chǎn)生高電位鳴響。
年月模塊主要實(shí)現(xiàn)月份的十二進(jìn)制計(jì)數(shù)器,和100進(jìn)制的年份計(jì)數(shù)器。月份的計(jì)數(shù)信號(hào)由日期模塊的進(jìn)位信號(hào)傳遞過來,年份的時(shí)鐘信號(hào)由月份的進(jìn)位信號(hào)產(chǎn)生。
圖3-2-1 時(shí)分秒引腳圖 圖3-2-2 年月引腳圖 3.2.2 可變進(jìn)制計(jì)數(shù)器(天計(jì)數(shù)器)模塊設(shè)計(jì)
不同月中的天的數(shù)量是不同的,例如“大月”就有31“天”,“小月”有30“天”,平年“二月”有28“天”,而閏年“二月”有29“天”。所以天計(jì)數(shù)器應(yīng)該具備進(jìn)制可變的性能。日期模塊主要分為三個(gè)部分,預(yù)置日期加,預(yù)置日期減和產(chǎn)生進(jìn)位信號(hào),使月份增加。平閏年的判斷是通過年月模塊傳輸過來年份信號(hào)(兩個(gè)4位的bcd碼),如果高位的信號(hào)為“xxx0”且低位的信號(hào)為“xx00”(如20,84等),或高位為“xxx1”且低位為“xx10”(如32等)則判斷為閏年。這種方法的包含了一百年中的所有閏年的情況。然后判斷大月小月可以判斷月份來確定30進(jìn)制還是31進(jìn)制。進(jìn)位信號(hào)也是分為大月、小月、平年閏年來確定是否產(chǎn)生。
圖3-2-3 日模塊引腳圖
3.2.3 led顯示模塊
主要通過接受setpin的控制信號(hào)來選擇顯示的內(nèi)容,把不同的信號(hào)賦給輸出的端口,從而實(shí)現(xiàn)時(shí)分秒,年月日的切換。3.2.4 星期模塊
通過七進(jìn)制計(jì)數(shù)器實(shí)現(xiàn),同時(shí)帶有預(yù)置的功能,不能同年月調(diào)整聯(lián)動(dòng),但是能單獨(dú)調(diào)整。
圖3-2-4 星期模塊引腳圖
4、仿真與分析
4.1 日模塊
4.1.1 年份為2000年,月份為2月,有29天,初值設(shè)為2000年2月28日,仿真中日為:28、29、1、2、?
4.1.2 年份為1999年,月份為2月,有28天,初值設(shè)為1999年2月28日,仿真中日為:28、1、2、?
4.1.3 年份為2000年,月份為3月,有31天,初值設(shè)為2000年3月30日,仿真中日為:30、31、1、2、?
4.1.4 年份為2000年,月份為4月,有30天,初值設(shè)為2000年4月30日,仿真中日為:30、1、2、?
4.2 年月模塊
初值設(shè)為1999年12月,lock為1時(shí),顯示年月,lock為3時(shí),預(yù)置月,lock為2時(shí),預(yù)置年
4.3 時(shí)分秒定時(shí)模塊
lock為0時(shí),顯示時(shí)分秒,lock為5時(shí),預(yù)置時(shí),lock為6時(shí),預(yù)置分,lock為7時(shí),預(yù)置秒。當(dāng)分到達(dá)59時(shí),整點(diǎn)報(bào)時(shí)器響,speaker高電位,隨著手動(dòng)清零,恢復(fù)原位。
4.4 星期模塊
初值設(shè)為星期1,仿真中顯示為:1、2、3、4、5、6、7、1、?
4.5 分頻模塊
4.6 頂層設(shè)計(jì)模塊
5、課程設(shè)計(jì)總結(jié)
本次課程設(shè)計(jì)歷時(shí)兩天半,經(jīng)過自己不斷的努力完成了數(shù)字鐘的設(shè)計(jì),程序代碼的編寫調(diào)試及仿真。以前只是看書或者編一些很小的程序用來仿真,覺得沒怎么難,但當(dāng)進(jìn)行此次課程設(shè)計(jì)真正處理一個(gè)較大程序時(shí),問題便都顯現(xiàn)出來。雖然在這個(gè)過程中遇到了很多的問題,但是最終都得到了很好的解決。
我此次設(shè)計(jì)的程序是在課本原有數(shù)字鐘程序的基礎(chǔ)上進(jìn)行添加更改得來的,最初在運(yùn)行原有程序時(shí)很順利,但是隨著加的東西越來越多,程序中出現(xiàn)的問題也就越來越多。很多同學(xué)都覺得在已有程序上再添加?xùn)|西看似簡單,實(shí)則很容易混亂,理不清頭緒,而且這個(gè)原有程序是用進(jìn)程所寫,比較麻煩。雖然這樣容易出現(xiàn)問題,不過我覺得這是一個(gè)鍛煉的好機(jī)會(huì)。、在處理分頻模塊時(shí),最開始按照老師的要求設(shè)置了頻率,但是當(dāng)運(yùn)行時(shí),發(fā)現(xiàn)根本出不來,后來與同學(xué)討論后,發(fā)現(xiàn)頻率過大,后來改為八分頻,使得分頻
模塊能夠使用。在一開始加星期模塊時(shí),沒怎么考慮,可是當(dāng)加進(jìn)去后才發(fā)現(xiàn),星期模塊不能與其他模塊很好的相連,不能很好的做到與“日模塊”相合,后來雖有改動(dòng),但最終沒能改成功。在加定時(shí)器功能時(shí),一開始單獨(dú)為定時(shí)器列了一個(gè)模塊,所寫的程序也很復(fù)雜,錯(cuò)誤百出,最后程序改好后,仿真卻出不來。后來經(jīng)過同學(xué)的提點(diǎn),就把程序改簡單了,單純的來個(gè)脈沖就出現(xiàn)高電平,但后來仿真發(fā)現(xiàn)高電平一直在高位,沒法給脈沖,最后沒辦法便手動(dòng)脈沖。與頂層模塊連接后,又發(fā)現(xiàn)分滿59的脈沖沒給,因?yàn)槲业臅r(shí)分秒全都放在了一起,只能將定時(shí)模塊挪到時(shí)分秒模塊中,這樣反而使得整個(gè)工程簡單了一些。
在各個(gè)模塊都能仿真成功后,頂層模塊的程序與仿真卻出現(xiàn)了很多問題。首先是頂層模塊程序有很多警告,例如“second_waver”沒有用到之類的,后來在改動(dòng)的過程中,便把內(nèi)變量換為了外變量,但是有些原來的警告沒有了,但是新的警告又出現(xiàn)了,原本能夠連好的u3與u4 模塊均不能正常連接,后來與同學(xué)自習(xí)查找,才終于將錯(cuò)誤找出,由于粗心大意誤動(dòng)了一些元件例化時(shí)的變量,使得時(shí)間拜拜浪費(fèi)。最后在仿真的時(shí)候,仿真結(jié)果出不來,經(jīng)過與同學(xué)商量在每個(gè)程序中都給年月日等變量均付了初值,才讓仿真出來。
此次課程設(shè)計(jì)雖然只有短短的兩天半的時(shí)間,但是經(jīng)過前期的查找資料,后來的實(shí)驗(yàn)室實(shí)際操作,再到現(xiàn)在的報(bào)告總結(jié),我收獲了很多。其實(shí)完成一個(gè)設(shè)計(jì),編程只是很小的一部分,最主要的在于查找資料以及調(diào)試程序,此次設(shè)計(jì)我在查找資料方面做的不是很充分,以至于設(shè)計(jì)的面很小,而且在遇到問題后不能很快的找出,以后一定要做好準(zhǔn)備工作。此次課程設(shè)計(jì)中遇到的問題看似不大,但都是很好的問題,對(duì)我以后的設(shè)計(jì)有很大的幫助,一定會(huì)牢牢記住。
最后,此次課程設(shè)計(jì)的完成很大程度上取決于老師和同學(xué)對(duì)我的指導(dǎo)與幫助,這更能說明,一個(gè)較大設(shè)計(jì)的完成及實(shí)現(xiàn),不是僅限于自身,我們要學(xué)會(huì)與別人交流溝通,才能做到更好。
6、參考文獻(xiàn)
[1]李景華,杜玉遠(yuǎn).可編程邏輯器件與eda技術(shù).沈陽:東北大學(xué)出版社,2000 [2] 姜如東,vhdl語言程序設(shè)計(jì)及應(yīng)用,北京郵電大學(xué)出版社
[3] 康華光.電子技術(shù)基礎(chǔ)(數(shù)字部分)[m].北 京:高等教育出版社,2001.
[4] [5]
eda課程設(shè)計(jì)題目 eda課程設(shè)計(jì)數(shù)字時(shí)鐘篇三
數(shù)字鐘
一、設(shè)計(jì)要求
設(shè)計(jì)一個(gè)數(shù)字鐘,具體要求如下:
1、具有時(shí)、分、秒計(jì)數(shù)顯示功能,以24小時(shí)循環(huán)計(jì)時(shí)。
2、具有清零、校時(shí)、校分功能。
3、具有整點(diǎn)蜂鳴器報(bào)時(shí)以及l(fā)ed花樣顯示功能。
二、設(shè)計(jì)方案
根據(jù)設(shè)計(jì)要求,數(shù)字鐘的結(jié)構(gòu)如圖8-3所示,包括:時(shí)hour、分minute、秒second計(jì)數(shù)模塊,顯示控制模塊sel_clock,七段譯碼模塊deled,報(bào)時(shí)模塊alert。
三、vhdl程序
library ieee;use ;use ;use ;
----uncomment the following library declaration if instantiating----any xilinx primitives in this code.--library unisim;
--use ;
entityddz is port(rst,clk: in std_logic;hour_h: out std_logic_vector(6 downto 0);hour_l: out std_logic_vector(6 downto 0);min_h: out std_logic_vector(6 downto 0);
min_l: out std_logic_vector(6 downto 0);
sec_h: out std_logic_vector(6 downto 0);
sec_l: out std_logic_vector(6 downto 0));endddz;
architecture behavioral of ddz is signalcnt: std_logic_vector(15 downto 0);signalsec_h_in: std_logic_vector(3 downto 0);signalsec_l_in: std_logic_vector(3 downto 0);signalmin_h_in: std_logic_vector(3 downto 0);signalmin_l_in: std_logic_vector(3 downto 0);signalhour_h_in: std_logic_vector(3 downto 0);signalhour_l_in: std_logic_vector(3 downto 0);
signalclk_s,clk_m,clk_h: std_logic;begin process(rst,clk)begin if rst='0' then
sec_h_in<=(others=>'0');
sec_l_in<=(others=>'0');
clk_m<='1';elsifclk'event and clk='1' then ifsec_l_in=9 then
sec_l_in<=“0000”;
ifsec_h_in=5 then
sec_h_in<=“0000”;
clk_m<='0';
else
sec_h_in<=sec_h_in+1;
clk_m<='1';
end if;else sec_l_in<=sec_l_in+1;
clk_m<='1';
end if;end if;end process;
process(rst,clk_m)begin if rst='0' then
--min_h_in<=(others=>'0');
min_l_in<=(others=>'0');--clk_h<='1';elsifclk_m'event and clk_m='1' then ifmin_l_in=9 then
min_l_in<=“0000”;ifmin_h_in=5 then
min_h_in<=“0000”;else min_h_in<=min_h_in+1;
clk_m<='1';
end if;else min_l_in<=min_l_in+1;
end if;end if;end process;
process(rst,clk_n)begin if rst='0' then
--hour_h_in<=(others=>'0');
hour_l_in<=(others=>'0');--clk_h<='1';elsifclk_m'event and clk_n='1' then ifhour_l_in=3 then
hour_l_in<=“0000”;ifmin_h_in=2 then
hour_h_in<=“0000”;else hour_h_in<=hour_h_in+1;
clk_n<='1';
end if;else hour_l_in<=hour_l_in+1;
end if;end if;end process;
process(sec_l_in)begin casesec_l_in is
when “0000” =>sec_l<=“0000001”;when “0001” =>sec_l<=“1001111”;when “0010” =>sec_l<=“0010010”;when “0011” =>sec_l<=“0000110”;when “0100” =>sec_l<=“1001100”;when “0101” =>sec_l<=“0100100”;when “0110” =>sec_l<=“0100000”;when “0111” =>sec_l<=“0001111”;when “1000” =>sec_l<=“0000000”;when “1001” =>sec_l<=“0000100”;when others =>sec_l<=“1111111”;end case;end process;
process(sec_h_in)begin casesec_h_in is
when “0000” =>sec_h<=“0000001”;when “0001” =>sec_h<=“1001111”;when “0010” =>sec_h<=“0010010”;when “0011” =>sec_h<=“0000110”;when “0100” =>sec_h<=“1001100”;when “0101” =>sec_h<=“0100100”;when “0110” =>sec_h<=“0100000”;when “0111” =>sec_h<=“0001111”;when “1000” =>sec_h<=“0000000”;when “1001” =>sec_h<=“0000100”;when others =>sec_h<=“1111111”;end case;end process;
process(min_l_in)begin casemin_l_in is
when “0000” =>min_l<=“0000001”;when “0001” =>min_l<=“1001111”;when “0010” =>min_l<=“0010010”;
when “0011” =>min_l<=“0000110”;when “0100” =>min_l<=“1001100”;when “0101” =>min_l<=“0100100”;when “0110” =>min_l<=“0100000”;when “0111” =>min_l<=“0001111”;when “1000” =>min_l<=“0000000”;when “1001” =>min_l<=“0000100”;when others =>min_l<=“1111111”;end case;end process;
process(min_h_in)begin casemin_h_in is
when “0000” =>min_h<=“0000001”;when “0001” =>min _h<=“1001111”;when “0010” => min _h<=“0010010”;when “0011” =>min _h<=“0000110”;when “0100” =>min _h<=“1001100”;when “0101” => min _h<=“0100100”;when “0110” =>min _h<=“0100000”;when “0111” =>min _h<=“0001111”;when “1000” =>min _h<=“0000000”;when “1001” =>min _h<=“0000100”;when others =>min _h<=“1111111”;
end case;end process;
process(hour_l_in)begin casehour_l_in is
when “0000” =>hour_l<=“0000001”;when “0001” =>hour_l<=“1001111”;when “0010” =>hour_l<=“0010010”;when “0011” =>hour_l<=“0000110”;when “0100” =>hour_l<=“1001100”;when “0101” =>hour_l<=“0100100”;when “0110” =>hour_l<=“0100000”;when “0111” =>hour_l<=“0001111”;when “1000” =>hour_l<=“0000000”;when “1001” =>hour_l<=“0000100”;when others =>hour_l<=“1111111”;end case;end process;
process(hour_h_in)begin casehour_h_in is
when “0000” =>hour_h<=“0000001”;when “0001” =>hour_h<=“1001111”;when “0010” =>hour_h<=“0010010”;when “0011” =>hour_h<=“0000110”;when “0100” => hour _h<=“1001100”;when “0101” => hour _h<=“0100100”;when “0110” => hour _h<=“0100000”;when “0111” => hour _h<=“0001111”;when “1000” => hour _h<=“0000000”;when “1001” =>hour_h<=“0000100”;when others => hour _h<=“1111111”;end case;end process;end behavioral;
四、vhdl仿真結(jié)果
五、課程設(shè)計(jì)心得
通過這次課程設(shè)計(jì),有效得鞏固了課本所學(xué)的知識(shí),而且通過上機(jī)仿真不斷發(fā)現(xiàn)問題并及時(shí)改正,加深了我們對(duì)該課程設(shè)計(jì)的印象。這次課程設(shè)計(jì),進(jìn)一步加深了我對(duì)eda的了解,使我對(duì)isp有了更深的了解,使我對(duì)應(yīng)用軟件的方法設(shè)計(jì)硬件系統(tǒng)有了更加濃厚的興趣。除此之外,我懂得了理論與實(shí)際相結(jié)合的重要性,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合,從實(shí)踐中得出結(jié)論,才能真正提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。
總之,這次課程設(shè)計(jì)讓我學(xué)會(huì)了很多,對(duì)今后的生活工作用處也頗深。
eda課程設(shè)計(jì)題目 eda課程設(shè)計(jì)數(shù)字時(shí)鐘篇四
《eda課程設(shè)計(jì)》
課程設(shè)計(jì)題目:
基于單片機(jī)的溫濕度采集系統(tǒng)
姓
名:
xxx
學(xué)
班
時(shí)
地
號(hào):
xxxx
級(jí):
xxxx
間:
2014.4.21~ 2013.5.5
點(diǎn):
xxxxx
指 導(dǎo)
老
師:
xxxxx
目錄
一、電路原理圖..................................................................................2
二、電路pcb圖(或?qū)嵨飯D).........................................................2
三、電路效果圖..................................................................................3
四、設(shè)計(jì)總結(jié)......................................................................................3 附錄(單片機(jī)源代碼)......................................................................4
一、電路原理圖
二、電路pcb圖(或?qū)嵨飯D)
三、電路效果圖
四、設(shè)計(jì)總結(jié)
eda的實(shí)驗(yàn)還是挺有趣的,比較講究動(dòng)手能力,當(dāng)然也不能忽略團(tuán)體合作??偟膩碚f本次實(shí)驗(yàn)還是成功了,雖然每個(gè)環(huán)節(jié)都遇到了困難。在生成原理圖的過程中,就曾把導(dǎo)線畫成了placeline而不是placewire,還有芯片的引腳應(yīng)該用net符號(hào)而不是用文本符號(hào),所以這些錯(cuò)誤都導(dǎo)致我花在原理圖上的時(shí)間多了點(diǎn)。而在生成pcb電路圖的過程中遇到的困難則是自動(dòng)布線之后,還有電源的幾個(gè)腳需要手動(dòng)布線,所以各個(gè)元件之間的位置要布置好,以免發(fā)生短路。腐蝕的時(shí)候,由于腐蝕的時(shí)間太長了,有些碳都化開了,導(dǎo)致里面的銅被腐蝕掉了,所以又為我的工作增加了困難。在焊接的時(shí)候,要注意元件的正負(fù)極,還要檢測(cè)錫是否都與那些銅連接上了。最終把led和 dht11的程序燒進(jìn)去就行了。
本次實(shí)驗(yàn)我還是能多多少少學(xué)到點(diǎn)什么的,總的來說還是希望能有多一點(diǎn)這樣的實(shí)習(xí)。
附錄(單片機(jī)源代碼)
//51單片機(jī)控制溫濕度傳感器dht11
lcd1602上顯示當(dāng)前機(jī)最小系統(tǒng)。//lcd 讀進(jìn)去 寫出來 #include
//此聲明一個(gè)布爾型變量即真或假// uchar data_byte,num,i;uchar rh,rl,th,tl,flag;uchar shuzi[4];unsigned char code num1[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};
sbit dht=p2^4;
//dht11data端接單片機(jī)的p2^4口//
//***************
延
時(shí)
函
數(shù)************************************* void delay(uchar ms)//延時(shí)模塊//延時(shí)1毫秒
{
}
void delay1()
//一個(gè)for循環(huán)大概需要8個(gè)多機(jī)器周期
//一個(gè)機(jī)器周期為1us晶振為12mhz也就是說本函數(shù)延時(shí)8us{
} uchar i;
while(ms--)
for(i=0;i<110;i++);
uchar i;
for(i=0;i<1;i++);void display(void){ // if(flag==0)// {
p2=0x07;
p0=num1[shuzi[2]];delay(1);// }
// if(flag==1)// {
p2=0x0b;
p0=num1[shuzi[3]];delay(1);// } // if(flag==2)// {
p2=0x0d;
p0=num1[shuzi[0]];delay(1);// } // if(flag==3)// {
p2=0x0e;p0=num1[shuzi[1]];delay(1);// } }
//**************************dht11
測(cè)
試
某
塊*************************************// void start()//開始信號(hào)
{
dht=1;
delay1();
//主機(jī)發(fā)出8us高電平,開始信號(hào)開始發(fā)出 dht=0;
delay(25);
// 主機(jī)把總線拉低必須大于18ms
dht11能檢測(cè)到起始信號(hào)
dht=1;
//delay1();
//以下三個(gè)延時(shí)函數(shù)差不多為24usdelay1();delay1();
20-40us
}
uchar receive_byte()
//接收一個(gè)字節(jié) 8位// {
uchar i,temp;
for(i=0;i<8;i++)//接收8bit的數(shù)據(jù)
{
while(!dht);
//等待40-50us的低電平開始信號(hào)結(jié)束
delay1();
//開始信號(hào)結(jié)束之后延時(shí)26us-28us
delay1();delay1();
temp=0;
//時(shí)間為26us-28usif(dht==1)
temp=1;
//如果26us-28us
'0'
數(shù)據(jù)為'1'
while(dht);
//
'0'為26us-28us
'1'為70us
} data_byte<<=1;
//data_byte|=temp;
//接收每一位的數(shù)據(jù),相或保存數(shù)據(jù)
return data_byte;}
void receive()//接收數(shù)據(jù)// {
uchar t_h,t_l,r_h,r_l,check,num_check,i;start();
//開始信號(hào)//調(diào)用開始信號(hào)子函數(shù)
dht=1;
//主機(jī)設(shè)為輸入判斷從機(jī)dht11響應(yīng)信號(hào)
if(!dht)
//判斷從機(jī)是否有低電平響應(yīng)信號(hào)// {
while(!dht);//判斷從機(jī)發(fā)出 40us 的低電平響應(yīng)信號(hào)是否結(jié)束//
while(dht);
//判斷從機(jī)發(fā)出 40us 的高電平是否結(jié)束 如結(jié)束則從機(jī)進(jìn)入發(fā)送數(shù)據(jù)狀態(tài),主機(jī)進(jìn)入數(shù)據(jù)接收狀態(tài)
數(shù)
//兩個(gè)while語句加起來就是dht11的響應(yīng)信號(hào)
r_h=receive_byte();//濕度高位
調(diào)用接受一個(gè)字節(jié)的子函
r_l=receive_byte();//濕度低位
t_h=receive_byte();//溫度高位
t_l=receive_byte();//溫度低位
check=receive_byte();//校驗(yàn)位
//結(jié)束信號(hào)
dht=0;
//當(dāng)最后一bit數(shù)據(jù)接完畢后主機(jī)拉低電平50us// for(i=0;i<7;i++)//差不多8us的延時(shí)
delay1();
dht=1;
//總線由上拉電阻拉高進(jìn)入空閑狀態(tài)
num_check=r_h+r_l+t_h+t_l;
if(num_check==check)//判斷讀到的四個(gè)數(shù)據(jù)之和是否與校驗(yàn)位相同
{
rh=r_h;
rl=r_l;
th=t_h;
tl=t_l;
check=num_check;}
shuzi[0]=rh/10;shuzi[1]=rh%10;shuzi[2]=th/10;shuzi[3]=th%10;
} }
void main()//主函數(shù)模塊// { while(1)
//進(jìn)入死循環(huán)
{
receive();
//接收數(shù)據(jù)
display();
} }
eda課程設(shè)計(jì)題目 eda課程設(shè)計(jì)數(shù)字時(shí)鐘篇五
考試序號(hào):28
自動(dòng)打鈴系統(tǒng)設(shè)計(jì)說明書
學(xué) 生 姓 名:周文江
學(xué)
號(hào):14112502521
專 業(yè) 班 級(jí):1102
報(bào)告提交日期:2013.11.26
湖 南 理 工 學(xué) 院 物 電 學(xué) 院
目錄
一、題目及要求簡介……………3 1.設(shè)計(jì)題目…………………3 2.總體要求簡介……………3
二、設(shè)計(jì)方案說明……………3
三、系統(tǒng)采用器件以及模塊說明………3 1.系統(tǒng)框圖…………4 2.選擇的fpga芯片及配置………4 3.系統(tǒng)端口和模塊說明…………5
四、各部分仿真結(jié)果………5
五、調(diào)試及總結(jié)………6
六、參考文獻(xiàn)……7
七、附錄………7
一、題目及要求簡介
1、設(shè)計(jì)題目
設(shè)計(jì)一個(gè)多功能自動(dòng)打鈴系統(tǒng)
2、總體要求簡介
① 基本計(jì)時(shí)和顯示功能(24小時(shí)制顯示),包括:
1.24小時(shí)制顯示 2.動(dòng)態(tài)掃描顯示; 3.顯示格式:88-88-88 ② 能設(shè)置當(dāng)前時(shí)間(含時(shí)、分)③ 能實(shí)現(xiàn)基本打鈴功能,規(guī)定:
06:00起床鈴,打鈴5s
二、設(shè)計(jì)方案說明
本次設(shè)計(jì)主要采用verilog hdl硬件描述性語言、分模塊法設(shè)計(jì)的自動(dòng)打鈴系統(tǒng)。由于這次用的開發(fā)板提供的是50m晶振。首先要對(duì)時(shí)鐘進(jìn)行分頻,當(dāng)計(jì)時(shí)到2fa_f07f時(shí)完成1s分頻,通過計(jì)時(shí)到60s產(chǎn)生分鐘進(jìn)位信號(hào),再通過60分鐘產(chǎn)生時(shí)鐘進(jìn)位信號(hào)。最后通過6個(gè)寄存器對(duì)時(shí)分秒進(jìn)行鎖存最終輸出到8個(gè)數(shù)碼管上完成顯示。當(dāng)顯示時(shí)鐘和默認(rèn)鬧鐘時(shí)鐘相等時(shí),驅(qū)動(dòng)打鈴模塊。通過key_mode,key_turn,key_change查看鬧鐘,時(shí)鐘顯示,調(diào)整時(shí)鐘。
三、系統(tǒng)采用器件以及模塊說明
1.系統(tǒng)框圖如下:
:下如圖框統(tǒng)系
2.選擇的fpga芯片及配置:本次系統(tǒng)設(shè)計(jì)采用的fpga芯片是alter公司生產(chǎn)的cyclone ii ep2c8q208c8。該芯片是208個(gè)管腳,138個(gè)io,并且具有兩個(gè)內(nèi)部pll,而且內(nèi)嵌乘法器,8k的邏輯門,資源相當(dāng)豐富。完成這次自動(dòng)打鈴系統(tǒng)的設(shè)計(jì)總共消耗250個(gè)le單元,22個(gè)io口,131個(gè)寄存器。經(jīng)過綜合后,本系統(tǒng)最高能實(shí)現(xiàn)145m的運(yùn)行速度。通過quartus ii 軟件觀察到內(nèi)部的rtl圖如下
3.系統(tǒng)端口和模塊說明
(1)分頻部分
分頻器的作用是對(duì)50mhz的系統(tǒng)時(shí)鐘信號(hào)進(jìn)行分頻,得到頻率為1hz的信號(hào),即為1s的計(jì)時(shí)信號(hào)。
(2)按鍵部分
按鍵key_mode--0為顯示計(jì)時(shí),1為鬧鐘顯示,2為調(diào)整時(shí)間。按鍵key_turn—0為調(diào)整小時(shí),1為調(diào)整分鐘。按鍵key_change—每按一次加1(3)計(jì)時(shí)部分
通過sec_l,sec_h,min_l,min_h,hour_l,hour_h 6個(gè)寄存器對(duì)時(shí)分秒進(jìn)行鎖存然后送入數(shù)碼管顯示
(4)鬧鐘模塊
當(dāng)設(shè)定的鬧鐘時(shí)間和數(shù)碼管上顯示的時(shí)間相等時(shí)驅(qū)動(dòng)鬧鐘,完成打鈴,持續(xù)時(shí)間5s。
(5)數(shù)碼管顯示模塊
顯示模塊是由8個(gè)位選8個(gè)段選構(gòu)成的顯示模塊,利用人眼的余暉效果完成動(dòng)態(tài)掃描,顯示時(shí)間。
四、各部分仿真結(jié)果
測(cè)試文件如下:
module clock_tb;reg sysclk,rst_b;reg key_mode,key_turn,key_change;wire buzzer;
wire [7:0] led_sel,led_data;clock i_clock(.sysclk(sysclk),.rst_b(rst_b),.key_mode(key_mode),.key_change(key_change),.key_turn(key_turn),.buzzer(buzzer),.led_sel(led_sel),.led_data(led_data));initial begin sysclk = 1'b1;rst_b = 1'b0;//復(fù)位信號(hào)
#30 rst_b = 1'b1;end always #10 sysclk = ~sysclk;//輸入的系統(tǒng)時(shí)鐘,20ns的周期 endmodule
五、調(diào)試及總結(jié)
本次課程設(shè)計(jì)總共花費(fèi)了四天左右的時(shí)間,設(shè)計(jì)了自動(dòng)打鈴系統(tǒng)。通過這次的設(shè)計(jì)更加熟悉了對(duì)eda技術(shù)的了解和認(rèn)識(shí),在中也發(fā)現(xiàn)許多不足的地方。使用了自頂而下的設(shè)計(jì)方法,使得設(shè)計(jì)更加的簡單和明了。在調(diào)試過程中,有些代碼的設(shè)計(jì)不規(guī)范性,導(dǎo)致時(shí)序相當(dāng)緩慢,甚至編譯綜合都會(huì)報(bào)錯(cuò)。在不斷的修改下,發(fā)現(xiàn)時(shí)序電路和組合邏輯最好分開寫,這樣便于查錯(cuò),和修改代碼。畢竟verilog hdl語言不同于c語言,不能以軟件的思想來設(shè)計(jì),而是要利用電路的思想來編程,這樣可以更好的節(jié)省資源,使得時(shí)序也比較的簡單明了。在以后的學(xué)習(xí)及程序設(shè)計(jì)當(dāng)中,我們一定要倍加小心,在程序出現(xiàn)不正常運(yùn)行的情況下要耐心調(diào)試,盡量做到精益求精。
最后通過這次eda方面的課程設(shè)計(jì),提高了我們對(duì)eda領(lǐng)域及通信電路設(shè)計(jì)領(lǐng)域的認(rèn)識(shí),有利于培養(yǎng)我們?cè)谕ㄐ烹娐積da方面的設(shè)計(jì)能力。有利于鍛煉我們獨(dú)立分析問題和解決問題的能力。
六、文獻(xiàn)參考
[1].王金明、左自強(qiáng) 編,《eda技術(shù)與verilog設(shè)計(jì)》科學(xué)出版社
2008.8 [2].杜慧敏、李宥謀、趙全良 編,《基于verilog的fpga設(shè)計(jì)基礎(chǔ)》 西安電子科技大學(xué)出版社 2006.2 [3].韓彬 編,《從零開始走進(jìn)fpga世界》杭州無線電愛好者協(xié)會(huì)出版社 2011.8.20
七、附錄(實(shí)物圖及源碼)
module clock(//input
sysclk,rst_b,key_mode,key_change,key_turn,//output
buzzer,led_sel,led_data);
input sysclk,rst_b;//sysclk--global system clock,rst_b--global reset signal input key_mode;//mode choose.0--timing function.1--alarm clock function.2--adjust function input key_turn;//choose adjust minute or hour input key_change;//count add 1 output buzzer;//device buzzer output [7:0] led_sel;//led tube bit choose
output [7:0] led_data;//led_tube 8 bit data choose
parameter init_hour = 8'h12;parameter init_min = 8'h59;parameter init_sec = 8'h50;//initial time :12:59:50 parameter init_alarm_hour = 8'h06;parameter init_alarm_min = 8'h30;//initial alarm time : 06:30:0 parameter count_1s = 28'h2fa_f07f;//count time 1s;
reg [7:0] sec;reg [7:0] min;reg [7:0] hour;reg [3:0] min_l;//minute low 4 bit reg [3:0] min_h;//minute high 4 bit reg [3:0] hour_l;//hour low 4 bit reg [3:0] hour_h;//hour high 4 bit reg [23:0] key_time;//press key away shake reg key_mode_n;//press key_mode next state reg key_change_n;//press key_change next state reg key_turn_n;//press key_turn next state wire key_mode_press;//sure button press key_mode wire key_turn_press;//sure button press key_turn wire key_change_press;//sure button press key_change
always @(posedge sysclk)key_mode_n <= key_mode;assign key_mode_press =(!key_mode)&&(key_mode_n);always @(posedge sysclk)key_turn_n <= key_turn;assign key_turn_press =(!key_turn)&&(key_turn_n);always @(posedge sysclk)key_change_n <= key_change;assign key_change_press =(!key_change)&&(key_change_n);
always @(posedge sysclk or negedge rst_b)begin if(!rst_b)key_time <= 24'h0;else if(key_time!= 24'h0)
key_time <= key_time + 24'h1;else if((key_time == 24'h0)&&(key_mode_press || key_change_press || key_turn_press))key_time <= key_time + 24'h1;
end
reg [1:0] mode_num;//key mode..0--timing function.1--alarm clock function.2--adjust function always @(posedge sysclk or negedge rst_b)begin if(!rst_b)mode_num <= 2'b00;else if(mode_num == 2'h3)mode_num <= 2'h0;else if(key_mode_press &&(key_time == 24'h0))
mode_num <= mode_num + 2'h1;end
always @(*)begin if(mode_num == 2'h1)begin
min = init_alarm_min;hour = init_alarm_hour;end else begin
min = {min_h,min_l};hour = {hour_h,hour_l};end end
reg fm;//choose turn hour or minute always @(posedge sysclk or negedge rst_b)begin if(!rst_b)fm <= 1'b0;else if(key_turn_press &&(mode_num == 2'h2)&&(key_time == 24'h0))
fm <= ~fm;end
reg [27:0] time_cnt;///count time reg [27:0] time_cnt_n;//count time next state always @(posedge sysclk or negedge rst_b)begin if(!rst_b)time_cnt <= 28'h0;else time_cnt <= time_cnt_n;end
always @(*)begin if(time_cnt == count_1s)time_cnt_n <= 28'h0;else if(mode_num!= 2'h0)time_cnt_n <= time_cnt;else time_cnt_n <= time_cnt + 28'h1;end
reg [3:0] sec_l;//second low 4 bit reg [3:0] sec_h;//second high 4 bit wire sec_cb;//second carry bit signal assign sec_cb =(sec_l == 4'h9)&&(sec_h == 4'h5);always @(posedge sysclk or negedge rst_b)begin if(!rst_b)begin
sec_l <= init_sec[3:0];sec_h <= init_sec[7:4];end else if((sec_l == 4'h9)&&(sec_h!= 4'h5)&&(time_cnt == count_1s))begin
sec_l <= 4'h0;sec_h <= sec_h + 4'h1;end else if(sec_cb &&(time_cnt == count_1s))begin
sec_l <= 4'h0;sec_h <= 4'h0;end else if(time_cnt == count_1s)
sec_l <= sec_l + 4'h1;end
wire min_cb;//minute carry bit signal assign min_cb =(min_l == 4'h9)&&(min_h == 4'h5);always @(posedge sysclk or negedge rst_b)begin if(!rst_b)begin
min_l <= init_min[3:0];min_h <= init_min[7:4];end else if((sec_cb)&&(min_l!=4'h9)&&(time_cnt == count_1s))
min_l <= min_l + 4'h1;else if((sec_cb)&&(min_l == 4'h9)&&(min_h!= 4'h5)&&(time_cnt == count_1s))begin
min_l <= 4'h0;min_h <= min_h + 4'h1;end else if((sec_cb)&&(min_cb)&&(time_cnt == count_1s))begin
min_l <= 4'h0;min_h <= 4'h0;end else if((fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time == 24'h0)&&(min_l!= 4'h9))
min_l = min_l + 4'h1;else if((fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time ==
24'h0)&&(min_l == 4'h9)&&(min_h!=4'h5))begin
min_l = 4'h0;min_h = min_h + 4'h1;end else if((fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time == 24'h0)&&(min_l == 4'h9)&&(min_h ==4'h5))begin
min_l = 4'h0;min_h = 4'h0;end end
always @(posedge sysclk or negedge rst_b)begin if(!rst_b)begin
hour_l <= init_hour[3:0];hour_h <= init_hour[7:4];end else if((sec_cb)&&(min_cb)&&(hour_l!= 4'h9)&&(hour_h!= 4'h2)&&(time_cnt == count_1s))
hour_l <= hour_l + 4'h1;else if((sec_cb)&&(min_cb)&&(hour_l!= 4'h3)&&(hour_h == 4'h2)&&(time_cnt == count_1s))
hour_l <= hour_l + 4'h1;else if((sec_cb)&&(min_cb)&&(hour_l == 4'h9)&&(hour_h!= 4'h2)&&(time_cnt == count_1s))begin
hour_l <= 4'h0;hour_h <= hour_h + 4'h1;end else if((sec_cb)&&(min_cb)&&(hour_l == 4'h3)&&(hour_h == 4'h2)&&(time_cnt == count_1s))begin
hour_l <= 4'h0;hour_h <= 4'h0;end else if((!fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time == 24'h0)&&(hour_l!= 4'h9)&&(hour_h!=4'h2))
hour_l <= hour_l + 4'h1;else if((!fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time == 24'h0)&&(hour_l!= 4'h3)&&(hour_h ==4'h2))
hour_l <= hour_l + 4'h1;else if((!fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time == 24'h0)&&(hour_l == 4'h9)&&(hour_h!=4'h2))begin
hour_l <= 4'h0;hour_h <= hour_h + 4'h1;end else if((!fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time ==
24'h0)&&(hour_l == 4'h3)&&(hour_h ==4'h2))begin
hour_l <= 4'h0;hour_h <= 4'h0;end end
wire buzzer_en;assign buzzer_en =(init_alarm_min == {min_h,min_l})&&(init_alarm_hour == {hour_h,hour_l});
led_tube i_led_tube(.sysclk(sysclk),.rst_b(rst_b),.scan_time(24'h1f090),.data0({1'h1,sec_l}),.data1({1'h1,sec_h}),.data2({1'h1,4'ha}),.data3({1'h1,min[3:0]}),.data4({1'h1,min[7:4]}),.data5({1'h1,4'ha}),.data6({1'h1,hour[3:0]}),.data7({1'h1,hour[7:4]}),.led_data(led_data),.led_sel(led_sel));buzzer i_buzzer(.sysclk(sysclk),.rst_b(rst_b),.buzzer_en(buzzer_en),.buzzer(buzzer));endmodule