1. 程式人生 > >FPGA學習之蜂鳴器演奏樂曲

FPGA學習之蜂鳴器演奏樂曲

div 二分 sign times 實驗目的 arch 學習 ilo 頻率

參考鏈接:http://www.cnblogs.com/kongtiao/archive/2011/07/20/2111581.html

一、實驗目的:學習驅動FPGA之IO引腳來控制蜂鳴器演奏音樂。
二、實驗環境:FPGA開發板AX301,Quartus ii
三、實驗介紹:

我們都知道,樂曲由音調和音長組成,只要將音調和音長控制好就能演奏出動聽的樂曲。下面將用Verilog HDL 硬件描述語言完成樂曲演奏的設計。

1、音調的控制

  頻率的高低決定了音調的高低。圖1.1是音調和音律之間的關系。

技術分享

                      圖1.1 音調和音律之間的關系

  所有不同頻率的信號都是從同一個基準頻率分頻得來的。由於音階頻率多為非整數,而分頻系數又不能為小數,故必須將計算得到的分頻數四舍五入取整。若基準頻率過低,則由於分頻比太小,四舍五入取證後的誤差較大。若基準頻率過高,雖然誤差變小,但分頻數將變大。實際的設計應綜合考慮兩方面的因素,在盡量減小頻率誤差的前提下去合適的基準頻率。

  本例中需要演奏的是梁祝,該樂曲各音階頻率及相應的分頻比如圖1.2所示。

技術分享

                      圖1.2 樂曲各音階頻率及相應的分頻比

  在表中除了給出分頻比外,還給出了對應與各個音階頻率時計數器不同的預置數。對於不同的分頻系數,只要加載不同的預置數即可。采用加載預置數實現分頻的方法比采用反饋復零法節省資源,實現起來更容易。

2、音長的控制


  音符的持續時間須根據樂曲的速度及每個音符的節拍數來確定。
  本實驗中演奏梁祝片斷,最短的音符為四分音符。


3、樂曲演奏電路的原理框圖

技術分享

                 圖1.3 樂曲演奏電路的原理框圖 

  其中,樂譜產生電路用來控制音樂的音調和音長。控制音調通過設置計數器的預置數來實現,預置不同的數值可以使計數器產生不同頻率的信號,從而產生不同的音調。控制音長是通過控制計數器預置數停留時間來實現,每個音符的演奏時間是0.25S的整數倍,對於節拍較長的音符,如二分音符。在記譜時將分別連續記錄兩次即可。

4、實驗實現:

  詳細實現步驟請參考 【連載】 FPGA Verilog HDL 系列實例--------8-3編碼器

(1)在設計文件中輸入Verilog代碼。

技術分享
  1 //--------------------------------------------------------------------------------------------------
2 //
3 // Title : play
4 // Author : wangliang
5 //
6 //-------------------------------------------------------------------------------------------------
7 //-------------------------------------------------------------------------------------------------
8 //
9 // Description :
10 //
11 //-------------------------------------------------------------------------------------------------
12 `timescale 1 ns / 1 ps
13
14 module play ( audio , sys_CLK , button);
15
16 output audio;
17 input sys_CLK;
18 input button;
19
20 reg [23:0] counter4Hz,
21 counter6MHz;
22 reg [13:0] count,origin;
23 reg audiof;
24
25 reg clk_6MHz,
26 clk_4Hz;
27
28 reg [4:0] j;
29 reg [7:0] len;
30
31
32 assign audio= button? audiof : 1‘b1 ; //控制開關
33
34 always @(posedge sys_CLK) //6MHz分頻
35 begin
36 if(counter6MHz==4)
37 begin
38 counter6MHz=0;
39 clk_6MHz=~clk_6MHz;
40 end
41 else
42 begin
43 counter6MHz=counter6MHz+1;
44 end
45 end
46
47 always @(posedge sys_CLK) //4Hz分頻
48 begin
49 if(counter4Hz==6250000)
50 begin
51 counter4Hz=0;
52 clk_4Hz=~clk_4Hz;
53 end
54 else
55 begin
56 counter4Hz=counter4Hz+1;
57 end
58 end
59
60
61 always @(posedge clk_6MHz)
62 begin
63 if(count==16383)
64 begin
65 count=origin;
66 audiof=~audiof;
67 end
68 else
69 count=count+1;
70 end
71
72
73 always @(posedge clk_4Hz)
74 begin
75 case(j)
76 ‘d1:origin=‘d4916; //low
77 ‘d2:origin=‘d6168;
78 ‘d3:origin=‘d7281;
79 ‘d4:origin=‘d7791;
80 ‘d5:origin=‘d8730;
81 ‘d6:origin=‘d9565;
82 ‘d7:origin=‘d10310;
83 ‘d8:origin=‘d010647; //middle
84 ‘d9:origin=‘d011272;
85 ‘d10:origin=‘d011831;
86 ‘d11:origin=‘d012087;
87 ‘d12:origin=‘d012556;
88 ‘d13:origin=‘d012974;
89 ‘d14:origin=‘d013346;
90 ‘d15:origin=‘d13516; //high
91 ‘d16:origin=‘d13829;
92 ‘d17:origin=‘d14108;
93 ‘d18:origin=‘d11535;
94 ‘d19:origin=‘d14470;
95 ‘d20:origin=‘d14678;
96 ‘d21:origin=‘d14864;
97 default:origin=‘d011111;
98 endcase
99 end
100
101 always @(posedge clk_4Hz) //樂譜
102 begin
103 if(len==63)
104 len=0;
105 else
106 len=len+1;
107 case(len)
108 0:j=3;
109 1:j=3;
110 2:j=3;
111 3:j=3;
112 4:j=5;
113 5:j=5;
114 6:j=5;
115 7:j=6;
116 8:j=8;
117 9:j=8;
118 10:j=8;
119 11:j=6;
120 12:j=6;
121 13:j=6;
122 14:j=6;
123 15:j=12;
124 16:j=12;
125 17:j=12;
126 18:j=15;
127 19:j=15;
128 20:j=15;
129 21:j=15;
130 22:j=15;
131 23:j=9;
132 24:j=9;
133 25:j=9;
134 26:j=9;
135 27:j=9;
136 28:j=9;
137 29:j=9;
138 30:j=9;
139 31:j=9;
140 32:j=9;
141 33:j=9;
142 34:j=10;
143 35:j=7;
144 36:j=7;
145 37:j=6;
146 38:j=6;
147 39:j=5;
148 40:j=5;
149 41:j=5;
150 42:j=6;
151 43:j=8;
152 44:j=8;
153 45:j=9;
154 46:j=9;
155 47:j=3;
156 48:j=3;
157 49:j=8;
158 50:j=8;
159 51:j=8;
160 52:j=5;
161 53:j=5;
162 54:j=8;
163 55:j=5;
164 56:j=5;
165 57:j=5;
166 58:j=5;
167 59:j=5;
168 60:j=5;
169 61:j=5;
170 62:j=5;
171 63:j=5;
172 endcase
173
174 end
175 endmodule
技術分享

(2)由設計文件生成的.bsf文件,樂曲演奏的外接接口如圖1.4所示。

技術分享

       圖1.4 樂曲演奏的外接接口

(3)分配引腳:

  將sys_CLK信號接時鐘,button接按鍵,audio接蜂鳴器,這裏就不貼出具體的引腳圖了,大家可以根據自己的開發板對應起來。

(4)實驗結果:

  當打開按鍵時,就能聽到完整的梁祝樂曲了。但是總感覺音樂有點變味了,不知道是蜂鳴器的原因還是程序的bug!

FPGA學習之蜂鳴器演奏樂曲