找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4259|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

基于VHDL的具有自動(dòng)樂曲演奏功能的電子琴設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:467138 發(fā)表于 2019-1-12 20:44 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
第一章  緒論
1.1 EDA簡(jiǎn)介            
EDA 技術(shù)就是依賴功能強(qiáng)大的計(jì)算機(jī),在EDA工具軟件平臺(tái)上,對(duì)以硬件描述語言HDL為系統(tǒng)邏輯描述手段完成的設(shè)計(jì)文件,自動(dòng)地完成邏輯編譯、化簡(jiǎn)、分割、綜合、布局布線以及邏輯優(yōu)化和仿真測(cè)試,直至實(shí)現(xiàn)既定的電子線路系統(tǒng)功能。EDA技術(shù)使得設(shè)計(jì)者的工作僅限于利用軟件的方式,即利用硬件描述語言和EDA軟件來完成對(duì)系統(tǒng)硬件功能的實(shí)現(xiàn),這是電子設(shè)計(jì)技術(shù)的一個(gè)巨大進(jìn)步。EDA技術(shù)在進(jìn)入21世紀(jì)后,得到了更大的發(fā)展。嵌入式處理器軟核的成熟,使得SOPC步入大規(guī)模應(yīng)用階段。電子技術(shù)領(lǐng)域全方位融入EDA技術(shù),除了日益成熟的數(shù)字技術(shù)外,傳統(tǒng)的電路系統(tǒng)設(shè)計(jì)建模理念發(fā)生了重大的變化。同時(shí),EDA使得電子領(lǐng)域各學(xué)科的界限更加模糊,更加互為包容。這些都利于設(shè)計(jì)人員利用EDA技術(shù)進(jìn)行電子系統(tǒng)設(shè)計(jì),如全定制或半定制ASIC設(shè)計(jì),FPGA/CPLD開發(fā)應(yīng)用和印制電路板。從EDA技術(shù)的特點(diǎn)不難看出,相比于傳統(tǒng)的數(shù)字電子系統(tǒng)或IC設(shè)計(jì),EDA技術(shù)擁有獨(dú)特的優(yōu)勢(shì)。在傳統(tǒng)的數(shù)字電子系統(tǒng)或IC設(shè)計(jì)中,手工設(shè)計(jì)占了較大的比例。因此,也存在很多缺點(diǎn)。例如:復(fù)雜電路的設(shè)計(jì)、調(diào)試十分困難;由于無法進(jìn)行硬件系統(tǒng)仿真,如果某一過程存在錯(cuò)誤,查找和修改十分不便;設(shè)計(jì)過程中產(chǎn)生大量文檔,不易管理;可移植性差等。相比之下,EDA技術(shù)有很大不同。它運(yùn)用HDL對(duì)數(shù)字系統(tǒng)進(jìn)行抽象的行為與功能描述到具體的內(nèi)部線路結(jié)構(gòu)描述,從而可以在電子設(shè)計(jì)的各個(gè)階段、各個(gè)層次進(jìn)行計(jì)算機(jī)模擬驗(yàn)證,保證設(shè)計(jì)過程的正確性,可以大大降低設(shè)計(jì)成本,縮短設(shè)計(jì)周期。由于有各類庫(kù)的支持,能夠完成各種自動(dòng)設(shè)計(jì)過程。它極大地簡(jiǎn)化了設(shè)計(jì)文檔的管理,邏輯設(shè)計(jì)仿真測(cè)試技術(shù)也日益強(qiáng)大。VHDL在現(xiàn)在的EDA設(shè)計(jì)中使用最多,也擁有幾乎所有主流EDA工具的支持。
EDA技術(shù)在硬件實(shí)現(xiàn)方面融合了大規(guī)模集成電路制造技術(shù),IC版圖設(shè)計(jì),ASIC測(cè)試和封裝以及FPGA/CPLD編程下載和自動(dòng)測(cè)試等技術(shù);在計(jì)算機(jī)輔助工程方面融合了計(jì)算機(jī)輔助設(shè)計(jì)(CAD),計(jì)算機(jī)輔助制造(CAM),計(jì)算機(jī)輔助測(cè)試(CAT),計(jì)算機(jī)輔助工程(CAE)技術(shù)以及多種計(jì)算機(jī)語言的設(shè)計(jì)概念;
1.2芯片介紹
主流產(chǎn)品:ALTERA公司 、FLEX公司
產(chǎn)品類型:CPLD:EPROM類型,掉電后程序不丟失。
                                          FPGA:SRAM類型,掉電后程序丟失,必須重新編程。
