簡易電子琴設計及FPGA功能驗證FPGA畢業(yè)課程設計_第1頁
簡易電子琴設計及FPGA功能驗證FPGA畢業(yè)課程設計_第2頁
簡易電子琴設計及FPGA功能驗證FPGA畢業(yè)課程設計_第3頁
簡易電子琴設計及FPGA功能驗證FPGA畢業(yè)課程設計_第4頁
免費預覽已結束,剩余21頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、( 此文檔為 word 格式,下載后您可任意編輯修改!)西安郵電大學FPGA 課程設計報告題目:簡易電子琴設計及FPGA功能驗證院系:電子工程學院專業(yè)班級:微電子 0901導師姓名:黃海生2012年6 月 29 日1目錄1.任務 .22.目的 .23.使用環(huán)境 .24.FPGA 課程設計詳細內容 .24.1技術規(guī)范 .24.1.1總體描述 .24.1.2結構框圖 .24.1.3引腳描述 .34.1.3應用范圍 .54.2設計方案 .54.2.1頂層方案設計 .54.2.2頂層模塊程序 .74.3功能驗證方案及源程序 .74.3.1按鍵輸入控制模塊方案設計及源程序 .74.3.2控制模塊方案設計

2、及源程序 .84.3.3LCD 驅動模塊方案設計及源程序 .114.4電路設計及功能仿真報告 .194.5綜合及布局布線報告和引腳分布報告 .214.6硬件測試結果報告 .215.課程設計的心得體會 .226.參考資料 .221 任務:a、設計一個簡單電子琴。 (內置 24 首簡單音調曲)b、用 FPGA 開發(fā)板的按鍵可選擇演奏內置曲調,用數碼管顯示當前演奏的哪個演奏曲目或停止。c、要求電子琴具有自主選擇,自動播放所選曲目或停止曲目。2 目的:2a、在掌握計算機組成原理理論相關的基礎上,了解EDA 技術,掌握Verilog HDL硬件描述語言的設計方法和思想,通過學習的Verilog HDL語

3、言結合電子電路的設計知識理論聯(lián)系實際,掌握所學的課程知識;b、深入學習 Verilog HDL 、 FPGA,了解其編程環(huán)境;c、學會運用 Modelsim 和 Quartus II 等編程仿真軟件;d、將硬件語言編程與硬件實物功能演示相結合, 加深理解 Verilog HDL 、 FPGA 的學習;3 使用環(huán)境(軟件硬件環(huán)境,設備等 )軟硬件環(huán)境:軟件: Quartus II 7.2, Modelsim6.1;硬件環(huán)境: DEII 開發(fā)板;設備: PC 一臺, USB 下載線, FPGA 開發(fā)板及電源。在 EDA 軟件平臺上,根據硬件描述語言 Verilog 完成的設計文件,自動的完成邏輯編

4、譯、化簡、分割、綜合及優(yōu)化、布局布線、仿真、目標芯片的適配編譯、邏輯映射和編程下載等工作。Verilog HDL 語言,用 Modelsim 進行前仿真,以及代碼的生成,驗證程序驗證,也可進行綜合。用Quartus II 進行后仿真。4 FPGA 課程設計詳細內容4.1 技術規(guī)范原理簡易電子琴的設計通過軟硬件結合實現,硬件系統(tǒng)包括主控制器芯片、LED 、蜂鳴器等,軟件資源包括編寫Verilog HDL 程序的應用軟件 Modelsim 和仿真軟件 Quartus II 。電子琴有自動播放功能。播放功能中有三首曲子。程序共有六個模塊,分別為主模塊、數碼管顯示模塊、分頻模塊、計數器模塊、存儲器模塊

5、、音頻輸出模塊。硬件實現是用一個數碼管顯示當前播放的曲目,另外四個按鍵key1、key2 用來選擇曲目。通過主模塊調用各模塊實現電子琴的功能。樂曲演奏的原理:樂曲演奏的原理:組成樂曲的每個音符的頻率值 (音調 )以及持續(xù)時間(音長)是樂曲能持續(xù)演奏所需的兩個基本數據,因此只要控制輸出到揚聲器的激勵信號的頻率的高低和持續(xù)的時間,就可以使揚聲器發(fā)出持續(xù)的樂曲聲。音調的控制3頻率的高低決定了音調的高低。音樂的十二平均率規(guī)定:每兩個八度音(如簡譜中的中音1 與高音 1)之間的頻率相差一倍。在兩個八度音之間,又可分為十二個半音, 每半個音的頻率比為。 另外,音名 A( 簡譜中的低音 6)的頻率為 440

