《eda课程设计-乐曲自动演奏机》由会员分享,可在线阅读,更多相关《eda课程设计-乐曲自动演奏机(18页珍藏版)》请在金锄头文库上搜索。
1、郑州航空工业管理学院EDA 技术及应用课程设计报告13 届 通信工程 专业 班级题目: 乐曲自动演奏机 姓名: 学号: 同组人: 指导老师: 2015 年 7 月 9 日乐曲自动演奏机一、设计要求:()可以在电路上自动演奏至少两首乐曲,在这里我们选用的是茉莉花、欢乐颂和小苹果。()有相应的 LED 灯指示高低音。二、其他要求:(在 EDA 实验箱上完成)1晶振为 48 MHz。2. 采用 FPGA 器件为 ALTERA 的 EP1C6Q240C8。3采用数码管显示。一、设计方案规划1、整体规划输入一个:clk(系统时钟 48MHz)输出四个:beep(蜂鸣器输出端)、led(LED 指示灯)、
2、dig(数码管选择输出引脚)、seg(数码管段输出引脚)2、功能模块与模块划分总共分为三部分,蜂鸣器发声部分,LED 灯显示部分,数码管显示部分。3、各功能或各模块的功能细分蜂鸣器自动演奏乐曲,LED 灯显示高低音,数码管显示音调。二、各模块的实现方法、技术、要点1、乐曲演奏的原理是:由于组成乐曲的每个音符的频率值(音调)及其持续(时间音长)是乐曲演奏的 2个基本数据,因此需控制输出到扬声器的激励信号的频率高低和该频率信号持续的时间。频率的高低决定了音调的高低,而乐曲的简谱与各音名的频率对应关系在后面将给出。所有不同频率的信号都是从一基准频率分频而得来的,由于音阶频率多为非整数,而分频系数有不
3、能为小数,故必须将计算得到的分频数进行四舍五入取整,基准频率和分频系数应综合考虑加以选择,从而保证音乐不会走调。如在48MHz 时钟下,中音 1(对应的频率值是 523.3Hz)的分频系数应该为:/(2*523.3)=45863,这样只需对系统时钟进行 45863次分频可得到所要的中音 M1(分频系数计算公式为 D=F/2K,由于 F/2K之后,会使分频系数 D变小,所以功能模块中语句:beep_r=!beep_r,使得输出取反,K=F/2count_end,消除了前面除以 2K的影响)。至于其他音符,同样可有一式求出对应的分频系数。在程序中设置一个状态机,每 250ms改变一个状态(即一个节
4、拍),组成乐曲的每个音符的频率值(音调)相对应于状态机的每一个状态。只要让状态机的状态按顺序转换,就可以自动演奏播放音乐了。(注:N 一拍;N 两拍;N四拍;N八拍;N 为音谱)。2、LED 灯接低电平显示灯亮,用 always模块定义前两个灯亮表示低音,中间四个灯亮表示中音,最后两个灯亮表示高音。3、数码管选用共阴极,只要公共端为低电平“0”,某个段输出高电平“1”,则相应的段就亮。三、设计电路图abfcgdep7om462105398DLE_SPRQNKCOMABFGInut/VTUYW四、设计步骤(1)在 Quartus中建立一个工程项目文件 song.qpf,并在该项目下新建 Veri
5、logHDL源程序文件 song.v输入程序代码保存。(2)然后在该工程选择一目标器件并对相应的引脚进行锁定,在这里所选择器件为 Alter公司的 Cyclone系列的 EP1C6Q240C8芯片,引脚锁定方式如下所示。引脚锁定方法引脚 引脚信号1C6 1C12 EDA 信号 1C6 1C12 EDAdig0 160 160 160 seg5 166 166 166dig1 159 159 159 Seg6 163 163 163dig2 162 162 162 seg7 164 164 164dig3 161 161 161 led0 50 50 50dig4 204 204 204 led
6、1 53 53 53dig5 199 199 199 led2 54 54 54dig6 198 198 198 led3 55 55 55dig7 205 205 205 led4 176 176 176seg0 169 169 169 led5 47 47 47seg1 170 170 170 led6 48 48 48seg2 167 167 167 led7 49 49 49seg3 168 168 168 clk 28 28 28seg4 165 165 165 beep 175 175 175(3)对该工程文件进行全程编译处理,若在编译中发现错误,则找出错误并更正,知道编译成功为止
7、。(4)最后编译并下载在试验箱上,此时可以看到乐曲自动演奏以及 LED 灯指示其高低音和数码管显示乐曲音调。五、乐曲简谱简谱中的音名与频率的关系音名 频率/Hz 音名 频率/Hz 音名 频率/Hz低音 261.6 中音 523.3 高音 1045.5低音 293.7 中音 587.3 高音 1174.7低音 329.6 中音 659.3 高音 1318.5低音 349.2 中音 698.5 高音 1396.9低音 392 中音 784 高音 1568低音 440 中音 880 高音 1760低音 493.9 中音 987.8 高音 1975.5六、模块的编写程序清单 song.vmodule
8、song(clk,beep,led,dig,seg; /模块名称 songinput clk; /系统时钟 48MHzoutput beep; /蜂鸣器输出端output7:0 dig; /数码管选择输出引脚output 7:0 seg; /数码管段输出引脚output 7:0 led; reg7:0 led_r; reg7:0 seg_r; /输出数码管译码结果 reg7:0 dig_r; /输出数码管选择reg3:0 disp_dat; /定义显示数据寄存器reg beep_r; /寄存器reg7:0 state; /乐谱状态机reg15:0count,count_end;reg23:0c
9、ount1;wire 31:0d;/乐谱参数:D=F/2K (D:参数,F:时钟频率,K:音高频率)parameter L_5 = 16d61224, /低音 5L_6 = 16d54545, /低音 6L_7 = 16d48593, /低音 7M_1 = 16d45863, /中音 1M_2 = 16d40865, /中音 2M_3 = 16d36402, /中音 3M_4 = 16d34359, /中音 4M_5 = 16d30612, /中音 5M_6 = 16d27273, /中音 6H_1 = 16d22956, /高音 1H_2 = 16d20431, /高音 2H_3 = 16d
10、18203; /高音 3 parameter TIME = ; /控制每一个音的长短(250ms)assign beep = beep_r; /输出音乐always(posedge clk)begincount = count + 1b1; /计数器加 1if(count = count_end)begincount = 16h0; /计数器清零beep_r = !beep_r; /输出取反endendalways (posedge clk)beginif(count1 TIME) /一个节拍 250mScount1 = count1 + 1b1;elsebegincount1 = 24d0;
11、if(state = 8d228)state = 8d0;elsestate = state + 1b1;case(state)8d0:count_end = M_3;8d1:count_end = M_2;8d2:count_end = M_3;8d3:count_end = M_5;8d4:count_end = M_6;8d5:count_end = M_5;8d6:count_end = H_1;8d7:count_end = M_6;8d8:count_end = M_5;8d9:count_end = M_3;8d10:count_end = M_5;8d11:count_end
12、= M_6;8d12:count_end = H_1;8d13:count_end = H_2;8d14:count_end = H_3;8d15:count_end = H_2;8d16:count_end = H_1;8d17:count_end = M_6;8d18:count_end = H_1;8d19:count_end = M_5;8d20:count_end = M_5;8d21:count_end = M_3;8d22:count_end = M_5;8d23:count_end = M_6;8d24:count_end = H_1;8d25:count_end = H_2;
13、8d26:count_end = H_3;8d27:count_end = H_1;8d28:count_end = M_6;8d29:count_end = M_5;8d30:count_end = M_5;8d31:count_end = M_2;8d32:count_end = M_3;8d33:count_end = M_5;8d34:count_end = M_3;8d35:count_end = M_2;8d36:count_end = M_1;8d37:count_end = M_6;8d38:count_end = M_1;8d39:count_end = M_1;8d40:c
14、ount_end = M_3;8d41:count_end = M_2;8d42:count_end = M_1;8d43:count_end = M_2;8d44:count_end = M_2;8d45:count_end = M_3;8d46:count_end = M_5;8d47:count_end = M_6;8d48:count_end = M_2;8d49:count_end = M_6;8d50:count_end = M_5;8d51:count_end = M_5;8d52:count_end = M_3;8d53:count_end = M_2;8d54:count_end = M_3;8d55:count_end = M_5;8d56:count_end = M_3;8d57:count_end = M_2;8d58:count_end = M_1;8d59:count_end = M_2;8d60:count_e