工作電壓:5V/3.3V/2.5V/1.8V/1.5V
目前主要產(chǎn)品
MAX7000S/AE,MAX3000A系列、FLEX10KE/ACEX1K系列
APEX20K/20KE系列、APEXII系列、Stratix系列
Cyclone(颶風(fēng)) 系列、Excalibur系列
1.3 Cyclone(颶風(fēng))系列介紹
Altera最新一代SRAM工藝中等規(guī)模FPGA:
與Stratix結(jié)構(gòu)類似,是一種低成本FPGA系列:
是目前主流產(chǎn)品,其配置芯片業(yè)改用新的產(chǎn)品
可支持多種擴(kuò)展模塊
攝像頭模塊
VGA模塊
2.4寸彩屏
3.2寸彩屏
7寸高清大屏
以太網(wǎng)模塊
網(wǎng)口模塊
USB模塊
高速AD DA


第二章  模塊介紹
2.1設(shè)計(jì)分析
根據(jù)設(shè)計(jì)要求,由于樂曲自動(dòng)演奏機(jī)和硬件電子琴的設(shè)計(jì)已經(jīng)存在,我們對(duì)已有的設(shè)計(jì)進(jìn)行修改,形成兩個(gè)不同功能的模塊,然后采用元件例化,拼接兩個(gè)模塊,同時(shí)附加一個(gè)選擇功能模塊,以實(shí)現(xiàn)樂曲自動(dòng)演機(jī)和硬件電子琴兩個(gè)功能。
2.2硬件電子琴分析
對(duì)于硬件電子琴,參考了實(shí)驗(yàn)時(shí)使用的程序,已經(jīng)達(dá)到的要求有:
(1)按下key1~key7 分別表示中音的DO、 RE 、 ME、 FA、 SOL、 LA、 S;
(2)按下相應(yīng)的鍵有對(duì)應(yīng)LED燈指示。
2.3 樂曲自動(dòng)演奏機(jī)分析
對(duì)于樂曲自動(dòng)演奏機(jī),參考了實(shí)驗(yàn)時(shí)使用的程序,已經(jīng)達(dá)到的要求有:
(1)可以在電路上能自動(dòng)演奏樂曲,在這里我們采用的是貝多芬的《歡樂頌》
(2)有相應(yīng)的LED燈指示高低音。
而對(duì)于其他要求:
(1)晶振為12 MHz.
(2)采用CPLD 器件為ALTERA 的EPM7064SL-44。
我們?cè)趯?shí)驗(yàn)箱驗(yàn)證時(shí),先按照實(shí)驗(yàn)箱芯片和晶振進(jìn)行就修改,在實(shí)驗(yàn)箱上確認(rèn)實(shí)驗(yàn)相應(yīng)功能之后,我們?cè)趯?duì)應(yīng)模塊的頻率數(shù)值進(jìn)行修改,并在對(duì)管腳重新鎖定即可
2.4整體設(shè)計(jì)分析
整體設(shè)計(jì)要求:用key8實(shí)現(xiàn)兩個(gè)功能切換。添加一個(gè)選擇器,以實(shí)現(xiàn)兩個(gè)功能切換。當(dāng)key8鍵沒有按下時(shí),電路實(shí)現(xiàn)硬件電子琴功能,當(dāng)key8鍵按下之后,電路實(shí)現(xiàn)樂曲自動(dòng)演奏機(jī)。由于不存在現(xiàn)成可以借鑒的,于是,課程設(shè)計(jì)任務(wù)重心就放在了選擇器模塊的編寫以及整體電路的合成上。
頂層模塊輸入輸出:
圖2-1  頂層文件圖形
管腳說明:輸入:時(shí)鐘信號(hào)——clk ,按鍵——[6:0]key ,功能切換鍵——key7
輸出:LED燈——[6:0]led ,蜂鳴器——beep;
Key0: DO  key1: RE   key2: ME  key3:FA   key4: SOL
key5: LA  key6: SI   key7:功能切換鍵
2.5 設(shè)計(jì)流程


