版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計(jì)</b></p><p> 設(shè)計(jì)題目:基于FPGA的樂曲演奏電路設(shè)計(jì)</p><p><b> 指導(dǎo)教師: 蔣俊華</b></p><p> 學(xué)院:物理與電子學(xué)院 </p><p> 專業(yè):電子信息科學(xué)與技術(shù) </p&g
2、t;<p> 姓名: </p><p> 學(xué)號(hào): </p><p> 實(shí)驗(yàn)地點(diǎn):特種功能實(shí)驗(yàn)室(實(shí)驗(yàn)室502) </p><p> 摘要:本文根據(jù)層次化的設(shè)計(jì)思路并在EDA開發(fā)工具Quartus II 9.0 (32-Bit) 平臺(tái)上,采用Verilog語言、原理圖、定制LPM-RO
3、M塊以及實(shí)例化的設(shè)計(jì)方法,利用數(shù)控分頻的原理實(shí)現(xiàn)了基于FPGA片上系統(tǒng)(本實(shí)驗(yàn)用的是康芯GW48系列EDA設(shè)備)樂曲演奏的設(shè)計(jì)。</p><p> 關(guān)鍵詞 FPGA,EDA,Verilog,數(shù)控分頻器 </p><p><b> 一. 概述部分:</b></p><p><b> 設(shè)計(jì)所要實(shí)現(xiàn)的功能</b>&l
4、t;/p><p> 能夠很好的演奏出“梁?!钡淖V子,將音樂通過實(shí)驗(yàn)箱上的喇叭播放出;演奏發(fā)音相對應(yīng)的簡譜碼輸出顯示由在數(shù)碼管5顯示;高八度音指示由發(fā)光管D5指示</p><p> 設(shè)計(jì)所采用的基本思想</p><p> 根據(jù)層次化的設(shè)計(jì)思路,可把樂曲硬件演奏電路分為3個(gè)模塊,音樂節(jié)拍發(fā)生模塊,音符譯碼電路模塊,數(shù)控分頻模塊。</p><p&g
5、t; 音樂節(jié)拍發(fā)生模塊的設(shè)計(jì):將編輯好的音符填入MIF文件中再定制LPM-ROM塊將音符數(shù)據(jù)加載入ROM再通過計(jì)數(shù)器逐步計(jì)數(shù)rom塊的地址來提取音符;音符譯碼電路模塊、數(shù)控分頻模塊的設(shè)計(jì):都是由verilog代碼實(shí)例化生成</p><p> 通過輸入原理圖的方法將各個(gè)模塊連接起來生成一個(gè)block塊的.qpf文件作為最終的頂層文件。</p><p><b> 二.系統(tǒng)設(shè)計(jì)部
6、分</b></p><p> ?。?) 整個(gè)設(shè)計(jì)的組織結(jié)構(gòu) </p><p> ?。?)各個(gè)子單元的設(shè)計(jì)思路 </p><p> 音樂節(jié)拍發(fā)生模塊的設(shè)計(jì):</p><p> LPM-ROM塊 該模塊為音樂曲譜的存放塊。其中設(shè)置了“梁祝”樂曲全部音符所對應(yīng)的分頻預(yù)置數(shù)。其利用LPM_ROM宏模塊將共設(shè)定256個(gè)音符,每個(gè)音符寬度
7、為4位。 Mif文件存放樂曲中的音符數(shù)據(jù),它是利用LPM-ROM來實(shí)現(xiàn)的,將樂譜中相應(yīng)的音符放在一個(gè)連續(xù)的地址上。它首先是編寫音符數(shù)據(jù)文件,將樂譜中相應(yīng)的音符存放在一個(gè)連續(xù)的地址上。因?yàn)?拍的時(shí)間定為1秒,提供的是4Hz的時(shí)鐘頻率(即1/4拍的整數(shù)倍),則需將這個(gè)音符存儲(chǔ)在相應(yīng)次數(shù)的連續(xù)幾個(gè)地址上。.mif文件如下:</p><p> CNT138塊這個(gè)計(jì)數(shù)器的計(jì)數(shù)頻率選為4Hz,即每一計(jì)數(shù)值的停留時(shí)間為0.2
8、5秒,恰為當(dāng)全音符設(shè)為1秒,四四拍的4分音符持續(xù)時(shí)間。例如,地址發(fā)生器在以下的Verilog邏輯描述中,“梁?!睒非牡谝粋€(gè)音符為“3”,此音在邏輯中停留了4個(gè)時(shí)鐘節(jié)拍,即1秒時(shí)間。模塊程序如下:</p><p> module cnt138t(clk,cnt);</p><p> input clk;</p><p> output [7:0]cnt;&l
9、t;/p><p> reg [7:0]cnt;</p><p> always @ (posedge clk) </p><p><b> begin</b></p><p> if(cnt==8'b10001010) cnt<=8'b00000000;</p><p>
10、 else cnt<=cnt+1;</p><p><b> end </b></p><p> endmodule </p><p> 音符譯碼電路模塊的設(shè)計(jì):</p><p> 音符譯碼電路模塊即分頻預(yù)置數(shù)模塊是樂曲簡譜碼對應(yīng)的分頻預(yù)置數(shù)查表電路。它提供了每個(gè)音符所對應(yīng)的分頻預(yù)置數(shù),即給數(shù)控分頻模塊
11、提供計(jì)數(shù)初值,這里以“梁?!睒非鸀槔谐隽嗽谶@個(gè)樂曲中所用到的13個(gè)音符的分頻預(yù)置數(shù)。在這個(gè)模塊的Verilog邏輯描述中設(shè)置了“梁?!睒非腥恳舴鶎?yīng)的分頻預(yù)置數(shù),共13個(gè),每一音符的停留時(shí)間由音樂節(jié)拍和地址發(fā)生器模塊的時(shí)鐘(Clk)的輸入頻率決定,在此為4Hz。這13個(gè)值的輸出由計(jì)數(shù)模塊的index[3..0]確定,而index[3..0]的值又由地址發(fā)生器模塊的輸出q[3..0]的輸出值和持續(xù)時(shí)間決定。程序如下:</p
12、><p> module tonetaba(index,code,high,tone);</p><p> input [3:0]index;</p><p> output [3:0]code;</p><p> output [10:0]tone;</p><p> output high;</p&g
13、t;<p> reg [3:0]code;</p><p> reg [10:0]tone;</p><p><b> reg high;</b></p><p> always @ (index) </p><p><b> begin </b></p>&l
14、t;p> case(index) </p><p> 4'b0000: begin tone<=11'b11111111111; code<=4'b0000; high<=1'b0; end</p><p> 4'b0001: begin tone<=11'b01100000101; code<=4&
15、#39;b0001; high<=1'b0; end</p><p> 4'b0010: begin tone<=11'b01110010000; code<=4'b0010; high<=1'b0; end</p><p> 4'b0011: begin tone<=11'b10000001100;
16、 code<=4'b0011; high<=1'b0; end</p><p> 4'b0101: begin tone<=11'b10010101101; code<=4'b0101; high<=1'b0; end</p><p> 4'b0110: begin tone<=11'b
17、10100001010; code<=4'b0110; high<=1'b0; end</p><p> 4'b0111: begin tone<=11'b10101011100; code<=4'b0111; high<=1'b0; end</p><p> 4'b1000: begin tone&
18、lt;=11'b10110000010; code<=4'b0001; high<=1'b1; end</p><p> 4'b1001: begin tone<=11'b10111001000; code<=4'b0010; high<=1'b1; end</p><p> 4'b1010:
19、 begin tone<=11'b11000000110; code<=4'b0011; high<=1'b1; end</p><p> 4'b1100: begin tone<=11'b11001010110; code<=4'b0101; high<=1'b1; end</p><p>
20、4'b1101: begin tone<=11'b11010000100; code<=4'b0110; high<=1'b1; end</p><p> 4'b1111: begin tone<=11'b11011000000; code<=4'b0001; high<=1'b1; end</p>
21、<p> default: begin tone<=11'bx; code<=4'bx; high<=1'bx; end</p><p><b> endcase</b></p><p><b> end</b></p><p> endmodule &l
22、t;/p><p> 數(shù)控分頻模塊的設(shè)計(jì):</p><p> 音符的頻率由數(shù)控分頻模塊獲得,這是一個(gè)數(shù)控分頻電路。它是由一個(gè)初值可變的加法計(jì)數(shù)器構(gòu)成。該計(jì)數(shù)器的模為2047,當(dāng)計(jì)數(shù)器記滿時(shí),計(jì)數(shù)器產(chǎn)生一個(gè)溢出信號(hào)FULL,此溢出信號(hào)就是用作發(fā)音的頻率信號(hào)。在計(jì)數(shù)器的輸入端給定不同的初值,就可得到不同音符的發(fā)音頻率信號(hào)。 計(jì)數(shù)初值(Tone)=2047-分頻系數(shù)而分頻系數(shù)又可有下式來求: 分頻
23、系數(shù)=基準(zhǔn)頻率/音符的發(fā)生頻率 低音時(shí)Tone值小,分頻系數(shù)大,溢出信號(hào)周期長,揚(yáng)聲器發(fā)出的聲音低,Tone隨音樂的樂譜變化大,自動(dòng)控制分頻比,實(shí)現(xiàn)了數(shù)控分頻,發(fā)生信號(hào)的頻率與音調(diào)Tone成正比。這就是利用數(shù)控分頻器自動(dòng)演奏音樂的原理。 其時(shí)鐘(Clk)端輸入的是在十六進(jìn)制模塊里對12MHz的信號(hào)進(jìn)行16分頻得到的750KHz,750KHz的信號(hào)根據(jù)分頻預(yù)置數(shù)模塊中所提供的計(jì)數(shù)初值,分別得出相應(yīng)音符頻率的兩倍值。此時(shí)從數(shù)控分頻器中出來的
24、輸出信號(hào)是脈寬極窄的脈沖式信號(hào),為了有利于驅(qū)動(dòng)揚(yáng)聲器,需另加一個(gè)D觸發(fā)器以均衡其占空比,這時(shí)的頻率就變?yōu)樵瓉淼?/2,剛好就是相應(yīng)音符的頻率。數(shù)控分頻模塊中對Clk輸入信號(hào)的分頻比由11位預(yù)置數(shù)tone[10..0]決定。輸出頻</p><p> module speakera(clk1,tone,spks);</p><p> input clk1;</p><p
25、> input [10:0]tone;</p><p> output spks;</p><p><b> reg spks;</b></p><p> reg preclk;</p><p> reg fullspks;</p><p> reg [3:0]count4;&l
26、t;/p><p> reg [10:0]count11;</p><p> always @ (posedge clk1)</p><p><b> begin </b></p><p> if(count4==4'b1000) begin preclk=1'b1; count4=4'b00
27、00; end </p><p> else begin count4=count4+1; preclk=1'b0; end</p><p><b> end </b></p><p> always @ (posedge preclk) </p><p><b> begin</b
28、></p><p> if (count11==11'b11111111111) begin count11=tone; fullspks=1'b1; end</p><p> else begin count11=count11+1;fullspks=1'b0; end</p><p><b> end </b
29、></p><p> always @ (posedge fullspks) </p><p><b> begin </b></p><p> spks=~spks;</p><p><b> end </b></p><p><b> endm
30、odule</b></p><p> 各個(gè)子單元之間的接口關(guān)系</p><p><b> 如下圖所示:</b></p><p> ?。?)該設(shè)計(jì)與其它設(shè)計(jì)的接口方式等 </p><p><b> 實(shí)驗(yàn)選用模式1。</b></p><p> 使CLK1與cl
31、ock9相接,接受12MHz時(shí)鐘頻率(用短路帽在clock9接“12MHz”);CLK 與clock2相接,接受4Hz頻率;發(fā)音輸出SPKOUT接Speaker;與演奏發(fā)音相對應(yīng)的簡譜碼輸出顯示可由CODE1在數(shù)碼管5顯示;HIGH1為高八度音指示,可由發(fā)光管D5指示</p><p> 然后根據(jù)實(shí)驗(yàn)手冊上 的GW48CK 系統(tǒng)萬能接插口與結(jié)構(gòu)圖信號(hào)/與芯片引腳對照表來分配該設(shè)計(jì)與其它設(shè)計(jì)的接口名稱。</p
32、><p><b> 如下圖所示:</b></p><p><b> 仿真綜合部分</b></p><p> 關(guān)鍵節(jié)點(diǎn)的位置、 作用及其測試波形的描述</p><p> Tone:分頻計(jì)數(shù)器的預(yù)置值,數(shù)控分頻模塊中對clk1高頻輸入信號(hào)的分頻比就是由11位預(yù)置數(shù)tone[10..0]決定的<
33、/p><p> Q:地址發(fā)生器模塊(包括LPM-ROM塊)的輸出,將和持續(xù)時(shí)間共同決定index[3..0]輸入的值,共13個(gè),然后這13個(gè)值會(huì)確定下一個(gè)數(shù)控分頻模塊的分頻預(yù)置數(shù)</p><p> Cnt:計(jì)數(shù)器的輸出,隨著計(jì)數(shù)器按4Hz的時(shí)鐘頻率作加法計(jì)數(shù),即隨地址遞增時(shí),將從LPM-ROM塊中的mif音符數(shù)據(jù)中連續(xù)取出音符輸向分頻預(yù)置數(shù)。</p><p> (
34、2) I/O引腳的名稱、 作用及其測試波形的描述;</p><p> 此為input管腳:</p><p> Clk1:接受12MHz時(shí)鐘頻率,控制著數(shù)控分頻器的節(jié)奏,測試波形頻率太高已經(jīng)密集成一條黑條</p><p> Clk:接受4HZ時(shí)鐘頻率,控制著計(jì)數(shù)器的節(jié)奏,測試波形周期即0.25秒</p><p> 此為output管腳:
35、</p><p> 由于時(shí)序仿真時(shí)受12位預(yù)置數(shù)及普通計(jì)算機(jī)性能的限制仿真時(shí)間極長數(shù)值僅做參考實(shí)際結(jié)果請參考本程序的硬件仿真結(jié)果。</p><p> Code:演奏發(fā)音相對應(yīng)的簡譜碼</p><p> High:高八度音指示</p><p> Spks:發(fā)音輸出即不同預(yù)置數(shù)情況下數(shù)控分頻的不同結(jié)果</p>&l
36、t;p> 采用的FPGA器件的型號(hào)</p><p> 片內(nèi)各種資源的使用情況</p><p> 時(shí)序仿真前的資源的使用情況:</p><p> 時(shí)序仿真后的資源的使用情況:</p><p><b> 4 結(jié)論 </b></p><p> 最后向目標(biāo)芯片下載適配后的SOF邏輯設(shè)計(jì)
37、文件,蜂鳴器即發(fā)出聲音,演奏出“梁?!睒非?。本文介紹了基于FPGA的音樂硬件演奏電路的設(shè)計(jì),實(shí)現(xiàn)了一個(gè)樂曲播放器,而且描述了其工作原理、設(shè)計(jì)思路及實(shí)現(xiàn)方法,并在用目標(biāo)芯片仿真實(shí)現(xiàn)了音樂硬件演奏電路的功能。這種基于FPGA的音樂硬件演奏電路的設(shè)計(jì)與實(shí)現(xiàn),不僅通過VHDL層次化和模塊化設(shè)計(jì)方法,同時(shí)采用數(shù)控分頻和定制LPM-ROM的設(shè)計(jì)思想通過本次實(shí)驗(yàn),讓我進(jìn)一步了解了數(shù)控分頻器的工作原理和功能作用,并學(xué)會(huì)了利用LPM模塊制作ROM文件的方
38、法,也更深一層地懂得了頂層文件通過例化語句與其他模塊結(jié)合的好處我想我對EDA的學(xué)習(xí)只能算是個(gè)入門,這個(gè)領(lǐng)域的發(fā)展空間非常大,應(yīng)用范圍也非常廣泛,而且我相信在將來還會(huì)有更加廣闊的應(yīng)用前景。因此在以后的學(xué)習(xí)過程中,我不能因?yàn)檎n程學(xué)習(xí)的結(jié)束而結(jié)束了我對這個(gè)方面的學(xué)習(xí)甚至這個(gè)領(lǐng)域的探索,相反我會(huì)更加努力的去學(xué)習(xí)它。感謝蔣俊華老師兢兢業(yè)業(yè)的教導(dǎo),讓我不僅學(xué)到了知識(shí),也學(xué)到了做人做事的一些道理,為我提供了很多幫助。在接下來的學(xué)習(xí)中,我會(huì)繼續(xù)努力,努
39、力扎實(shí)地學(xué)習(xí)專業(yè)知識(shí),為以后打好鋪墊,奠定基礎(chǔ)。</p><p> 5 附錄 (程序代碼)</p><p> module cnt138t(clk,cnt);//計(jì)數(shù)器模塊代碼</p><p> input clk;</p><p> output [7:0]cnt;</p><p> reg [7:0]cn
40、t;</p><p> always @ (posedge clk) </p><p><b> begin</b></p><p> if(cnt==8'b10001010) cnt<=8'b00000000;</p><p> else cnt<=cnt+1;</p>
41、<p><b> end </b></p><p> endmodule </p><p> module tonetaba(index,code,high,tone);//譯碼模塊的代碼</p><p> input [3:0]index;</p><p> output [3:0]code;
42、</p><p> output [10:0]tone;</p><p> output high;</p><p> reg [3:0]code;</p><p> reg [10:0]tone;</p><p><b> reg high;</b></p><p&
43、gt; always @ (index) </p><p><b> begin </b></p><p> case(index) </p><p> 4'b0000: begin tone<=11'b11111111111; code<=4'b0000; high<=1'b0; en
44、d</p><p> 4'b0001: begin tone<=11'b01100000101; code<=4'b0001; high<=1'b0; end</p><p> 4'b0010: begin tone<=11'b01110010000; code<=4'b0010; high<=
45、1'b0; end</p><p> 4'b0011: begin tone<=11'b10000001100; code<=4'b0011; high<=1'b0; end</p><p> 4'b0101: begin tone<=11'b10010101101; code<=4'b010
46、1; high<=1'b0; end</p><p> 4'b0110: begin tone<=11'b10100001010; code<=4'b0110; high<=1'b0; end</p><p> 4'b0111: begin tone<=11'b10101011100; code<
47、;=4'b0111; high<=1'b0; end</p><p> 4'b1000: begin tone<=11'b10110000010; code<=4'b0001; high<=1'b1; end</p><p> 4'b1001: begin tone<=11'b10111001
48、000; code<=4'b0010; high<=1'b1; end</p><p> 4'b1010: begin tone<=11'b11000000110; code<=4'b0011; high<=1'b1; end</p><p> 4'b1100: begin tone<=11
49、39;b11001010110; code<=4'b0101; high<=1'b1; end</p><p> 4'b1101: begin tone<=11'b11010000100; code<=4'b0110; high<=1'b1; end</p><p> 4'b1111: begin t
50、one<=11'b11011000000; code<=4'b0001; high<=1'b1; end</p><p> default: begin tone<=11'bx; code<=4'bx; high<=1'bx; end</p><p><b> endcase</b>
51、;</p><p><b> end</b></p><p> endmodule </p><p> module speakera(clk1,tone,spks);//數(shù)控分頻器的代碼</p><p> input clk1;</p><p> input [10:0]tone;&l
52、t;/p><p> output spks;</p><p><b> reg spks;</b></p><p> reg preclk;</p><p> reg fullspks;</p><p> reg [3:0]count4;</p><p> reg
53、[10:0]count11;</p><p> always @ (posedge clk1)</p><p><b> begin </b></p><p> if(count4==4'b1000) begin preclk=1'b1; count4=4'b0000; end </p><p
54、> else begin count4=count4+1;preclk=1'b0; end</p><p><b> end </b></p><p> always @ (posedge preclk) </p><p><b> begin</b></p><p> if
55、 (count11==11'b00000100000) begin count11=tone; fullspks=1'b1; end</p><p> else begin count11=count11+1;fullspks=1'b0; end</p><p><b> end </b></p><p> al
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于fpga的樂曲演奏電路設(shè)計(jì)
- vhdl課程設(shè)計(jì)---樂曲演奏電路設(shè)計(jì)
- eda課程設(shè)計(jì)--樂曲硬件演奏電路設(shè)計(jì)
- 樂曲演奏課程設(shè)計(jì)報(bào)告---樂曲演奏電路的設(shè)計(jì)
- 樂曲硬件演奏電路設(shè)計(jì)
- 基于eda技術(shù)的樂曲演奏電路設(shè)計(jì)
- 基于verilog hdl的樂曲演奏電路設(shè)計(jì)
- eda課程設(shè)計(jì)---樂曲硬件演奏電路
- eda樂曲硬件演奏電路設(shè)計(jì)
- eda樂曲硬件演奏電路設(shè)計(jì)
- eda課程設(shè)計(jì)---樂曲硬件演奏電路的vhdl設(shè)計(jì)
- 樂曲硬件演奏電路的vhdl設(shè)計(jì) eda課程設(shè)計(jì)
- 基于fpga音樂硬件演奏電路設(shè)計(jì)
- fpga課程設(shè)計(jì)源碼-時(shí)鐘-樂曲-函數(shù)信號(hào)電路
- eda_電子琴課程設(shè)計(jì)--樂曲演奏電路的設(shè)計(jì)
- fpga課程設(shè)計(jì)--vga圖像顯示控制電路設(shè)計(jì)
- 音樂樂曲演奏程序課程設(shè)計(jì)報(bào)告
- 計(jì)算機(jī)課程設(shè)計(jì)報(bào)告--基于fpga的漏磁檢測電路設(shè)計(jì)
- 基于FPGA的樂曲硬件演奏系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn).pdf
- 樂曲演奏電路
評論
0/150
提交評論