6、HZ ,音名 B 到 C 之間, E 到 F 之間為半音,其余為全音。由此可以計算出簡譜中從低音1 至高音 1 之間的每個音名對應的頻率如圖所示:音名頻率 (HZ)音名頻率 (HZ)音名頻率 (HZ)低音 1261.6中音 1523.3高音 11046.5低音 2293.7中音 2587.3高音 21174.7低音 3329.6中音 3659.3高音 31318.5低音 4349.2中音 4698.5高音 41396.9低音 5392中音 5784高音 51568低音 6440中音 6880高音 61760低音 7493.9中音 7987.8高音 71975.5所有不同頻率均從同一基準頻率分頻

7、得到。將分頻數四舍五入進行取整,并盡量減小誤差。在本設計中選取5MHZ 作為基準頻率。從下表中可以看出最大分頻系數為11468 ,采用 14 位二進制計數器分頻可滿足要求。此外還應給出預置數,對應不同的預置數,只需加載不同的預置數即可。采用加載預置數實現分頻的方法比采用反饋復零法節(jié)省資源,實現起來更加容易。音名分頻預置音名分頻預置音名分頻預置比數比數比數低音 195576826中音 1477711606高音 1238913994低音 285127871中音 2425712126高音 2212814255低音 375858798中音 3379212591高音 3189614487低音 47159