第三章  功能分與模塊3.1自動(dòng)演奏模塊
自動(dòng)演奏模塊功能:在按下key7鍵后,實(shí)現(xiàn)可以自動(dòng)播放樂曲的功能。
3.2 自動(dòng)演奏設(shè)計(jì)方案
(1)根據(jù)樂曲自動(dòng)演奏的基本原理設(shè)計(jì)出適合EDA多功能試驗(yàn)箱的源程序,通過分頻模塊得到12MHZ的晶振;源程序編寫完成,編譯調(diào)試后,在實(shí)驗(yàn)箱上驗(yàn)證其功能;
(2)驗(yàn)證模塊是否能完成實(shí)踐要求的所有功能;然后去掉分頻模塊,將功能模塊做適當(dāng)?shù)男薷,編譯調(diào)試成功后,將其下載到CPLD實(shí)驗(yàn)板上。
方案設(shè)計(jì)步驟:
(1)在Quartus Ⅱ中建立一個(gè)工程項(xiàng)目文件song.qpf,并在該項(xiàng)目下新建Verilog HDL源程序文件song.v輸入程序代碼并保存。完整的Verilog HDL程序參考程序清單。
(2)然后在該工程選擇目標(biāo)器件并對(duì)相應(yīng)的引腳進(jìn)行鎖定,在這里所選擇器件為Alter公司的EPM7064SL-44芯片。
(3)對(duì)該工程文件進(jìn)行全程編譯處理,若在編譯中發(fā)現(xiàn)錯(cuò)誤,則找出錯(cuò)誤并更正,直到編譯成功。
(4)最后拿出下載電纜,將此電纜的兩端分別接到PC機(jī)的打印機(jī)并口和核心板上的JTAG 接口上,打開電源執(zhí)行下載命令,把程序下載到CPLD器件中。此時(shí)可以得到《歡樂頌》樂曲的演奏以及LED燈的明滅指示其高低音。
3.3硬件電子琴模塊
硬件電子琴模塊功能:在按下功能切換鍵key7后,可以實(shí)現(xiàn)電子琴功能,即按下key1 到key7的過程中發(fā)出相應(yīng)的高低音。
3.3.1硬件電子琴設(shè)計(jì)方案
(1)根據(jù)硬件電子琴演奏的基本原理設(shè)計(jì)出適合EDA多功能試驗(yàn)箱的源程序,通過分頻模塊得到12MHZ的晶振;源程序編寫完成,編譯調(diào)試后,在實(shí)驗(yàn)箱上驗(yàn)證其功能;
(2)驗(yàn)證模塊是否能完成實(shí)踐要求的所有功能;然后去掉分頻模塊,將功能模塊做適當(dāng)?shù)男薷暮,編譯調(diào)試成功后,將其下載到CPLD實(shí)驗(yàn)板上。
3.3.2設(shè)計(jì)步驟
(1)在Quarters II中建立一個(gè)工程項(xiàng)目文件beep1.qpf。并在該項(xiàng)目下新建Verilog HDL源程序文件beep1.v,輸入程序代碼并保存,進(jìn)行綜合編譯,若在編譯中發(fā)現(xiàn)錯(cuò)誤,則找出并更正錯(cuò)誤,直至編譯成功為止。
(2)選擇目標(biāo)器件并進(jìn)行引腳鎖定。將未使用的管腳設(shè)置為三態(tài)輸入。
(3)對(duì)該工程文件進(jìn)行全程編譯處理。若在編譯過程中發(fā)現(xiàn)錯(cuò)誤,則找出并更正錯(cuò)誤,直到編譯成功為止。
(4)將產(chǎn)生的beep1.sof輸出對(duì)FPGA進(jìn)行配置。按下按鍵KEY1~KEY8就可以開始使用電子琴來演奏音樂了。

