第一篇:EDA課程設(shè)計 電子琴
簡易電子琴的設(shè)計和實現(xiàn)
----結(jié)題報告
學(xué)號:110342241
姓名:章譯文
一.設(shè)計要求
1.能發(fā)出1234567基本音。
2.能自動播放《偶像萬萬歲》和《梁祝》。3.能在數(shù)碼管上顯示彈奏時的音名。
二.設(shè)計原理分析
1.音階的獲得
系統(tǒng)要求要求用7個按鍵控制發(fā)聲,我們用7個鍵盤來控制產(chǎn)生低音(或中音)段的7個音階頻率。所有的音名頻率都是通過一個基準(zhǔn)頻率經(jīng)過分頻得到的。但部分分頻過大的音頻直接輸出給揚聲器,頻率信號脈沖的占空比會非常窄,不能驅(qū)動揚聲器工作。于是,我們設(shè)計了一個“帶有預(yù)置數(shù)的計數(shù)器”來簡化整個設(shè)計過程。將原頻率分頻成期望值的2倍頻率信號。再通過二分頻,驅(qū)動揚聲器工作。
簡易電子琴控制流程圖
2.MUSICAL_NOTE內(nèi)部電路
MUSICAL_NOTE內(nèi)部電路
使用MUSICAL_NOTE電路,實現(xiàn)初值可變的計數(shù)器,并對音階實現(xiàn)二分頻,使電子琴實現(xiàn)正常發(fā)音。
按鍵播放部分電路
3.自動播放功能的實現(xiàn)
自動播放部分電路
Hebing.mif文件(偶像萬萬歲&梁祝)
歌曲長度為352位,利用三個74261設(shè)計0~352的計數(shù)器,自動尋址,將音頻導(dǎo)入lpm_rom,與MUSICAL_NOTE相互作用,實現(xiàn)自動播放。
按鍵除顫電路原理圖
作為機(jī)械開關(guān)的鍵盤,在按鍵操作時,機(jī)械觸點的彈性及電壓跳動等原因,再觸點閉合或者開啟的瞬間會出現(xiàn)電壓的抖動,如果不進(jìn)行處理就會造成誤操作。按鍵去抖動的關(guān)鍵在于提取穩(wěn)定的低電平狀態(tài),濾去前沿后沿的抖動毛刺。4.在數(shù)碼管上顯示彈奏時的音名
顯示部分電路圖
Display內(nèi)部電路
電路中的74161是16進(jìn)制的計數(shù)器,它的低三位接到3—8譯碼器模塊74138的地址輸入端,這樣就可以實現(xiàn)74138的8個輸出端輪流輸出低電平,恰好用來控制“位碼”DIG7~DIG0。LPM_MUX是QuartusⅡ中的宏模塊,用來實現(xiàn)多位的“多選一”,它的數(shù)據(jù)位數(shù)可以以及數(shù)據(jù)的數(shù)量可以任意設(shè)定。
電路中使用了與非門,實現(xiàn)發(fā)音與現(xiàn)實同時實現(xiàn),在此要注意的是,因為使用了與非門,靜態(tài)字符現(xiàn)實數(shù)碼管管腳的設(shè)定值應(yīng)該與原值相反。
三.設(shè)計原理圖
簡易電子琴原理圖
根據(jù)以上分析,將三個模塊組合,便得到了簡易電子琴的整體設(shè)計。在整體設(shè)計的過程中,要注意三個模塊之間的關(guān)系,使其能夠相互作用,正常發(fā)音和顯示。
四.實驗總結(jié) 在這三天的實驗過程中,通過對于實驗?zāi)康牡姆治觯心繕?biāo)的查找資料,研讀教材,在分清楚模塊的基礎(chǔ)上,寫下了實驗計劃,規(guī)劃好時間,確定每天要做的事。在實驗的第一天,實現(xiàn)了按鍵發(fā)音,同時,也基本弄清楚了自動播放的原理,有了設(shè)計思路,第二天上午,完成了自動循環(huán)播放的功能,下午在同學(xué)的幫助下,確定了數(shù)碼管顯示的基本思路,通過對于以前知識的復(fù)習(xí)和查找,成功實現(xiàn)了數(shù)碼管的顯示功能。
在實驗的過程中,也遇到很多的困難。在自動播放的時候,由于沒有修改hebing.mif的進(jìn)制,音樂總不能正常播放。還有就是在數(shù)碼管顯示的時候,一開始沒有弄清與非門的作用,顯示的數(shù)字總是反著的。后來經(jīng)過冷靜的分析,在老師和同學(xué)的幫助下,成功完成了電子琴的設(shè)計,實現(xiàn)了所有的功能。當(dāng)然,設(shè)計也還有很多可以完善和改進(jìn)的地方,在以后的學(xué)習(xí)過程中,我會更加用心,多做,多思考。
這次課程設(shè)計,我受益匪淺,這種認(rèn)真研讀,查找資料,動手操作的學(xué)習(xí)方式,應(yīng)該貫徹到每一門課程的學(xué)習(xí),也應(yīng)該貫徹到我們的生活中。一直保持這樣的方式,不管做什么事,都會取得很好的結(jié)果。
第二篇:數(shù)字電子EDA課程設(shè)計八音電子琴
燕山大學(xué)EDA課程設(shè)計
實驗報告
院系:信息科學(xué)與工程學(xué)院
姓名:
班級:
學(xué)號:
日期:
[實驗名稱] 八音電子琴
[實驗要求] 1.能發(fā)出1.2.3.4.5.6.7.i八個音
2.用按鍵作為鍵盤
3.C調(diào)至B調(diào)對應(yīng)頻率如下表
音調(diào) 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 [實驗電路設(shè)計] 1.命題分析
根據(jù)命題的要求,要使揚聲器發(fā)音,需要在其輸入信號端連接一個對應(yīng)頻率的方波信號.實驗使用的信號源可以提供從幾Hz到幾兆Hz不等的信號頻率,自然可以想到本實驗命題的關(guān)鍵是一個具有相應(yīng)分頻比的分頻器.考慮到硬件(按鈕)在實際工作過程中會因元件的接觸產(chǎn)生一些不可避免的抖動脈沖電平,會對實驗造成影響,因此需要在按鍵接入線路中安裝防抖動電路.2.設(shè)計過程
1>分頻器
為了取得合適的電路復(fù)雜度和可接受的誤差范圍,分頻器的時鐘信號選取為器件所提供的JPCK—1(3MHz音頻信號).然后通過計算,用時鐘信號頻率除以各發(fā)音頻率,得到的分頻比如下表:
分頻比(16進(jìn)
制)
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 利用四片十六進(jìn)制計數(shù)器74LS161就可以連接成適用的分頻器.分頻器連接完成后會產(chǎn)生一個預(yù)定頻率的周期脈沖.但是實驗要求的方波其占空比應(yīng)該為1:1,因此在輸出脈沖端加裝一個T觸發(fā)器,每次脈沖到達(dá)觸發(fā)器的時候輸出便會跳變電平,這就達(dá)到了驅(qū)動揚聲器的條件.但是在應(yīng)用了T觸發(fā)器后輸出方波的周期比預(yù)定的擴(kuò)大了一倍,也就是說頻率減至原來的二分之一.此時應(yīng)重新選擇時鐘信號,令其為原來2倍即可.根據(jù)實驗指導(dǎo)書,最終確定選擇的時鐘信號為6MHz.2>防抖動電路
利用D觸發(fā)器的電壓跟隨特性可以用一個頻率較低的時鐘信號驅(qū)動,達(dá)到防止按鍵抖動的目的.電路較簡單,見圖3.圖1.時鐘分頻電路(downway)
圖2.CP為375K時上圖的B4輸出波形
由于設(shè)計的原因,本電路只能支持單音節(jié)輸入.當(dāng)同時鍵入兩個以上的音階時,分頻比較小的(比較高的音階)優(yōu)先發(fā)聲.圖3.按鍵輸入防抖動電路
3>電路組合
組合后的電路模塊如圖4.共有11個輸入端和1個輸出端.其中,CP_6M為整個電路的主頻,使用電路板上的6MHz信號輸出端;CP_1US為防抖動電路中觸發(fā)器所使用的時鐘,要求頻率不高,選擇電路板提供的CLK3-3(12Hz);KEYCa-B是電子琴的輸入按鍵接口,依次是從低音到高音.Speaker是電路的輸出端,接入揚聲器,為其產(chǎn)生相應(yīng)音階的頻率.實際電路如圖4.連接完成后,對該電路進(jìn)行仿真測試,如圖5,令其CP_6M為6MHz,CP_1US為一個較低頻率脈沖,設(shè)臵KEYB(音節(jié)B)為有效電平,在speaker上得到的輸出頻率為493,與實際音節(jié)的頻率相同.圖4.八音電子琴
圖5.電子琴完成品的仿真波形
T觸發(fā)器2分頻電路
[硬件測試] [實習(xí)心得] 第一感覺,數(shù)字電子技術(shù)EDA實習(xí)很有意思.我們可以有充分的時間去思考怎么做出一個東西,這個東西的用處也許不大甚至幾乎沒有,但重要的是思考的過程:從它的用途總結(jié)出它的特性,從它的特性構(gòu)思出它的原理,從原理到構(gòu)建模型,再到模型的實現(xiàn),利用已有的知識,可用的元件,最終組合出一個具有高度邏輯性的組合電路,這和我們小時候玩搭積木差不多.把積木一塊塊的搭成一座城堡,中間缺少任何一層甚至任何一塊,城堡都可能會倒塌.同理,在我們構(gòu)建命題所給的元器件時任何一個邏輯錯誤都可能是致命的,導(dǎo)致最后無法出現(xiàn)正確結(jié)果或者干脆不能用.因此,實習(xí),有意思的同時還不能大意.這是一個鍛煉邏輯思維和思維嚴(yán)謹(jǐn)性的極好的機(jī)會,我和我的同學(xué)們在這次工作中受益非淺.大家都積極思思考,查找資料,集思廣益來解決現(xiàn)有的問題。在這個過程中我?guī)椭藙e人也得到了別人的幫助。
我在和別人研究問題的時候發(fā)現(xiàn)在所有題目當(dāng)中,以分頻器為基本的[八音電子琴]算是比較簡單的,我很早就做完了.但是很多人的題目除了分頻以外還要求臵數(shù),可調(diào),顯示輸出,以及產(chǎn)生相對復(fù)雜的多的時序,這讓我覺得我做的快只是運氣好,抽了個好簽而已,同時我也了解到自己的不足之處.仍需努力.最后感謝老師們耐心的講解和提點。
第三篇:EDA課程設(shè)計
考試序號:28
自動打鈴系統(tǒng)設(shè)計說明書
學(xué) 生 姓 名:周文江
學(xué)
號:14112502521
專 業(yè) 班 級:1102
報告提交日期:2013.11.26
湖 南 理 工 學(xué) 院 物 電 學(xué) 院
目錄
一、題目及要求簡介……………3 1.設(shè)計題目…………………3 2.總體要求簡介……………3
二、設(shè)計方案說明……………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è)計題目
設(shè)計一個多功能自動打鈴系統(tǒng)
2、總體要求簡介
① 基本計時和顯示功能(24小時制顯示),包括:
1.24小時制顯示 2.動態(tài)掃描顯示; 3.顯示格式:88-88-88 ② 能設(shè)置當(dāng)前時間(含時、分)③ 能實現(xiàn)基本打鈴功能,規(guī)定:
06:00起床鈴,打鈴5s
二、設(shè)計方案說明
本次設(shè)計主要采用Verilog HDL硬件描述性語言、分模塊法設(shè)計的自動打鈴系統(tǒng)。由于這次用的開發(fā)板提供的是50M晶振。首先要對時鐘進(jìn)行分頻,當(dāng)計時到2FA_F07F時完成1s分頻,通過計時到60s產(chǎn)生分鐘進(jìn)位信號,再通過60分鐘產(chǎn)生時鐘進(jìn)位信號。最后通過6個寄存器對時分秒進(jìn)行鎖存最終輸出到8個數(shù)碼管上完成顯示。當(dāng)顯示時鐘和默認(rèn)鬧鐘時鐘相等時,驅(qū)動打鈴模塊。通過key_mode,key_turn,key_change查看鬧鐘,時鐘顯示,調(diào)整時鐘。
三、系統(tǒng)采用器件以及模塊說明
1.系統(tǒng)框圖如下:
:下如圖框統(tǒng)系
2.選擇的FPGA芯片及配置:本次系統(tǒng)設(shè)計采用的FPGA芯片是Alter公司生產(chǎn)的Cyclone II EP2C8Q208C8。該芯片是208個管腳,138個IO,并且具有兩個內(nèi)部PLL,而且內(nèi)嵌乘法器,8K的邏輯門,資源相當(dāng)豐富。完成這次自動打鈴系統(tǒng)的設(shè)計總共消耗250個LE單元,22個IO口,131個寄存器。經(jīng)過綜合后,本系統(tǒng)最高能實現(xiàn)145M的運行速度。通過Quartus II 軟件觀察到內(nèi)部的RTL圖如下
3.系統(tǒng)端口和模塊說明
(1)分頻部分
分頻器的作用是對50Mhz的系統(tǒng)時鐘信號進(jìn)行分頻,得到頻率為1hz的信號,即為1S的計時信號。
(2)按鍵部分
按鍵key_mode--0為顯示計時,1為鬧鐘顯示,2為調(diào)整時間。按鍵key_turn—0為調(diào)整小時,1為調(diào)整分鐘。按鍵key_change—每按一次加1(3)計時部分
通過sec_L,sec_H,min_L,min_H,hour_L,hour_H 6個寄存器對時分秒進(jìn)行鎖存然后送入數(shù)碼管顯示
(4)鬧鐘模塊
當(dāng)設(shè)定的鬧鐘時間和數(shù)碼管上顯示的時間相等時驅(qū)動鬧鐘,完成打鈴,持續(xù)時間5s。
(5)數(shù)碼管顯示模塊
顯示模塊是由8個位選8個段選構(gòu)成的顯示模塊,利用人眼的余暉效果完成動態(tài)掃描,顯示時間。
四、各部分仿真結(jié)果
測試文件如下:
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ù)位信號
#30 rst_b = 1'b1;end always #10 sysclk = ~sysclk;//輸入的系統(tǒng)時鐘,20ns的周期 endmodule
五、調(diào)試及總結(jié)
本次課程設(shè)計總共花費了四天左右的時間,設(shè)計了自動打鈴系統(tǒng)。通過這次的設(shè)計更加熟悉了對EDA技術(shù)的了解和認(rèn)識,在中也發(fā)現(xiàn)許多不足的地方。使用了自頂而下的設(shè)計方法,使得設(shè)計更加的簡單和明了。在調(diào)試過程中,有些代碼的設(shè)計不規(guī)范性,導(dǎo)致時序相當(dāng)緩慢,甚至編譯綜合都會報錯。在不斷的修改下,發(fā)現(xiàn)時序電路和組合邏輯最好分開寫,這樣便于查錯,和修改代碼。畢竟Verilog HDL語言不同于C語言,不能以軟件的思想來設(shè)計,而是要利用電路的思想來編程,這樣可以更好的節(jié)省資源,使得時序也比較的簡單明了。在以后的學(xué)習(xí)及程序設(shè)計當(dāng)中,我們一定要倍加小心,在程序出現(xiàn)不正常運行的情況下要耐心調(diào)試,盡量做到精益求精。
最后通過這次EDA方面的課程設(shè)計,提高了我們對EDA領(lǐng)域及通信電路設(shè)計領(lǐng)域的認(rèn)識,有利于培養(yǎng)我們在通信電路EDA方面的設(shè)計能力。有利于鍛煉我們獨立分析問題和解決問題的能力。
六、文獻(xiàn)參考
[1].王金明、左自強(qiáng) 編,《EDA技術(shù)與Verilog設(shè)計》科學(xué)出版社
2008.8 [2].杜慧敏、李宥謀、趙全良 編,《基于Verilog的FPGA設(shè)計基礎(chǔ)》 西安電子科技大學(xué)出版社 2006.2 [3].韓彬 編,《從零開始走進(jìn)FPGA世界》杭州無線電愛好者協(xié)會出版社 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
第四篇:EDA 課程設(shè)計
《電子系統(tǒng)設(shè)計自動化》課程設(shè)計報告
學(xué) 院: 機(jī)電工程學(xué)院
題 目: 數(shù)字時鐘電路設(shè)計 課 程: 《電子系統(tǒng)設(shè)計自動化》課程設(shè)計 專業(yè)班級: 電信10級2 班 學(xué)生姓名: 劉星 秦玉杰 王艷艷 學(xué) 號: 1004101035 1004101036 1004101038
完成日期:2013年 12 月 27 日
摘要:
EDA(Electronic Design Automation)電子設(shè)計自動化,就是以大規(guī)??删幊唐骷樵O(shè)計載體,以硬件描述語言為系統(tǒng)邏輯描述的主要表達(dá)方式,通過相關(guān)的軟件,自動完成用軟件方式設(shè)計的電子系統(tǒng)到硬件系統(tǒng),最終形成集成電子系統(tǒng)或?qū)S眉尚酒?。本次實?xí)利用QuartusII為設(shè)計軟件、VHDL為硬件描述語言,結(jié)合所學(xué)的數(shù)字電路的知識設(shè)計一個24時多功能數(shù)字鐘,具有正常時、分、秒計時,動態(tài)顯示,清零、快速校時校分、整點報時、花樣顯示等功能。利用硬件描述語言VHDL對設(shè)計系統(tǒng)的各個子模塊進(jìn)行邏輯描述,采用模塊化的設(shè)計思想完成頂層模塊的設(shè)計,通過軟件編譯、邏輯化簡、邏輯分割、邏輯綜合優(yōu)化、邏輯布線、邏輯仿真,最終將設(shè)計的軟件系統(tǒng)下載設(shè)計實驗系統(tǒng),對設(shè)計的系統(tǒng)進(jìn)行硬件測試。
一、課程設(shè)計基本要求和任務(wù)
《EDA課程設(shè)計》是繼《模擬電子技術(shù)基礎(chǔ)》、《數(shù)字電子技術(shù)基礎(chǔ)》課程后,電信專業(yè)學(xué)生在電子技術(shù)實驗技能方面綜合性質(zhì)的實驗訓(xùn)練課程,是電子技術(shù)基礎(chǔ)的一個部分。1.1 目的和任務(wù)
(1)通過課程設(shè)計使學(xué)生能熟練掌握一種EDA軟件(QUARTUSII)的使用方法,能熟練進(jìn)行設(shè)計輸入、編譯、管腳分配、下載等過程,為以后進(jìn)行工程實際問題的研究打下設(shè)計基礎(chǔ)。
(2)通過課程設(shè)計使學(xué)生能利用EDA軟件(QUARTUSII)進(jìn)行至少一 個電子技術(shù)綜合問題的設(shè)計,設(shè)計輸入可采用圖形輸入法或VHDL硬件描述語言輸入法。(3)通過課程設(shè)計使學(xué)生初步具有分析、尋找和排除電子電路中常見 故障的能力。
(4)通過課程設(shè)計使學(xué)生能獨立寫出嚴(yán)謹(jǐn)?shù)?、有理論根?jù)的、實事求是的、文理通順的字跡端正的課程設(shè)計報告。1.2 功能要求:
(1)具有時、分、秒計數(shù)顯示功能,以24小時循環(huán)計時。(2)時鐘計數(shù)顯示時有LED燈的花樣顯示。(3)具有調(diào)節(jié)小時、分鐘、秒及清零的功能。(4)具有整點報時功能。
1.3 總體方框圖:
本系統(tǒng)可以由秒計數(shù)器、分鐘計數(shù)器、小時計數(shù)器、整點報時、分的調(diào)整以及小時的調(diào)整和一個頂層文件構(gòu)成。采用自頂向下的設(shè)計方法,子模塊利用VHDL語言設(shè)計,頂層文件用原理圖的設(shè)計方法。顯示:小時采用24進(jìn)制,而分鐘均是采用6進(jìn)制和10進(jìn)制的組合。1.4 設(shè)計原理:
數(shù)字鐘電路設(shè)計要求所設(shè)計電路就有以下功能:時、分、秒計時顯示,清零,時、分調(diào)節(jié),整點報時及花樣顯示。分、秒計時原理相似,可以采用60進(jìn)制BCD碼計數(shù)器進(jìn)計時;小時采用24進(jìn)制BCD碼進(jìn)行計時;在設(shè)計時采用試驗電路箱上的模式7電路,不需要進(jìn)行譯碼電路的設(shè)計;所設(shè)計電路具有驅(qū)動揚聲器和花樣顯示的LED燈信號產(chǎn)生。試驗箱模式7的電路如圖一所示:圖一模式七實驗電路圖
1.5 性能指標(biāo)及功能設(shè)計:
(1)時鐘計數(shù):完成時、分、秒的正確計時并且顯示所計的數(shù)字;對秒、分——60進(jìn)制計數(shù),即從0到59循環(huán)計數(shù),時鐘——24進(jìn)制計數(shù),即從0到23循環(huán)計數(shù),并且在數(shù)碼管上顯示數(shù)值。
2.2 模塊劃分自頂向下分解
2.3 模塊描述
時鐘計時模塊完成時、分、秒計數(shù),及清零、調(diào)節(jié)時和分鐘的功能。時、分、秒計數(shù)的原理相同,均為BCD碼輸出的計數(shù)器,其中分和秒均為六十進(jìn)制BCD碼計數(shù)器,小時為二十四進(jìn)制BCD碼計數(shù)器。設(shè)計一個具有異步清零和設(shè)置輸出功能的六十進(jìn)制BCD碼計數(shù)器,再設(shè)計一個具有異步清零和設(shè)置輸出功能的二十四進(jìn)制計數(shù)器,然后將它們通過一定的組合構(gòu)成時鐘計時模塊。各個輸入/輸出端口的作用為:
(1)clk為計時時鐘信號,reset為異步清零信號;
(2)sethour為小時設(shè)置信號,setmin為分鐘設(shè)置信號;(3)daout[5?0]為小時的BCD碼輸出, daout[6...0]為秒和分鐘的BCD碼輸出,enmin和enhour為使能輸出信號。
(4)在時鐘整點的時候產(chǎn)生揚聲器驅(qū)動信號和花樣顯示信號。由時鐘計時模塊中分鐘的進(jìn)行信號進(jìn)行控制。當(dāng)contr_en為高電平時,將輸入信號clk送到輸出端speak用于驅(qū)動揚聲器,同時在clk的控制下,輸出端lamp[2..0]進(jìn)行循環(huán)移位,從而控制LED燈進(jìn)行花樣顯示。輸出控制模塊有揚聲器控制器和花樣顯示控制器兩個子模塊組成 2.4 頂層電路圖
頂層文件是由四個模塊組成,分別是時、分、秒計數(shù)器和報警的VHDL語言封裝而成。經(jīng)過鎖定引腳再重新編譯獲得如下頂層原理電路圖:
三、方案實現(xiàn)
3.1 各模塊仿真及描述
(1)秒計數(shù)器模塊仿真圖:將標(biāo)準(zhǔn)秒信號送入”秒計數(shù)器”,秒計數(shù)器采用60進(jìn)制計數(shù)器,每累計60秒發(fā)出一個分脈沖信號,該信號將作為分計數(shù)器的時鐘脈沖,daout代表秒輸出。
(2)分計數(shù)器電路仿真圖:也采用60進(jìn)制計數(shù)器,每累計60分鐘,發(fā)出一個時脈沖信號,該信號將被送到時計數(shù)器,daout端口代表分鐘輸出
(3)小時計數(shù)器電路仿真圖:時計數(shù)器采用12進(jìn)制計時器,可實現(xiàn)對24小時累 計。每累計12小時,發(fā)出一個脈沖信號。
引腳配置完成后再進(jìn)行一次全程編譯,無誤則可以下載到試驗箱上進(jìn)行硬件測試。硬件驗證的方法如下:選擇實驗?zāi)J?;時鐘脈沖clk與clock0(1024Hz)信號相連;鍵8和鍵5均為低電平,時鐘正常計時,數(shù)碼管1和2顯示秒,數(shù)碼管4和5顯示分鐘,數(shù)碼管7和8顯示小時;鍵8為高電平時,時鐘清零;鍵5為高電平時,按下鍵7和鍵4進(jìn)行調(diào)時調(diào)分操作;當(dāng)時鐘為整點的時候,三個發(fā)光二極管進(jìn)行循環(huán)移位操作,同時揚聲器發(fā)聲。
五、心得體會
經(jīng)過源程序的編輯、邏輯綜合、邏輯適配、編程下載成功后,在EDA實驗開發(fā)系統(tǒng)進(jìn)行硬件驗證時卻發(fā)現(xiàn)實驗結(jié)果不正確,揚聲器無法發(fā)聲。經(jīng)檢查,自己設(shè)計的管腳文件有錯。將管腳鎖定文件修改后,重新進(jìn)行邏輯適配、編程下載成功后,實驗結(jié)果仍然不正確,百思不得其解。無奈之下,決定重頭開始排查每一步的細(xì)節(jié),確定各個模塊的功能完全實現(xiàn)并且頂層模塊功能正確。修改之后,重新進(jìn)行邏輯適配、編程下載驗證,實驗結(jié)果完全正確。
這次EDA課程設(shè)計歷時兩個星期,在整整兩個星期的日子里,不僅鞏固了以前所學(xué)過的知識,而且學(xué)到了很多書本上學(xué)不到的知識,同時鍛煉了自己的能力,使自己對以后的路有了更加清楚的認(rèn)識,對未來有了更多的信心。這次課程設(shè)計,進(jìn)一步加深了我對EDA的了解,使我對QuartusII的基本操作有所了解,使我對應(yīng)用軟件的方法設(shè)計硬件系統(tǒng)有了更加濃厚的興趣。通過這次課程設(shè)計,我懂得了理論與實際相結(jié)合的重要性,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實踐相結(jié)合,從實踐中得出結(jié)論,才能真正提高自己的實際動手能力和獨立思考的能力。在設(shè)計的過程中,我遇到許多問題,畢竟是第一次應(yīng)用VHDL進(jìn)行硬件電路系統(tǒng)的設(shè)計,許多EDA的知識還沒有充分的掌握,遇到困難也是在所難免的,同時發(fā)現(xiàn)了自己的不足之處:學(xué)習(xí)知識表面化,沒有深入了解它們的原理??偟膩碚f,這次設(shè)計的數(shù)字時鐘電路還是比較成功的,盡管在設(shè)計中遇到了很多問題,最后在老師的辛勤指導(dǎo)、同學(xué)的幫助和自己不斷思考下,終于迎刃而解,有點小小的成就感,覺得平時所學(xué)的知識有了實用的價值,達(dá)到了理論與實際相結(jié)合的目的。最后,對給過我?guī)椭乃型瑢W(xué)和指導(dǎo)老師再次表示忠心的感謝!
參考文獻(xiàn)
[1] 崔健明.《電子電工EDA仿真技術(shù)》 高等教育出版社 2000年 [2] 盧杰,賴毅.《VHDL與數(shù)字電路設(shè)計》 科學(xué)出版社 2001年 [3] 潘松,黃繼業(yè).《EDA技術(shù)實用教程》 科學(xué)出版社 2002年 [4] 朱運利.《EDA技術(shù)應(yīng)用》 電子工業(yè)出版社 2004年 [5] 張明.《VHDL實用教程》 電子科技大學(xué)出版社 1999年
[6] 彭介華.《電子技術(shù)課程設(shè)計與指導(dǎo)》 高等教育出版 1997年
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;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分時的進(jìn)位信號 BEGIN--enmin_2由clk調(diào)制后的手動調(diào)時脈沖信號串 daout<=count;enhour_2<=(sethour and clk1);--sethour為手動調(dià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--若個位計時恰好到“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#的個位轉(zhuǎn)變?yōu)?421BCD的容量 ELSE count<=“0000000”;--count復(fù)0(有此句,則對無效狀態(tài)電路可自啟動)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ù)器模塊的VHDL語言:
LIBRARY IEEE;use IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;
IF(clk'event and clk='1')THEN IF(dain=“0000000”)THEN speak<=count1(1);IF(count1>=“10”)THEN count1<=“00”;--count1為三進(jìn)制加法計數(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)點亮三只燈
第五篇:《EDA課程設(shè)計》
《EDA課程設(shè)計》
課程設(shè)計題目:
基于單片機(jī)的溫濕度采集系統(tǒng)
姓
名:
xxx
學(xué)
班
時
地
號:
xxxx
級:
xxxx
間:
2014.4.21~ 2013.5.5
點:
xxxxx
指 導(dǎo)
老
師:
xxxxx
目錄
一、電路原理圖..................................................................................2
二、電路PCB圖(或?qū)嵨飯D).........................................................2
三、電路效果圖..................................................................................3
四、設(shè)計總結(jié)......................................................................................3 附錄(單片機(jī)源代碼)......................................................................4
一、電路原理圖
二、電路PCB圖(或?qū)嵨飯D)
三、電路效果圖
四、設(shè)計總結(jié)
EDA的實驗還是挺有趣的,比較講究動手能力,當(dāng)然也不能忽略團(tuán)體合作??偟膩碚f本次實驗還是成功了,雖然每個環(huán)節(jié)都遇到了困難。在生成原理圖的過程中,就曾把導(dǎo)線畫成了Placeline而不是Placewire,還有芯片的引腳應(yīng)該用NET符號而不是用文本符號,所以這些錯誤都導(dǎo)致我花在原理圖上的時間多了點。而在生成PCB電路圖的過程中遇到的困難則是自動布線之后,還有電源的幾個腳需要手動布線,所以各個元件之間的位置要布置好,以免發(fā)生短路。腐蝕的時候,由于腐蝕的時間太長了,有些碳都化開了,導(dǎo)致里面的銅被腐蝕掉了,所以又為我的工作增加了困難。在焊接的時候,要注意元件的正負(fù)極,還要檢測錫是否都與那些銅連接上了。最終把LED和 DHT11的程序燒進(jìn)去就行了。
本次實驗我還是能多多少少學(xué)到點什么的,總的來說還是希望能有多一點這樣的實習(xí)。
附錄(單片機(jī)源代碼)
//51單片機(jī)控制溫濕度傳感器DHT11
LCD1602上顯示當(dāng)前機(jī)最小系統(tǒng)。//LCD 讀進(jìn)去 寫出來 #include
//定義無符號整型 #define uchar unsigned char typedef bit BOOL;
//此聲明一個布爾型變量即真或假// 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ù)************************************* void delay(uchar ms)//延時模塊//延時1毫秒
{
}
void delay1()
//一個for循環(huán)大概需要8個多機(jī)器周期
//一個機(jī)器周期為1us晶振為12MHz也就是說本函數(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
測
試
某
塊*************************************// void start()//開始信號
{
dht=1;
delay1();
//主機(jī)發(fā)出8us高電平,開始信號開始發(fā)出 dht=0;
delay(25);
// 主機(jī)把總線拉低必須大于18ms
DHT11能檢測到起始信號
dht=1;
//delay1();
//以下三個延時函數(shù)差不多為24usdelay1();delay1();
20-40us
}
uchar receive_byte()
//接收一個字節(jié) 8位// {
uchar i,temp;
for(i=0;i<8;i++)//接收8bit的數(shù)據(jù)
{
while(!dht);
//等待40-50us的低電平開始信號結(jié)束
delay1();
//開始信號結(jié)束之后延時26us-28us
delay1();delay1();
temp=0;
//時間為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();
//開始信號//調(diào)用開始信號子函數(shù)
dht=1;
//主機(jī)設(shè)為輸入判斷從機(jī)DHT11響應(yīng)信號
if(!dht)
//判斷從機(jī)是否有低電平響應(yīng)信號// {
while(!dht);//判斷從機(jī)發(fā)出 40us 的低電平響應(yīng)信號是否結(jié)束//
while(dht);
//判斷從機(jī)發(fā)出 40us 的高電平是否結(jié)束 如結(jié)束則從機(jī)進(jìn)入發(fā)送數(shù)據(jù)狀態(tài),主機(jī)進(jìn)入數(shù)據(jù)接收狀態(tài)
數(shù)
//兩個while語句加起來就是DHT11的響應(yīng)信號
R_H=receive_byte();//濕度高位
調(diào)用接受一個字節(jié)的子函
R_L=receive_byte();//濕度低位
T_H=receive_byte();//溫度高位
T_L=receive_byte();//溫度低位
check=receive_byte();//校驗位
//結(jié)束信號
dht=0;
//當(dāng)最后一bit數(shù)據(jù)接完畢后主機(jī)拉低電平50us// for(i=0;i<7;i++)//差不多8us的延時
delay1();
dht=1;
//總線由上拉電阻拉高進(jìn)入空閑狀態(tài)
num_check=R_H+R_L+T_H+T_L;
if(num_check==check)//判斷讀到的四個數(shù)據(jù)之和是否與校驗位相同
{
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();
} }