8、9224中音 4357912804高音 4179014593低音 5637810005中音 5318913194高音 5159414789低音 6568210701中音 6284113524高音 6142014963低音 7506211321中音 7253113852高音 7126615117音長的控制音符的持續(xù)時間須根據音樂的速度及每個音符的節(jié)拍數來確定。如果設定全音符的持續(xù)時間為 1S 的話,假設產生4 分音符,則產生四分頻即可實現四分音符的時長,并提供4HZ分頻器。如圖為樂曲演奏的原理圖,其中,樂譜產生電路用來控制音樂的音調和時長??刂埔粽{通過設置計數器的預置數來實現,預置不同的數值會可

9、以使計數器產生不同頻率的信號,從而產生不同的音調??刂埔糸L是通過控制計數器預置數的停留時間來實現的,預置數的停留時間越長,則該音符的演奏時間越長,如2 分音符,在記譜時將該音符記錄兩次即可。總體方案本次設計課程的目的是讓我們在學習verilogHDL 的基礎上更加深入的了解硬件設計語言的4功能、作用及其特征,并且將我們的動手能力與創(chuàng)新能力結合起來。本次試驗的總體框圖為:設計框圖說明引腳描述信號名輸入輸出目標源功能描述CLKInputPin主時鐘頻率, 5MHZ ,占空比為 1:1DIRInputPin使能端,控制時鐘產生,以及讀寫同步OUTOutputPin輸出樂曲信號 (方波形式 )SCRE

10、ENOutputPin數碼管顯示信號4.1.4 頂層劃分5頂層模塊說明:1D 觸發(fā)器:實現信號讀取,產生內部使能端,控制分頻器;2分頻器 :實現與基準時鐘同步操作, 讀取存儲器數據進行分頻操作,實現音調與音長的改變與輸出;3節(jié)拍發(fā)生器 : 根據使能端,產生對應的頻率產生對應音符時長;4存儲器:實現將預置數傳送給分頻器,實現曲目的不停音調和音長;52 分頻器:將產生的信號再次進行2 分頻;注: 音名顯示控制音名顯示電路用來顯示演奏樂曲時對應的音樂曲曲目名。可以用三個數碼管,加以顯示,本設計中使用 HIGH3:0,MED3;0,LOW3;0 等信號加以顯示,為了能使其循環(huán)顯示,需要一時長計數器,等

11、音樂演奏完成后,保證自動從頭開始演奏。子模塊描述6<1>按鍵接收器D 觸發(fā)器1、功能描述運用 D 觸發(fā)器和數據鎖存器實現數據線輸出的使能端。2、管腳描述信號名稱輸入輸出源目標功能描述DIR輸入Pin按鍵輸入信號DR輸出Pin使能端3、實現說明:在按鍵信號產生后,進行信號的鎖存和產生使能信號。4、驗證方案正常的信號鎖存,和信號轉換;是否實現正確使能輸出;<2>節(jié)拍發(fā)生器分頻器1、功能描述根據信號的輸入,對應產生對應曲目的節(jié)拍頻率時鐘用來讀取存儲器音調音長數據,產生不同的預置數2、管腳描述信號名稱輸入輸出源目標功能描述DIR輸入PIN按鍵輸入CLK輸入PIN基準時鐘頻率CK

12、輸出PIN1 位節(jié)拍頻率時鐘3、實現說明在 CLK 的上升沿,將鎖存后的 DIR 信號輸入到內部,并根據對應時鐘節(jié)拍分頻,產生對應節(jié)拍頻率。4、測試略;<3> 分頻器1、功能描述將基準時鐘按照預置數的信息進行分頻,且與時鐘同步,并當使能端低電平時,停止輸出,也可實現循環(huán)播放。2、管腳描述信號名稱輸入輸出源目標功能描述DIR輸入PIN使能端CK輸入PIN基準頻率VOICE輸入PIN預置數SPEAK輸出PIN樂曲輸出;3、實現說明通過計數器、存儲器、 D 觸發(fā)器,實現分頻。當計數從預置數到初始值7時 Speaker 翻轉一次,即為分頻。4、測試用 modelsim仿真,觀察波形是否為所

13、需方波;<4>存儲器1、功能描述按照使能端的數據, 選擇對應的預置數據進行讀操作, 并且于時鐘同步。2、管腳描述信號名稱輸入輸出源目標功能描述DR輸入PIN使能端CLK輸入PIN基準頻率VOICE輸出PIN讀取的預置數SCREEN輸出PIN數碼管信號輸出;3、實現說明通過選擇,在時鐘的上升沿進行數據的讀取,并將讀出的數據同時傳至數碼管,與分頻器。4、測試用 modelsim仿真,觀察預置數的值是否為對應曲目;驗證方案:正常情況下,輸入一個 DIR 的值,查看波形輸出是否正常。改變 DIR 的值,再次查看波形輸出是否正常,并且其頻率是否滿足上述的公式計算出的值。應用范圍 :簡易電子琴

14、可以應用于簡單的設計中,亦可應用于娛樂方面。4.2 設計方案頂層方案設計頂層主要是對各個子模塊進行調用與連接,頂層主要調用以下模塊:(1)按鍵驅動模塊該模塊用于選擇所要播放曲目。(2)控制模塊:該模塊用于處理比較所選擇的功能。(3)數碼管顯示模塊:該模塊用于顯示用戶是否登陸成功,即LCD 驅動。頂層模塊程序信號定義與說明CLK_4HZ: 用于控制音長 ( 節(jié)拍 ) 的時鐘頻率clk_6MHZ:用于產生各種音階頻率的基準頻率speak: 用于激勵揚聲器的輸出信號, 本例中為方波信號low=0;assign dir=key1,key0;clock5mhz mhz(.clk(clk),.dir(di

15、r),.clk_5MHZ(clk_5MHZ);clock4hz8m(.dr(dr),.clk_5MHZ(clk_5MHZ),.clk_4HZ(clk_4HZ),.voice(voice),.speak (speak);decode dec(.dir(dir),.decodeout(decodeout);endmodule信號定義與說明CLK_4HZ:用于控制音長 ( 節(jié)拍 ) 的時鐘頻率clk_6MHZ:用于產生各種音階頻率的基準頻率speak: 用于激勵揚聲器的輸出信號 , 本例中為方波信號 voice=if(counter=63) counter<=0;else counter<

16、;=counter+1;case(counter)0: if(counter=195) counter<=0;else counter<=counter+1;case(counter)0: if(counter=103) counter<=0;else counter<=counter+1;case(counter)0: if(dir=2'b00) clk_5MHZ<=0; else if(cnt<4'b1010)cnt<=cnt+4'b0001;else begincnt<=4'b0000; clk_5MHZ&l

17、t;=clk_5MHZ; endendendmodulemodule clock4hz(clk_5MHZ,dir,ck,clk_4HZ);時鐘頻率 4Hz( 基于 clock6mhz 分頻后的時鐘再次分頻 )input clk_5MHZ;input 1:0 dir;output clk_4HZ;output ck;wire clk_5MHZ,ck;wire 1:0 dir;reg clk_4HZ;reg 19:0 cnt;assign ck=clk_4HZ;9always(posedge clk_5MHZ)beginif(dir=2'b00)clk_4HZ<=0;elsebegi

18、ncnt<=20'b0;clk_4HZ<=clk_4HZ;endendendmodule觸發(fā)器模塊:module D(dir,dr);input 1:0 dir;output dr;wire dr;wire 1:0 dir;assign dr=dir0|dir1;endmodule數碼管顯示:module decode(dir,decodeout);input1:0 dir;output6:0 decodeout;reg 6:0 decodeout;wire 1:0 dir;always (dir)begincase(dir)endcaseendendmodule分頻器模塊

19、:module main(dr,clk_5MHZ,clk_4HZ,voice,speak);input dr;input clk_5MHZ;input 11:0 voice;input clk_4HZ;output speak;wire dr;wire clk_5MHZ,clk_4HZ;wire 11:0 voice;reg speak;10reg 13:0 divider,origin;wire carry;assign carry=(divider=16383);always (posedge clk_5MHZ)beginif(carry) divider<=origin;else

20、divider=divider+1;endalways (posedge carry)beginspeak<=speak;endalways (posedge clk_4HZ)beginif(dr=1'b0)origin<=16383;case(voice)default: origin<=16383;endcaseendendmodule激勵module epiano_tb;reg clk50m,clk27m,rst,key1,key2;wire spk_out;wire 6:0 key_display;e_pianoa(.clk50m(clk),.clk27m(c

21、lk27m),.spk_out(speak),.rst(rst),.key1(key1),.key2(key2),.key_display(key_display);always #10 clk50m=clk50m;always #20 clk27m=clk27m;initialbeginclk50m=0;clk27m=0;#50 rst=0;#50 rst=1;#1500 key1=0;key2=1;#2000 key1=1;key2=1;endendmodule4.3 功能驗證方案及源程序計數器模塊11module counter(fenpin8,cout,rst,key1,key2);i

22、nput fenpin8,rst,key1,key2;output 10:0cout;reg 10:0 cout;always (posedge fenpin8 or negedge rst or negedge key1 or negedge key2)beginif(!rst)cout<=11'd0;elsebeginif(!key1)begincout<=11'd0;endelse if(!key2)begincout<=11'd512;endelse if(!key3)begincout<=11'd1024;endelse if(

23、!key4)begincout<=11'd1536;endelsecout<=cout+1;endendendmodule分頻模塊module fenpin8(clk27m,rst,clk_8hz);input clk27m,rst;output clk_8hz;reg clk_8hz;reg 31:0 cnt;always (posedge clk27m or negedge rst)beginif(!rst)begincnt<=0;12clk_8hz<=0;endelsebeginif(cnt=N2)begincnt<=0;clk_8hz<=!c

24、lk_8hz;endelsecnt<=cnt+1;endendendmodule激勵module fenpin8_tb;reg clk27m,rst;wire clk_8hz;fenpin8 fenpin8_tb(.clk27m(clk27m),.clk_8hz(clk_8hz),.rst(rst);always #50 clk27m=clk27m;initialbeginclk27m=0;#20 rst=0;#80 rst=1;endendmodulemodule fenpin5m(clk50m,rst,clk_5m);input clk50m,rst;output clk_5m;re

25、g clk_5m;reg 3:0 cnt;parameter N=10;always (posedge clk50m or negedge rst)beginif(!rst)begincnt<=0;clk_5m<=0;endelsebegin13if(cnt=N2)begincnt<=0;clk_5m<=!clk_5m;endendendendmodule激勵module fenpin5m_tb;reg clk50m,rst;wire clk_5m;fenpin5m fenpin5m_tb(.clk50m(clk50m),.clk_5m(clk_5m),.rst(rst

26、);always #50 clk50m=clk50m;initialbeginclk50m=0;#20 rst=0;#80 rst=1;endendmodule存數器模塊module music_rom (address,clock,q);input10:0 address;inputclock;output 7:0 q;wire 7:0 sub_wire0;wire 7:0 q = sub_wire07:0;altsyncramaltsyncram_component (.clock0 (clock),.address_a (address),.q_a (sub_wire0),.aclr0

27、(1'b0),.aclr1 (1'b0),.address_b (1'b1),.addressstall_a (1'b0),.addressstall_b (1'b0),.byteena_a (1'b1),.byteena_b (1'b1),.clock1 (1'b1),14.clocken0 (1'b1),.clocken1 (1'b1),.clocken2 (1'b1),.clocken3 (1'b1),.data_a (81'b1),.data_b (1'b1),.eccsta

28、tus (),.q_b (),.rden_a (1'b1),.rden_b (1'b1),.wren_a (1'b0),.wren_b (1'b0);defparamaltsyncram_component.clock_enable_input_a = "BYPASS",altsyncram_component.clock_enable_output_a = "BYPASS",altsyncram_component.init_file = "zxmzf_mif.mif",altsyncram_comp

29、ended_device_family = "Cyclone II",altsyncram_component.lpm_mode = "ROM",altsyncram_component.outdata_aclr_a = "NONE",altsyncram_component.outdata_reg_a = "CLOCK0",altsyncram_component.widthad_a = 11,altsyncram_component.width_a = 8,altsyncram_compone

30、nt.width_byteena_a = 1;endmodule激勵module music_rom_tb;reg 8:0address;reg clk;wire 7:0q;music_rommusic_rom_tb(.address(address),.clock(clk),.q(q);always #50 clk=clk;initialbeginclk=0;#100 address=3;#100 address=12;#40 address=10;endendmodule音頻輸出模塊module SPK_OUT(data,spk_out,clk_5m,clk_8hz);input 7:0d

31、ata;input clk_5m,clk_8hz;output spk_out;15reg spk_out=0;reg 13:0reg_temp;reg 13:0 count=0;always (posedge clk_8hz)begincase(data)7'd0: reg_temp=16383;7'd1: reg_temp=9557;7'd2: reg_temp=8513;7'd3: reg_temp=7584;7'd4: reg_temp=7159;7'd5: reg_temp=6378;7'd6: reg_temp=5682;7&

32、#39;d7: reg_temp=5061;7'd8: reg_temp=4778;7'd9: reg_temp=4257;7'd10: reg_temp=3584;7'd11: reg_temp=3579;7'd12: reg_temp=3189;7'd13: reg_temp=2841;7'd14: reg_temp=2531;7'd15: reg_temp=2389;7'd16: reg_temp=2128;7'd17: reg_temp=1810;7'd18: reg_temp=1790;7'

33、;d19: reg_temp=1594;7'd20: reg_temp=1420;7'd21: reg_temp=1265;default: reg_temp=16383;endcaseendalways (posedge clk_5m)beginif(count>reg_temp)begincount<=0;spk_out<=spk_out;endelsecount<=count+1;endendmodule激勵16module SPK_OUT_tb;reg clk_5m,clk_8hz;reg 5:0data;wire spk_out;SPK_OUT

34、uaa(.data(data),.clk_5m(clk_5m),.clk_8hz(clk_8hz),.spk_out(spk_out);always #25 clk_5m=clk_5m;always #3000 clk_8hz=clk_8hz;initialbeginclk_5m=0;clk_8hz=0;#3000 data=5;#6000 data=7;endendmodule數碼管顯示模塊module shumaguan(key1,key2,key_display,rst);input key1,key2,rst;output 6:0 key_display;reg 6:0 key_dis

35、play;always (negedge rst or negedge key1 or negedge key2 )beginif(!rst)elsebeginif(!key1)else if(!key2)else if(!key3)else if(!key4)elseendendendmodule激勵module shumaguan_tb;reg key1,key2,rst;wire 6:0 key_display;shumaguanuaa(.key1(key1),.key2(key2),.rst(rst),.key_display(key_display);17initialbegin#20 key1=0;key2=1;#80 key1=1;key2=1;#450 key1=1;key2=1;#650 key1=1;key2=1;endendmodul e4.4 電路設計及功能仿真報告主模塊仿真結果:輸出模塊仿真結果:數碼管模塊仿真結果:4.5 綜合及布局布線報告和引腳分布報告總體模塊 RTL View :18引腳分布報告:4.6 硬件測試結果報告硬件測試結果與預期結果一樣,可實現簡易電子琴的操作。5.課程設計的心得體會通過對測試結果的分析 ,我們發(fā)現采用 FPGA 所設計的電子琴系統(tǒng)設計趨于簡單、開發(fā)時間短;外圍器件少,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論