第四章  課程設(shè)計(jì)原理4.1硬件電子琴設(shè)計(jì)原理
樂曲演奏的原理是:由于組成樂曲的每個(gè)音符的頻率值(音調(diào))及其持續(xù)時(shí)間(音長(zhǎng))是樂曲演奏的2個(gè)基本數(shù)據(jù),因此需要控制輸出到揚(yáng)聲器的激勵(lì)信號(hào)的頻率高低和該頻率信號(hào)持續(xù)的時(shí)間。頻率的高低決定了音調(diào)的高低,而樂曲的簡(jiǎn)譜與各音名的頻率對(duì)應(yīng)關(guān)系在后面將給出。所有不同頻率的信號(hào)都是從一基準(zhǔn)頻率分頻而得來的,由于音階頻率多為非整數(shù),而分頻系數(shù)有不能為小數(shù),故必須將計(jì)算得到的分頻數(shù)進(jìn)行向下取整,基準(zhǔn)頻率和分頻系數(shù)應(yīng)綜合考慮加以選擇,從而保證音樂不會(huì)走調(diào)。如在48MHz 時(shí)鐘下,中音1(對(duì)應(yīng)的頻率值是523.3Hz)的分頻系數(shù)應(yīng)該為:48000000/(2*523.3)=45863,這樣只需對(duì)系統(tǒng)時(shí)鐘進(jìn)行45863次分頻即可得到所要的中音M1(分頻系數(shù)計(jì)算公式為D=F/2K,由于F/2K之后,會(huì)使分頻系數(shù)D變小,所以功能模塊中語句:beep_r<=!beep_r,使得輸出取反,K=F/2count_end,消除了前面除以2K的影響) 。
4.2樂曲自動(dòng)演奏設(shè)計(jì)原理
硬件電路和自動(dòng)演奏的原理同硬件電子琴實(shí)驗(yàn)原理類似。至于其他音符,同樣可由一式求出對(duì)應(yīng)的分頻系數(shù)。在程序中設(shè)置一個(gè)狀態(tài)機(jī),每250ms改變一個(gè)狀態(tài)(即一個(gè)節(jié)拍),組成樂曲的每個(gè)音符的頻率值(音調(diào))相對(duì)應(yīng)于狀態(tài)機(jī)的每一個(gè)狀態(tài)。只要讓狀態(tài)機(jī)的狀態(tài)按順序轉(zhuǎn)換,就可以自動(dòng)演奏播放音樂了。
《歡樂頌》樂曲的簡(jiǎn)譜如圖所示:
圖4-1《歡樂頌》簡(jiǎn)譜圖
4.3模塊的實(shí)現(xiàn)方法4.3.1選擇器模塊實(shí)現(xiàn)方法
我們可以對(duì)輸出進(jìn)行控制。即讓兩個(gè)模塊都工作,但是輸出的部分添加選擇器,有選擇輸出信號(hào)。當(dāng)KEY8沒有按下時(shí),硬件電子琴的模塊輸出接到蜂鳴器和LED燈;當(dāng)KEY8按下時(shí),樂曲自動(dòng)演奏模塊輸出接到蜂鳴器和LED燈。從輸出進(jìn)行控制,通過將蜂鳴和LED燈的輸入和兩個(gè)模塊的輸出有選擇的匹配進(jìn)行切換。通過編譯下載到實(shí)驗(yàn)箱驗(yàn)證可以實(shí)現(xiàn)功能,而且在兩種狀態(tài)的切換時(shí),不會(huì)出現(xiàn)無法控制的狀況。
4.3.2自動(dòng)演奏模塊實(shí)現(xiàn)方法
通過參照實(shí)驗(yàn)課本,我們根據(jù)相關(guān)實(shí)驗(yàn)對(duì)試驗(yàn)程序進(jìn)行了簡(jiǎn)單修改,得到了本次自動(dòng)演奏模塊的歌曲《歡樂頌》,實(shí)現(xiàn)其自動(dòng)演奏功能。
對(duì)于自動(dòng)演奏模塊而言,要實(shí)現(xiàn)其功能,只需要在頂層模塊中添加觸發(fā)自動(dòng)演奏模塊的觸發(fā)點(diǎn),在本程序中,即按下key8按鍵,屏蔽掉硬件電子琴的時(shí)鐘信號(hào),而使自動(dòng)演奏模塊的電子時(shí)鐘信號(hào)作為使能信號(hào)。
在自動(dòng)演奏模塊中,首先計(jì)算出各個(gè)音符所對(duì)應(yīng)的參數(shù),對(duì)參數(shù)進(jìn)行定義和設(shè)計(jì)。通過對(duì)晶振的控制實(shí)現(xiàn)每個(gè)音響應(yīng)時(shí)間的長(zhǎng)短并且可以修改相關(guān)參數(shù)實(shí)現(xiàn)音長(zhǎng)的改變。演奏過程中,設(shè)置循環(huán)體,即每次演奏結(jié)束,可以再?gòu)念^開始演奏,從而實(shí)現(xiàn)自動(dòng)演奏的自動(dòng)功能。程序中可以設(shè)置每次循環(huán)時(shí)間,也可以設(shè)置循環(huán)中斷。每個(gè)音符都需要驅(qū)動(dòng)蜂鳴器實(shí)現(xiàn)其功能。
最后,自動(dòng)演奏模塊中,需要有LED燈的指示,對(duì)于這樣的要求,我們?cè)诔绦蜃詈筇砑恿薬ssign賦值語句。實(shí)現(xiàn)了每個(gè)音符響時(shí)對(duì)應(yīng)的LED燈點(diǎn)亮。對(duì)于在實(shí)驗(yàn)中沒有出現(xiàn)的音符所對(duì)應(yīng)的LED燈則設(shè)置為高阻態(tài),從而屏蔽LED燈點(diǎn)亮。
在程序中,通過控制TIME從而得到每個(gè)音階所響應(yīng)的時(shí)間,不同晶振所對(duì)應(yīng)的的時(shí)間為1s,對(duì)應(yīng)的時(shí)間可以控制振蕩次數(shù)實(shí)現(xiàn)控制時(shí)間的長(zhǎng)短。
if(state == 8'd125) state = 8'd0;語句實(shí)現(xiàn)的是自動(dòng)演奏循環(huán)和實(shí)現(xiàn)歌曲演奏長(zhǎng)短。通過系應(yīng)該參數(shù)從而使歌曲唱到想要唱到的部分。
4.3.3硬件電子琴模塊實(shí)現(xiàn)方法
在原理部分我們已經(jīng)知道了硬件電子琴和自動(dòng)演奏樂曲的原理是相同的,因此在知道了如何實(shí)現(xiàn)樂曲演奏模塊的方法后,對(duì)于硬件電子琴只需要實(shí)現(xiàn)同樣的方法,就可以實(shí)現(xiàn)其模塊功能,只不過在硬件電子琴模塊中,需要的是利用按鍵實(shí)現(xiàn)其功能。對(duì)于每一個(gè)按鍵,在程序中設(shè)置各按鍵所對(duì)應(yīng)的參數(shù)即可實(shí)現(xiàn)硬件電子琴的功能。
硬件電子琴的功能實(shí)現(xiàn)主要靠蜂鳴器和系數(shù)得到實(shí)現(xiàn)。在試驗(yàn)程序的基礎(chǔ)上進(jìn)行修改系數(shù)而得到?刂瞥绦虻难h(huán)體部分實(shí)現(xiàn)了計(jì)數(shù)和完成清零的操作。通過assign賦值語句實(shí)現(xiàn)LED燈的操作,在這里,我們添加了數(shù)碼管的功能,從而實(shí)現(xiàn)了再按下按鍵的同時(shí),實(shí)現(xiàn)數(shù)碼管顯示相對(duì)應(yīng)的音階大小。

第五章  實(shí)驗(yàn)箱設(shè)計(jì)
5.1硬件電子琴模塊程序
圖5-1  硬件電子琴模塊圖
module beep1(clk,key,beep,led);                            //模塊名稱beep            
input clk;                                                                                        //系統(tǒng)時(shí)鐘48MHz            
input[6:0]key;                                                                          //按鍵輸入
output beep;                                                                                    //蜂鳴器輸出端            
output[6:0]led;                                                                                    //LED輸出
reg beep_r;                                                                                                  //寄存器
reg[15:0]count,count_end;
reg[6:0]key_r;
reg [13:0]a;                                                                                                     //消抖寄存器
always@(posedge clk)
begin
              count <= count + 1'b1;                                                        //計(jì)數(shù)器加1
              if((count == count_end)&(!(count_end == 16'hffff)))
begin
                            count <= 16'h0;                                                                      //計(jì)數(shù)器清零
                            beep_r <= !beep_r;                                             //取反輸出信號(hào)
              end
end
always @(key)
begin
              a=2000;                      //消抖等待時(shí)間
              key_r = key;                                                                                    //取鍵值
              case(key_r)
              7'b1111110:begin
              while(a>0)
              begin
              a=a-1; end
              count_end = 16'hb327;
              while(a>0)
begin
              a=a-1;
              end
              end                           
7'b1111101:begin while(a>0)begin a=a-1 ;end count_end = 16'h9fa0;while(a>0)begin a=a-1; end end                            //中音2的分頻系數(shù)值
7'b1111011:begin while(a>0)begin a=a-1 ;end count_end = 16'h8e32;while(a>0)begin a=a-1; end end                            //中音3的分頻系數(shù)值
              7'b1110111:begin while(a>0)begin a=a-1 ;end count_end16'h8637;while(a>0)begin a=a-1; end end//中音4的分頻系數(shù)值
              7'b1101111:begin while(a>0)begin a=a-1 ;end count_end = 16'h7794;while(a>0)begin a=a-1; end end                            //中音5的分頻系數(shù)值
              7'b1011111:begin while(a>0)begin a=a-1 ;end count_end = 16'h6a88;while(a>0)begin a=a-1; end end                            //中音6的分頻系數(shù)值
              7'b0111111:begin while(a>0)begin a=a-1 ;end count_end = 16'h5ee8;while(a>0)begin a=a-1; end end                            //中音7的分頻系數(shù)值
              default: begin while(a>0)begin a=a-1 ;end count_end = 16'hffff;while(a>0)begin a=a-1; end end            
              endcase
end
assign beep =beep_r;                                                                                                      //輸出音樂
assign led =key_r;                                                                                                         //輸出按鍵狀態(tài)
endmodule
  5.2樂曲自動(dòng)演奏機(jī)程序
圖5-2   樂曲自動(dòng)演奏模塊圖
module                 song(clk,beep,led);                                                        //模塊名稱               
input              clk;                                                                                                               //系統(tǒng)時(shí)鐘48Mhz
output              beep;                                                                                                 //蜂鳴器輸出端  
output[7:0] led;
reg              beep_r;                                                                                           //寄存器
reg[7:0] state;                                                                                                    //樂譜狀態(tài)機(jī)
reg[15:0]count,count_end;
reg[23:0]count1;
//樂譜參數(shù):D=F/2K  (D:參數(shù),F:時(shí)鐘頻率,K:音高頻率)   
//以下是12MHZ晶振狀態(tài)下的各音高對(duì)應(yīng)的參數(shù)     
/*parameter   L_5 = 16'h3bca,                            //低音5
                                          M_1 = 16'h2cc9,                                          //中音1
                                          M_2 = 16'h27f8,                                //中音2
                                          M_3 = 16'h238c,                                          //中音3
                                          M_4 = 16'h218d,                                          //中音4
                                          M_5 = 16'h1de5,                                          //中音5
                                          M_6 = 16'h1aa2;                                          //中音6
parameter              TIME = 3000000;                                          //控制每一個(gè)音的長(zhǎng)短(250ms)*/  
//樂譜參數(shù):D=F/2K  (D:參數(shù),F:時(shí)鐘頻率,K:音高頻率)   
parameter   L_5 = 16'd61224,                                          //低音5
                                          M_1 = 16'd45863,                            //中音1
                                          M_2 = 16'd40864,                            //中音2
                                          M_3 = 16'd36402,                            //中音3
                                          M_4 = 16'd34359,                            //中音4
                                          M_5 = 16'd30612;                            //中音5
                                                                     
parameter              TIME = 12000000;                                          //控制每一個(gè)音的長(zhǎng)短(250ms)  
assign beep = beep_r;                                                                      //輸出音樂 ,蜂鳴器
always@(posedge clk)
begin
              count <= count + 1'b1;                                                        //計(jì)數(shù)器加1   
              if(count == count_end)
              begin
                            count <= 16'h0;                                                                      //計(jì)數(shù)器清零  
                            beep_r <= !beep_r;                                                        //輸出取反
              end
end
                            always @(posedge clk)
                            begin
                            if(count1 < TIME)                                                                      //一個(gè)節(jié)拍250mS
                                                        count1 = count1 + 1'b1;
                                          else
                                          begin
                                                        count1 = 24'd0;
                                          if(state == 8'd125)            //控制歌曲循環(huán)播放時(shí)間   
                                                                      state = 8'd0;          //循環(huán)從頭開始
                                                        else
                                                                      state = state + 1'b1;     //循環(huán)結(jié)構(gòu)體
begin
              case(state)
8'd0,8'd1:                                                               count_end = M_3;//中音"3",持續(xù)2個(gè)節(jié)拍
8'd2,8'd3:                 count_end = M_3;//中音"3",持續(xù)2個(gè)節(jié)拍
8'd4,8'd5:                                                              count_end = M_4;//中音"4",持續(xù)2個(gè)節(jié)拍
8'd6,8'd7:                                                    count_end = M_5;            
8'd8,8'd9:                                                               count_end = M_5;            
8'd10,8'd11:                                                 count_end = M_4;
8'd12,8'd13:                                                 count_end = M_3;            
8'd14,8'd15:                                       count_end = M_2;
8'd16,8'd17:                                                 count_end = M_1;
8'd18,8'd19:                                                 count_end = M_1;
8'd20,8'd21:                                          count_end = M_2;
8'd22,8'd23:                                       count_end = M_3;
8'd24,8'd25,8'd26:                                   count_end = M_3;
8'd27:                                                                   count_end = M_2;
8'd28,8'd29,8'd30,8'd31:                               count_end = M_2;
8'd32,8'd33:                                               count_end = M_3;                           
8'd34,8'd35:                                                           count_end = M_3;                                       
8'd36,8'd37:                                                           count_end = M_4;
8'd38,8'd39:                                                            count_end = M_5;
8'd40,8'd41:                                                count_end = M_5;
8'd42,8'd43:                                                         count_end = M_4;
8'd44,8'd45:                                                         count_end = M_3;
8'd46,8'd47:                                                             count_end = M_2;
8'd48,8'd49:                                      count_end = M_1;                                                      
8'd50,8'd51:                                                         count_end = M_1;
8'd52,8'd53:                                                            count_end = M_2;                           
8'd54,8'd55:                                                         count_end = M_3;                                                      
8'd56,8'd57,8'd58:                                           count_end = M_2;            
8'd59:                                                                              count_end = M_1;            
8'd60,8'd61,8'd62,8'd63:                             count_end = M_1;
8'd64,8'd65:                                                         count_end = M_2;            
8'd66,8'd67:                                                         count_end = M_2;
8'd68,8'd69:                                                 count_end = M_3;
8'd70,8'd71:                                              count_end = M_1;                                                      
8'd72,8'd73:                                                         count_end = M_2;                           
8'd74:                                           count_end = M_3;
8'd75:                                                         count_end = M_4;                                         
8'd76,8'd77:                                                         count_end = M_3;
8'd78,8'd79:                                     count_end = M_1;
8'd80,8'd81:                                                            count_end = M_2;
8'd82:                                                                           count_end = M_3;            
8'd83:                                                        count_end = M_4;                                         
8'd84,8'd85:                                                         count_end = M_3;                                       
8'd86,8'd87:                                                         count_end = M_2;
8'd88,8'd89:                                                         count_end = M_1;            
8'd90,8'd91:                                     count_end = M_2;
//8'd92,8'd93:                                                         count_end = L_5;
8'd92,8'd93,8'd94,8'd95:                            count_end = L_5;
//8'd94,8'd95:                                                         count_end = M_3;
8'd96,8'd97:                                                         count_end = M_3;            
8'd98,8'd99:                                    count_end = M_3;
8'd100,8'd101:                                                         count_end = M_4;
8'd102,8'd103:                                                         count_end = M_5;
8'd104,8'd105:                                                         count_end = M_5;            
8'd106,8'd107:                                                         count_end = M_4;
8'd108:                                                                           count_end = M_3;                                                      
8'd109:                                                                           count_end = M_2;
8'd110,8'd111:                                                         count_end = M_1;            
8'd112,8'd113:                                     count_end = M_1;
8'd114,8'd115:                                                         count_end = M_2;
8'd116,8'd117:                                                         count_end = M_3;
8'd118,8'd119,8'd120:        count_end = M_2;
8'd121:                                                      count_end = M_1;
8'd122,8'd123,8'd124,8'd125:                             count_end = M_1;
default:count_end = 16'hffff;
                                                        endcase
                                            end
                               end
                            end
                           
assign led[0]=(count_end == M_1)?0:1;  //控制LED燈的語言
assign led[1]=(count_end == M_2)?0:1;
assign led[2]=(count_end == M_3)?0:1;
assign led[3]=(count_end == M_4)?0:1;
assign led[4]=(count_end == M_5)?0:1;
assign led[5]=(count_end == L_5)?0:1;
assign led[6]=1;
assign led[7]=1;
endmodule






5.3 選擇模塊程序
            
圖5-3選擇模塊圖

module select(key,beep1,beep2,led1,led2,beep,led);
input key,beep1,beep2;
input [6:0]led1;
input [6:0]led2;
output beep;
output [6:0]led;
reg key_r;
always @(negedge key)
begin
              key_r = ~key_r;                            //將琴鍵開關(guān)轉(zhuǎn)換為乒乓開關(guān)
end
assign beep=(key_r)?beep2:beep1;
assign led=(key_r)?led2:led1;            
endmodule
5.4頂層文件程序

圖5-4頂層文件圖
module dzq(key,key7,beep,led,clk);
input key7;
input [6:0]key;
input clk;
output [6:0]led;
output beep;
reg dout1;
reg dout2;
reg dout3;
reg led;
reg key_r;
wire a,b,key_l;
wire [6:0]c;
wire [6:0]d;
assign key_l = (dout1 | dout2 | dout3);              //按鍵消抖輸出
always @(posedge clk)
begin
              dout1 <= key7;
              dout2 <= dout1;
              dout3 <= dout2;            
end
              song     (.clk(clk),.beep(b),.led(c));
              beep1    (.clk(clk),.key(key),.beep(a),.led(d));
              select   (.key(key_l),.beep1(a),.beep2(b),.beep(beep),.led(led),.led1(d),.led2(c));
endmodule
第六章  實(shí)驗(yàn)圖形文件6.1管腳鎖定
引腳鎖定:選擇Assignments-pin planer

圖6-1管腳鎖定圖
RTL圖:選擇Tools—netlist viewers—RTL viewers
圖6-2 RTL圖
6.2DXP原理圖及封裝
DXP原理圖的設(shè)計(jì):
  • 執(zhí)行“文件”—“創(chuàng)建”—“項(xiàng)目”—“PCB項(xiàng)目”命令
  • projects面板上新建一個(gè)項(xiàng)目文件,默認(rèn)名為PCB_Projects.PrjPCB.
  • 執(zhí)行“文件”—“保存項(xiàng)目”命令
  • libiaries元件庫(kù)進(jìn)行原理圖繪制
圖6-3 dxp原理圖
DXP封裝設(shè)計(jì):
  • 執(zhí)行“文件”—“創(chuàng)建”—“PCB文件”命令,新建PCB設(shè)計(jì)文件并保存
  • 設(shè)置工作層:選擇機(jī)械層設(shè)置物理邊界,在禁止布線層設(shè)置電氣邊界。
  • 加載網(wǎng)絡(luò)表:執(zhí)行“設(shè)計(jì)”—Import Changes From DESIGN.PRJPCB命令,單擊“使變化生效”—“執(zhí)行變化”
  • 元件自動(dòng)布局:執(zhí)行“工具”—“放置元件”—“自動(dòng)布局”命令
  • 元件自動(dòng)布線:執(zhí)行“自動(dòng)布線”—“設(shè)定”—“全部對(duì)象”命令,選擇默認(rèn)設(shè)置,確認(rèn)布線即可

圖6-4封裝圖
6.3任務(wù)完成情況說明                          
編號(hào)
功能
完成狀況
1
按下KEY1—KEY7 分別表示中音的DO、 RE 、 ME、 FA、 SOL、 LA、 SI;
達(dá)成
2
對(duì)于電子琴,按下相應(yīng)的鍵有對(duì)應(yīng)LED燈指示
達(dá)成
3
可以在電路上能自動(dòng)演奏樂曲。在這里我們采用的是貝多芬的《歡樂頌》,且有相應(yīng)的LED燈指示高低音;
達(dá)成
4
能實(shí)現(xiàn)電子琴和樂曲自動(dòng)演奏功能的切換
達(dá)成





                 表6-5 任務(wù)完成情況表:




6.4硬件連接圖
圖6-6按鍵電路圖                                                 圖6-6 LED燈電路圖
圖6-7 2X5下載插座             圖6-8 蜂鳴器電路圖
圖6-9 晶振電路圖                 圖6-10  電源電路圖

總結(jié)
    本次EDA課程設(shè)計(jì)進(jìn)一步加深了我們對(duì)實(shí)驗(yàn)課的認(rèn)識(shí)和對(duì)EDA的了解,對(duì)于Verilog HDL語言的運(yùn)用更加的熟練。同時(shí)對(duì)于課程設(shè)計(jì)過程中要進(jìn)行的調(diào)試和編寫程序有了一定的認(rèn)識(shí)。
電子琴使用按鍵的沖突,不得不消除原有模塊的高音階部分,而將其改造出現(xiàn)在的模塊和形式,對(duì)于硬件電子琴的改造,看似是對(duì)原功能塊的簡(jiǎn)單的改進(jìn),而實(shí)際上是需要重新構(gòu)造電路的,因?yàn)樵谘葑嗟倪^程中會(huì)有LED燈的使用沖突,如何調(diào)試和調(diào)用,才是本課程設(shè)計(jì)的重點(diǎn),因?yàn)轫攲游募男枰,我們需要?duì)各自的程序進(jìn)行調(diào)整和修改。目的是為了能夠在最后的開發(fā)平臺(tái)上得到我們想要的結(jié)果。
在這次的課程設(shè)計(jì)過程中,我們采取的分工合作的方式來進(jìn)行課程設(shè)計(jì)是一件很好的事情。大家各有側(cè)重點(diǎn)但是同時(shí)都為課程設(shè)計(jì)做出應(yīng)該做的努力,分工協(xié)作有時(shí)候不僅有利用于課程設(shè)計(jì)的快速進(jìn)行,而且也有利于個(gè)人和小組的交流和促進(jìn),在分工的時(shí)候,每個(gè)人都各盡所長(zhǎng),實(shí)現(xiàn)了又快又好的完成課程任務(wù)的目標(biāo)。最后,特別感謝本次課程設(shè)計(jì)給予我們指導(dǎo)的老師,在老師的知道和啟發(fā)下,我們才能正確的完成課程設(shè)計(jì)。


附錄:項(xiàng)目實(shí)物圖
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表