第一篇:燕山大學EDA課程設計電子日歷
燕 山 大 學 EDA課程設計報告書
姓名: 班級: 學號: 日期:
一、設計題目:電子日歷
二、設計要求
1.能顯示年、月、日、星期,如01.11.08 6,星期日顯示8 2.年、月、日、星期可調 3.不考慮閏年
三、設計思路
為實現本電路要求,采取模塊電路設計方法。本電路系統主要 包括以下三大模塊:
1.計數模塊 2.控制模塊 3.譯碼器顯示模塊
四、設計過程
1.計數模塊 1)星期計數模塊
由于星期日要顯示8,一般芯片難以實現,可通過四個JKFF觸發器設計而成。電路圖如下:
波形仿真圖如下:
2)天計數模塊
通過兩個74160芯片作計數電路和DFF作去毛刺電路設計而成,若沒有去毛刺電路,在硬件仿真時,月計數會出現連續計兩次的情況。由于不同月份有不同天數(31、30、28),故需要三個輸入端(C31、C30、C28)選擇計數的進制,同一時刻只能有一個有效(輸入高電平)。電路圖如下:
C30端有效時的波形仿真圖如下:
3)月計數模塊
通過兩個74160芯片設計而成,電路圖如下:
波形仿真圖如下:
4)月計數對天計數的反饋模塊
通過畫真值表列出邏輯表達式,從而設計出如下電路:
波形仿真圖如下:
5)年計數模塊
通過兩個74160芯片設計而成,為了實現可調,將年個位對十位的進位輸出端C先到控制模塊上。電路圖如下:
波形仿真圖如下:
2.控制模塊
時鐘脈沖經CP端輸入,K、Kweek、Kday、Kmonth、Kyear1、Kyear2為手動控制端。K端輸入高電平時為調節狀態,輸入低電平時為自動計數狀態。電路圖如下:
3.譯碼器顯示模塊
該模塊由一個74160芯片、四個數據選擇74151和譯碼驅動器7449組成。電路圖如下:
4.總圖
連接控制模塊和計數模塊。電路圖如下:
該部分波形仿真圖如下:
在其中可以發現,月比天滯后1.5個時鐘周期(其中1個時鐘周期是由于天計數模塊的去毛刺電路產生的),年個位比月滯后0.5個時鐘周期,年十位比年個位滯后0.5個時鐘周期。由于時間有限,知識經驗不足等限制,在答辯前仍未解決該問題。
再連接譯碼器顯示模塊。電路圖如下:
接通電源時,K端要先輸入高電平,把月調到非0,才能在K端輸入低電平后正常計數。
五、總結
第二篇:燕山大學EDA課程設計數字跑表
一、設計題目及要求 設計題目:數字跑表
要求:1 具有暫停,啟動功能;
具有重新開始功能; 用六個數碼管分別顯示百分秒,秒和分鐘。
二、設計過程及內容 總體設計:
第一,對于要實現的暫停、啟動和重新開始功能,需要有一個控制模塊完成相關控制。第二由題意可知需要一個分頻模塊,將實驗箱提供的頻率轉換為100HZ即數字跑表百分秒的頻率。第三是計時模塊,完成跑表的百分秒、秒和分鐘的計時功能。第四由于實驗箱提供的數碼顯示是掃描顯示,這就需要一個選時模塊。第五部分則是顯示模塊。詳細設計過程:
根據要求,將設計分成五個模塊:
1、控制模塊:使跑表具有啟動、暫停及重新開始的功能;
2、分頻模塊:將實驗箱所提供的頻率轉換為設計題目所需要的100HZ的時鐘脈沖;
3、計時模塊:進行百分秒、秒、分的計時,并且將當前時間輸出給選時模塊;
4、選時模塊:從計時器得到當前時間輸出給顯示模塊;
5、顯示模塊:通過數碼管顯示時間。
總圖如下:
仿真波形:
第一個模塊:控制模塊
控制模塊主要運用了兩個D觸發器,輸入到觸發器的時鐘信號CLK1頻率為2.86Hz,對電路起到了防抖的功能。
START/STOP為啟動暫停按鈕,當跑表為START狀態時CLK端為高電平,Q為1,時鐘信號輸出,當跑表為STOP狀態時CLK端為低電平,Q為0,時鐘信號不輸出,從而實現開始和暫停的功能。與門可控制時鐘信號是否被輸出到下一級。
RESET端為全局清零按鈕,接到控制模塊和計時模塊的清零端,負責將計數器清零。當RESET為低電平時,控制模塊和總計數器模塊清零,跑表重新開始工作。電路圖如下:
仿真波形:
第二個模塊:分頻模塊
為了將實驗箱提供的1465HZ轉換成實驗需要的100HZ,我將74161接成15進制計數器,實現分頻的功能,轉換為100HZ的近似時鐘信號。然后將輸出的時鐘接入到計時模塊。電路圖如下: 3
仿真波形:
第三個模塊:計時模塊
計時模塊由一個100進制計數器和兩個60進制計數器構成,從而實現百分秒向秒、秒向分的計數功能需求。100進制計數器和60進制計數器均采用兩個74160,100進制采用并行進位方式,60進制采用整體置數方式。從100進制計數器和60進制計數器這三個輸出端分別接出八個端口(百分秒、秒、分的個位及十位分別由四個二進制代碼表示),將當前時間代碼輸送給選時模塊,以實現時間的選擇和顯示。(百分秒個位:H0A,H0B,H0C,H0D;百分秒十位:H1A,H1B,H1C,H1D;秒個位:S0A,S0B,S0C,S0D;秒十位:S1A,S1B,S1C,S1D;分個位:M0A,M0B,M0C,M0D;分十位:M1A,M1B,M1C,M1D.)電路圖如下:
仿真波形:
100進制計數器(count100): 仿真波形:
60進制計數器(count60):
仿真波形:
第四個模塊:選時模塊
選時模塊由四個八選一數據選擇器74LS151和一個地址選擇器74LS161構成。
地址選擇器74LS161接入一個1465 HZ的時鐘信號,使能端和清零端接高電平,使其循環工作,產生的一組循環地址碼接入到四個八選一數據選擇器74LS151上,使其對地址相同的一組數據進行選擇,產生四個二進制數CA,CB,CC,CD,即為數碼管所要顯示的數字的編碼。同時,地址選擇器74LS161產生一組循環地址碼a、b、c,接到數碼管的地址端,使其循環顯示數字。
第一個74LS151上的輸入端為百分秒、秒、分個位及十位的四位二進制的最低位(H0A, H1A ,S0A,S1A, M0A, M1A), 第二個74LS151上的輸入端為百分秒、秒、分個位及十位的四位二進制的次低位(H0B,H1B ,S0B,S1B,M0B,M1B), 第三個74LS151上的輸入端為百分秒、秒、分個位及十位的四位二進制的第二位(H0C,H1C ,S0C,S1C,M0C,M1C), 第四個74LS151上的輸入端為百分秒、秒、分個位及十位的四位二進制的第一位(H0D,H1D ,S0D,S1D,M0D,M1D),通過這四個八位二進制數比較器74LS151選出同一組數(百分秒個位:H0A,H0B,H0C,H0D;百分秒十位:H1A,H1B,H1C,H1D;秒個位:S0A,S0B,S0C,S0D;秒十位:S1A,S1B,S1C,S1D;分個位:M0A,M0B,M0C,M0D;分十位:M1A,M1B,M1C,M1D)作為輸出CA,CB,CC,CD,接到顯示模塊輸入端。電路圖如下:
仿真波形:
第五個模塊:顯示模塊
顯示模塊采用BCD—七段顯示譯碼器7448對實驗板上數碼管進行驅 動。由選時模塊輸出的顯示數字編碼CA,CB,CC,CD接至輸入端A,B,C,D,使輸出端產生七位譯碼連接到實驗箱公共數據輸入端ABCDEDG,從而顯示出數據。電路圖如下:
仿真波形:
三、設計結論
兩周的課程設計很快就結束了,雖然時間很短,但是收獲頗豐。通過這次課程設計,我學到了許多關于EDA的知識,學習到了很多EDA的實用功能,更重要的是鍛煉了我的實踐動手能力,使我深刻地認識到僅僅學習課本上的知識是遠遠不夠的,要多思考,多實踐,才能真正把學到的知識用到實際中,而且我也深刻認識到通信專業在各個領域是多么有用武之地,更加使我有了學習深造的動力。
在設計的過程中遇到諸多問題,一個接一個,總結下來還是軟件沒有學深刻,出了問題也不知道如何排查,波形圖一直找不到自己想看到的,后來經過問同學和自己的總結才知道這個仿真的時間要足夠長,才能看到自己所需要的部分。讓我知道做一件事之前的準備工作是多么重要,同時在設計的過程中發現了自己的不足之處,對以前所學過的知識理解得不夠深刻,掌握得不夠牢固。遇到問題才去翻書查資料,這些都是我以后要改進的地方。
這次的EDA課程設計給了我一次非常重要也非常難得的實踐機會,使我可以將平時課本上學習的理論知識應用于實際操作。設計過程多于我這個專業知識還不牢固的很困難,先前兩天看了課本學習了軟件,每個子模塊和波形圖出來的都比較順利,但當做到總圖的時候遇到了很多困難,經過詢問老師后也都解決了。實驗箱的部分比較順利,由于粗心連錯了線,頻率也沒選對,總之過程很艱難,但最終還是做出來了。最后感謝老師給與我這次寶貴的實踐機會!
第三篇:數字電子EDA課程設計八音電子琴
燕山大學EDA課程設計
實驗報告
院系:信息科學與工程學院
姓名:
班級:
學號:
日期:
[實驗名稱] 八音電子琴
[實驗要求] 1.能發出1.2.3.4.5.6.7.i八個音
2.用按鍵作為鍵盤
3.C調至B調對應頻率如下表
音調 C(高音)B A G F E D C
頻率(Hz)261.63x2 493.88 440.00 392.00 349.23 329.63 293.66 261.63 [實驗電路設計] 1.命題分析
根據命題的要求,要使揚聲器發音,需要在其輸入信號端連接一個對應頻率的方波信號.實驗使用的信號源可以提供從幾Hz到幾兆Hz不等的信號頻率,自然可以想到本實驗命題的關鍵是一個具有相應分頻比的分頻器.考慮到硬件(按鈕)在實際工作過程中會因元件的接觸產生一些不可避免的抖動脈沖電平,會對實驗造成影響,因此需要在按鍵接入線路中安裝防抖動電路.2.設計過程
1>分頻器
為了取得合適的電路復雜度和可接受的誤差范圍,分頻器的時鐘信號選取為器件所提供的JPCK—1(3MHz音頻信號).然后通過計算,用時鐘信號頻率除以各發音頻率,得到的分頻比如下表:
分頻比(16進
制)
5DEE 6384 6F84 7D62 8ADE 951C A760 BBDE
頻率(Hz)高C:261.63x2 B:493.88 A:440.00 G:392.00 F:349.23 E:329.63 D:293.66 C:261.63 利用四片十六進制計數器74LS161就可以連接成適用的分頻器.分頻器連接完成后會產生一個預定頻率的周期脈沖.但是實驗要求的方波其占空比應該為1:1,因此在輸出脈沖端加裝一個T觸發器,每次脈沖到達觸發器的時候輸出便會跳變電平,這就達到了驅動揚聲器的條件.但是在應用了T觸發器后輸出方波的周期比預定的擴大了一倍,也就是說頻率減至原來的二分之一.此時應重新選擇時鐘信號,令其為原來2倍即可.根據實驗指導書,最終確定選擇的時鐘信號為6MHz.2>防抖動電路
利用D觸發器的電壓跟隨特性可以用一個頻率較低的時鐘信號驅動,達到防止按鍵抖動的目的.電路較簡單,見圖3.圖1.時鐘分頻電路(downway)
圖2.CP為375K時上圖的B4輸出波形
由于設計的原因,本電路只能支持單音節輸入.當同時鍵入兩個以上的音階時,分頻比較小的(比較高的音階)優先發聲.圖3.按鍵輸入防抖動電路
3>電路組合
組合后的電路模塊如圖4.共有11個輸入端和1個輸出端.其中,CP_6M為整個電路的主頻,使用電路板上的6MHz信號輸出端;CP_1US為防抖動電路中觸發器所使用的時鐘,要求頻率不高,選擇電路板提供的CLK3-3(12Hz);KEYCa-B是電子琴的輸入按鍵接口,依次是從低音到高音.Speaker是電路的輸出端,接入揚聲器,為其產生相應音階的頻率.實際電路如圖4.連接完成后,對該電路進行仿真測試,如圖5,令其CP_6M為6MHz,CP_1US為一個較低頻率脈沖,設臵KEYB(音節B)為有效電平,在speaker上得到的輸出頻率為493,與實際音節的頻率相同.圖4.八音電子琴
圖5.電子琴完成品的仿真波形
T觸發器2分頻電路
[硬件測試] [實習心得] 第一感覺,數字電子技術EDA實習很有意思.我們可以有充分的時間去思考怎么做出一個東西,這個東西的用處也許不大甚至幾乎沒有,但重要的是思考的過程:從它的用途總結出它的特性,從它的特性構思出它的原理,從原理到構建模型,再到模型的實現,利用已有的知識,可用的元件,最終組合出一個具有高度邏輯性的組合電路,這和我們小時候玩搭積木差不多.把積木一塊塊的搭成一座城堡,中間缺少任何一層甚至任何一塊,城堡都可能會倒塌.同理,在我們構建命題所給的元器件時任何一個邏輯錯誤都可能是致命的,導致最后無法出現正確結果或者干脆不能用.因此,實習,有意思的同時還不能大意.這是一個鍛煉邏輯思維和思維嚴謹性的極好的機會,我和我的同學們在這次工作中受益非淺.大家都積極思思考,查找資料,集思廣益來解決現有的問題。在這個過程中我幫助了別人也得到了別人的幫助。
我在和別人研究問題的時候發現在所有題目當中,以分頻器為基本的[八音電子琴]算是比較簡單的,我很早就做完了.但是很多人的題目除了分頻以外還要求臵數,可調,顯示輸出,以及產生相對復雜的多的時序,這讓我覺得我做的快只是運氣好,抽了個好簽而已,同時我也了解到自己的不足之處.仍需努力.最后感謝老師們耐心的講解和提點。
第四篇:燕山大學傳感器課程設計(DOC)
目錄
摘要
電渦流位移傳感器設計
一、設計要求
二、總體設計方案
三、電渦流傳感器的基本原理
3-1電渦流效應和傳感器等效電路 3-2電渦流形成的范圍
四、傳感器的結構形式
五、測量電路及分析 5-1 測量電路 5-2 電路各單元分解
六、實驗數據及誤差分析
參考文獻
摘要
隨著現代測量、控制盒自動化技術的發展,傳感器技術越來越受到人們的重視。特別是近年來,由于科學技術的發展及生態平衡的需要,傳感器在各個領域的作用也日益顯著。傳感器技術的應用在許多個發達國家中,已經得到普遍重視。在工程中所要測量的參數大多數為非電量,促使人們用電測的方法來研究非電量,及研究用電測的方法測量非電量的儀器儀表,研究如何能正確和快速的非電量技術。電渦流傳感器已成為目前電測技術中非常重要的檢測手段,廣泛的應用于工程測量和科學實驗中。
關鍵詞:電渦流式傳感器 傳感器技術 電量非電量
電渦流位移傳感器設計
一、設計技術要求
1、線性范圍(mm):1
2、分辨率(um):1
3、線性誤差:《3%
4、使用溫度范圍:-15~+80
二、總體方案設計
電渦流傳感器能靜態和動態地非接觸、高線性度、高分辨力地測量被測金屬導體距探頭表面的距離。它是一種非接觸的線性化計量工具。電渦流傳感器能準確測量被測體(必須是金屬導體)與探頭端面之間靜態和動態的相對位移變化。電渦流傳感器以其長期工作可靠性好、測量范圍寬、靈敏度高、分辨率高、響應速度快、抗干擾力強、不受油污等介質的影響、結構簡單等優點。根據下面的組成框圖,構成傳感器。
根據組成框圖,具體說明各個組成部分的材料:
(1)敏感元件:傳感器探頭線圈是通過與被測導體之間的相互作用,從而產生被測信號的部分,它是由多股漆包銅線繞制的一個扁平線圈固定在框架上構成,線圈框架的材料是聚四氟乙烯,其損耗小,電性能好,熱膨脹系數小。
(2)傳感元件: 前置器是一個能屏蔽外界干擾信號的金屬盒子,測量電路完全裝在前置器中,并用環氧樹脂灌封。
(3)測量電路:本電路擬采用變頻調幅式測量電路。
三、電渦流傳感器的基本原理
3·
1、電渦流效應和傳感器等效電路
電渦流式傳感器是利用電渦流效應,將位移、溫度等非電量轉化為阻抗的變化(或電感的變化,或Q值的變化)從而進行非電量電測的。
根據法拉第電磁感應定律,當傳感器探頭線圈通以正弦交變電流i1時,線圈周圍空間必然產生正弦交變磁場H1,它使置于此磁場中的被測金屬導體表面產生感應電流,即電渦流,如圖2-2中所示。與此同時,電渦流i2又產生新的交變磁場H2;H2與H1方向相反,并力圖削弱H1,從而導致探頭線圈的等效電阻相應地發生變化。其變化程度取決于被測金屬導體的電阻率ρ,磁導率μ,線圈與金屬導體的距離x,以及線圈激勵電流的頻率f等參數。如果只改變上述參數中的一個,而其余參數保持不變,則阻抗Z就成為這個變化參數的單值函數,從而確定該參數的大小。
電渦流傳感器的工作原理,如圖2-2所示:
為了便于分析,把被測金屬導體上形成的電渦流等效成一個短路環中的電流,這樣就可以得到如圖2-3所示的等效電路。
圖中R1,L1為傳感器探頭線圈的電阻和電感,短路環可以認為是一匝短路線圈,其中R2,L2為被測導體的電阻和電感。探頭線圈和導體之間存在一個互感M,它隨線圈與導體間距離的減小而增大。U1為激勵電壓,根據基爾霍夫電壓平衡方程式,上圖等效電路的平衡方程式如下:
經求解方程組,可得I1和I2表達式:
由此可得傳感器線圈的等效阻抗為:
從而得到探頭線圈等效電阻和電感。
通過式(2-4)的方程式可見:渦流的影響使得線圈阻抗的實部等效電阻增加,而虛部等效電感減小,從而使線圈阻抗發生了變化,這種變化稱為反射阻抗作用。所以電渦流傳感器的工作原理,實質上是由于受到交變磁場影響的導體中產生的電渦流起到調節線圈原來阻抗的作用。
因此,通過上述方程組的推導,可將探頭線圈的等效阻抗Z表示成如下一個簡單的函數關系:
其中,x為檢測距離;μ為被測體磁導率;ρ為被測體電阻率;f為線圈中激勵電流頻率。所以,當改變該函數中某一個量,而固定其他量時,就可以通過測量等效阻抗Z的變化來確定該參數的變化。在目前的測量電路中,有通過測量ΔL或ΔZ等來測量x ,ρ,μ,f的變化的電路。
3·2電渦流形成的范圍
見資料
四、傳感器的結構形式
電渦流傳感器結構很簡單,主要是由一個固定在框架上的扁平線圈組成。線圈是用多股其保險或銀絲繞制而成,一般放在傳感器的端部,線圈可繞在框架的槽內,也可用粘接劑粘在端部,下圖為CEF1型渦流傳感器。
CEF1型框架用聚四氟乙烯制成,線圈繞在框架的槽內,其性能見下表。表略
根據設計參數要求,CEF1-1000型傳感器。
圖3 渦流傳感器
五、測量電路及分析
5-1測量電路
測量電路的任務就是把位移x的變化變換為電壓或頻率的變化。可以用三種類型的測量電路:電橋電路,諧振電路,正反饋電路。目前所用的諧振電路有三種類型:定頻調幅式、變頻調幅式與調頻式。
本次設計擬采用變頻調幅式(調頻調幅式)測量電路。
變頻調幅式測量電路
該電路的核心是一個電容三點式振蕩器,傳感器線圈是震蕩回路的一個電感元件。這種電路的測量原理是:當無被測導體時,回路諧振于f0,此時Q值最高,所以對應的輸出電壓U0最大。當非軟磁材料制成的被測導體靠近傳感器時,諧振峰右移,諧振頻率增高為f1,諧振曲線由于Q值降低,而顯得“矮胖”。所以這時對應的輸出電壓U1將降低。當被測導體進一步靠近傳感器線圈時,諧振頻率增高為f2,輸出電壓降為U2···。
當被測導體是軟磁材料時,則隨被測導體靠近線圈,諧振頻率降低為f1,f2···,輸出電壓也由U0依次降為U1,U2···。這時得到的一組諧振曲線如圖所示。
5-2電路各單元分解
這個測量電路由三部分組成,即
(1)電容三點式振蕩器(西勒振蕩器)其作用是將位移變化引起的振蕩回路的Q值變化轉化成高頻載波信號的幅值變化。為使電路具有較高的效率而自行起振,電路采用自給偏壓的辦法。適當選擇振蕩管的分壓電阻的比值,可使電路靜態工作點處于甲乙類。
從變頻調幅式測量電路圖可分析出線圈震蕩電流由其中的西勒振蕩電路提供。下圖為西勒振蕩電路。
西勒震蕩電路圖 圖2
西勒振蕩器是一種改進型的電容反饋振蕩器,它是克拉波電路的改進電路。這種電路頻率穩定性高。因為可通過C4改變振蕩頻率,且接入系數不受C4影響,所以在整個波段中振蕩
振幅比較平穩。真兩點使西勒電路的頻率能在比較寬的范圍內調節。西勒振蕩電路的頻率為
f?1/2?LC?。
'C1'C2C3C??''?C4''''C?C?CCCC?CC?CC10;2?C2?Ci 122331式中。其中,1當C3??C1及C3??C2時,振蕩頻率為
f0?12?L(C3?C4),與受輸入輸出電容(包括閑散電容)影響的C1與 C2無關,因此提高了振蕩頻率的穩定性。
西勒振蕩電路的振蕩頻率可以通過改變C4來調整。因覆蓋系數大,易調整,頻率穩定度高,實際應用較多。
C3比克拉波電路取值大!故頻率
西勒振蕩等效電路圖 圖3
上圖為在實際應用中的西勒電路改進型,在實際應用中可用可調電感,而可調電容換成固定電容。在大多數電視機中大多采用西勒振蕩電路。此時的振蕩頻率為
f?1/2?LC?。
(2)檢波器 檢波器由檢波二極管和派形濾波器組成,采用派形濾波器可適應電流變化較大,而又要求波紋很小的情況,可獲得平滑的波形。檢波器的作用是將高頻載波中的測量信息不失真的取出。
LC濾波器在二極管之后如圖所示,LC濾波電路
由于二極管有單向導通性,因此有部分正弦波經由二極管,而形成半波正弦波。在通過下部LC低通濾波器濾去交流分量。從而輸出直流分量
(3)射極跟隨器 由于射隨器具有輸入阻抗高、輸出阻抗低,并有良好的跟隨特性等優點,所以用來作為輸出極以獲得盡可能大的不失真輸出幅度。
六
第五篇:EDA課程設計
考試序號:28
自動打鈴系統設計說明書
學 生 姓 名:周文江
學
號:14112502521
專 業 班 級:1102
報告提交日期:2013.11.26
湖 南 理 工 學 院 物 電 學 院
目錄
一、題目及要求簡介……………3 1.設計題目…………………3 2.總體要求簡介……………3
二、設計方案說明……………3
三、系統采用器件以及模塊說明………3 1.系統框圖…………4 2.選擇的FPGA芯片及配置………4 3.系統端口和模塊說明…………5
四、各部分仿真結果………5
五、調試及總結………6
六、參考文獻……7
七、附錄………7
一、題目及要求簡介
1、設計題目
設計一個多功能自動打鈴系統
2、總體要求簡介
① 基本計時和顯示功能(24小時制顯示),包括:
1.24小時制顯示 2.動態掃描顯示; 3.顯示格式:88-88-88 ② 能設置當前時間(含時、分)③ 能實現基本打鈴功能,規定:
06:00起床鈴,打鈴5s
二、設計方案說明
本次設計主要采用Verilog HDL硬件描述性語言、分模塊法設計的自動打鈴系統。由于這次用的開發板提供的是50M晶振。首先要對時鐘進行分頻,當計時到2FA_F07F時完成1s分頻,通過計時到60s產生分鐘進位信號,再通過60分鐘產生時鐘進位信號。最后通過6個寄存器對時分秒進行鎖存最終輸出到8個數碼管上完成顯示。當顯示時鐘和默認鬧鐘時鐘相等時,驅動打鈴模塊。通過key_mode,key_turn,key_change查看鬧鐘,時鐘顯示,調整時鐘。
三、系統采用器件以及模塊說明
1.系統框圖如下:
:下如圖框統系
2.選擇的FPGA芯片及配置:本次系統設計采用的FPGA芯片是Alter公司生產的Cyclone II EP2C8Q208C8。該芯片是208個管腳,138個IO,并且具有兩個內部PLL,而且內嵌乘法器,8K的邏輯門,資源相當豐富。完成這次自動打鈴系統的設計總共消耗250個LE單元,22個IO口,131個寄存器。經過綜合后,本系統最高能實現145M的運行速度。通過Quartus II 軟件觀察到內部的RTL圖如下
3.系統端口和模塊說明
(1)分頻部分
分頻器的作用是對50Mhz的系統時鐘信號進行分頻,得到頻率為1hz的信號,即為1S的計時信號。
(2)按鍵部分
按鍵key_mode--0為顯示計時,1為鬧鐘顯示,2為調整時間。按鍵key_turn—0為調整小時,1為調整分鐘。按鍵key_change—每按一次加1(3)計時部分
通過sec_L,sec_H,min_L,min_H,hour_L,hour_H 6個寄存器對時分秒進行鎖存然后送入數碼管顯示
(4)鬧鐘模塊
當設定的鬧鐘時間和數碼管上顯示的時間相等時驅動鬧鐘,完成打鈴,持續時間5s。
(5)數碼管顯示模塊
顯示模塊是由8個位選8個段選構成的顯示模塊,利用人眼的余暉效果完成動態掃描,顯示時間。
四、各部分仿真結果
測試文件如下:
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;//復位信號
#30 rst_b = 1'b1;end always #10 sysclk = ~sysclk;//輸入的系統時鐘,20ns的周期 endmodule
五、調試及總結
本次課程設計總共花費了四天左右的時間,設計了自動打鈴系統。通過這次的設計更加熟悉了對EDA技術的了解和認識,在中也發現許多不足的地方。使用了自頂而下的設計方法,使得設計更加的簡單和明了。在調試過程中,有些代碼的設計不規范性,導致時序相當緩慢,甚至編譯綜合都會報錯。在不斷的修改下,發現時序電路和組合邏輯最好分開寫,這樣便于查錯,和修改代碼。畢竟Verilog HDL語言不同于C語言,不能以軟件的思想來設計,而是要利用電路的思想來編程,這樣可以更好的節省資源,使得時序也比較的簡單明了。在以后的學習及程序設計當中,我們一定要倍加小心,在程序出現不正常運行的情況下要耐心調試,盡量做到精益求精。
最后通過這次EDA方面的課程設計,提高了我們對EDA領域及通信電路設計領域的認識,有利于培養我們在通信電路EDA方面的設計能力。有利于鍛煉我們獨立分析問題和解決問題的能力。
六、文獻參考
[1].王金明、左自強 編,《EDA技術與Verilog設計》科學出版社
2008.8 [2].杜慧敏、李宥謀、趙全良 編,《基于Verilog的FPGA設計基礎》 西安電子科技大學出版社 2006.2 [3].韓彬 編,《從零開始走進FPGA世界》杭州無線電愛好者協會出版社 2011.8.20
七、附錄(實物圖及源碼)
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