Verilog音乐播放器
- 格式:docx
- 大小:78.87 KB
- 文档页数:9
基于FPGA红外遥控乐曲播放器设计作者:赖义汉卢彬锋王宇松来源:《赤峰学院学报·自然科学版》2019年第02期摘要:本文介绍了乐曲播放的基本原理及基于FPGA芯片乐曲播放器系统的组成,分析了红外遥控器的工作原理及红外遥控接收解码器、按键消抖的有限状态机设计方法,系统以FPGA内部嵌入式存储块作为乐曲存储器,能够动态显示乐曲的音符,通过SignalTap II逻辑分析仪进行在线仿真和硬件测试,系统控制稳定,音质效果好,外围电路简单.关键词:FPGA;红外遥控;乐曲;播放器中图分类号:TN912.2; 文献标识码:A; 文章编号:1673-260X(2019)02-0068-041 引言传统的音乐播放器主要以单片机为主控制芯片[1-2],由芯片中的定时器来产生乐曲的音调及音调的持续时间,从而实现乐曲的连续演奏.由于单片机运行速度及内部存储容量有限,其音调频率的精度及乐曲的存储数量会受到一定的限制[3].而FPGA芯片内部含有丰富的逻辑阵列、嵌入式存储器块、PLL锁相环等硬件资源,以FPGA芯片为控制芯片,以Verilog硬件描述语言来设计乐曲的播放器,具有低功耗、外围电路简单,速度快、功能可扩展等特点.乐曲播放器具有上一首、下一首、播放/暂停、自动/手动和红外遥控等多种控制模式,能够动态显示音符等功能.2 系统总体结构系统主要由FPGA核心模块及系统时钟、按键模块、红外一体接收电路,音乐放大电路等外围电路组成.系统总体框图如图1所示.其中系统时钟频率为50MHz, FPGA采用Altera公司的Cyclone IV系列的EP4C4E10F174CN芯片,FPGA核心模块包含按键消抖模块、分频器模块、乐曲播放模块、乐谱存储及动态音符驱动模块等.3 系统各模块的FPGA实现3.1 乐曲演奏的基本原理声音的频谱范围为20Hz~20KHz范围,乐曲主要由音调(音符的频率值)和音长(持续时间)两个基本数据组成,即只要控制输出信号的频率高低及持续的时间就可以使扬声器发出连续的乐曲声.根据音乐的十二平均率規定[4]:每两个八度之间的频率相差一倍,在两个八度音之间,又可分为12个半音,每两个半音的频率比为■,如音名A(简谱中的低音6)的频率为440Hz,音名B到C之间、E到F之间为半音,其余为全音,由此可以计算出简谱中从低音1到高音7之间每个音名对应的频率,乐曲就是由一连串的音符组成的,按照乐曲的乐谱依次输出这些音符所对应音调的频率,就可以在扬声器上连续发出各个音符的音调,因此,要演奏一首音乐,关键是控制乐曲中的音符的发生频率及乐曲的节拍的.由于每两个音的音频比值(高音比低音)正好是2或是2n,因此,对于所有八度关系的乐音除了音高上的差异外,本质上听起来不会任何区别.3.2 乐曲播放控制模块实现准确获取音符的发音频率及持续的时间是乐曲无失真演奏的重要因素,为产生乐谱中不同的音符的频率,系统采用预置数分频法对基准时钟信号进行分频,预置数不同,其计数值不同分频数也不同,就能得到不同的频率值.由于音阶频率多为非整数,分频后会存在或多或少的误差,一般采用四舍五入法.本设计以6MHz的时钟信号为基准频率,通过设置不同的初值使分频器产生各种音符频率.如要产生低音的“1”,则分频数为6MHz/216.6Hz≈22935.8,即分频数约为22936,为提高信号的驱动能力,使音调的频率输出占空比为50%,则分频数为22936/2=11468,其他音符以此类推,本设计以C调为例,各音阶频率、分频数、音符编码之间关系如表1所示.音长即音乐的节拍,也就是音调持续的时间,以2/4节拍为例,如果每个小节持续的时间为1s,则每拍的演奏时间为0.5s,为提高驱动能力及节拍精度,系统由占空比为50%的4Hz 的时钟来产生节拍信号,即每一个半节拍为0.25s.3.3 基准时钟的产生基准时钟是产生乐曲音调的基础,根据设计要求,需要得到音调所需的6MHz基准时钟和节拍所需的4Hz信号,为提高时钟的精度,采用FPGA内部集成的嵌入式锁相环PLL来实现,锁相环可以与输入的系统时钟信号同步,并以其作为参考信号实现锁相,从而可以输出一个或多个同步倍频或分频的片内时钟,得到高精度的频率,以供逻辑系统使用,与直接来自外部的时钟相比,这种片内时钟会减少时钟的延时和时钟信号的变形,减少干扰,能很好地保证系统稳定高速可靠工作.通过设置ALTPLL模块的分频数,由50MHz系统时钟得到6MHz和4MHz的频率,再由4MHz的频率再经过分频得到占空比为50%的4Hz的节拍时钟信号.从而保证基准时钟的稳定性和准确性.3.4 乐曲的定制及动态音符的显示为提高乐曲的直观性和可读性,乐曲中用变量q[11:0]表示音名,其中高4位q[11:8]表示高音的■:■,q[7:4]表示中音的1~7,q[3:0]表示低音的■:■,其编码方式如表1所示.通过定制FPGA中LPM- ROM存储音乐数据,通过改变ROM的地址就可以输出不同的音符编码,通过查表可得到不同的分频预置数,从而得到不同的音调频率,通过控制地址产生的频率就可以控制乐符输出的节拍,以纯硬件的方法来实现乐曲的演奏效果.若要实现其他乐曲的演奏,只要修改LPM-ROM所存储的音乐数据,再重新定制LPM-ROM,就可以实现其他乐曲的演奏.为使演奏能循环进,需另外设计置一节拍时长计数器,保证演奏完后又重新开始,或跳到下一首的乐曲的首地址.LPM-ROM中存储的是乐曲音符的编码,由3位的BCD码组成,分别表示不同音阶,系统采用3位数码管分别动态显示乐曲中的高中低音的音符,显示模块采用动态扫描方式,由8位的段码信号和3位的位码信号来驱动3位的共阴数码管,从而实现音符的动态显示.3.5 按键消抖模块键盘模块有四个按键:上一首(key_up)、下一首(key_down)、暂停/播放(key_pause);自动/手动(key_auto).由于机械按键存在抖动,为保证每按一次,产生一个负脉冲,执行一次操作,这里采用有限状态机分别对按键按下和释放进行消抖处理[5].其按键识别与消抖的状态转换图如图2所示.工作过程:初始状态为IDLE,当检测有下降沿时,进入STATE0状态,并通过一个计数器计时电平持续的时间.在按键按下时,计数器开始计数,并且每个周期判断该键是否为低电平,如果仍为低电平且计数器计数值达一定值(约10ms)后,则按键切换标志变量key_flag 产生一个高电平脉冲,按键状态变量key_state为低电平,进入稳定状态DOWN,若计数值未达到预定值,则为抖动重新返回IDLE状态;在DOWN状态时,如果检测到上升沿,则进入STATE1状态,启动计数器,并且每个周期判断该键是否仍为高电平,当高电平保持时间达10ms后,则按键切换标志变量key_flag产生一个高电平脉冲,按键状态变量key_state为高电平,一次完整的按键识别结束,重新回到IDLE状态,若计数值未达到预定值,则为抖动重新返回DOWN状态.如果满足(key_flag==1&&key_state==0)则按键按下有效,按键为低电平,如果(key_flag== 1&&key_state==1)则按键释放完成,按键为高电平.3.6 红外遥控系统接收电路及解码模块设计3.6.1 红外遥控接收电路红外遥控系统分为发射和接收两部分,红外发射部分主要由红外发光二极管、矩阵键盘、编码和调制电路等组成[6],红外接收部分采用Holtek公司的HT6221一体化红外接收头模块,该接收头集红外接收、放大、滤波和比较输出等模块功能,性能稳定可靠,其接口电路如图3所示,其中IR输出信号接FPGA的红外遥控解码模块.3.6.2 红外遥控解码模块设计HT6221红外遥控器是一款基于NEC红外通信协议的遥控编码芯片,其采用脉冲宽度编码(PPM)的编码格式,其数据帧格式由:引导码、8位地址码、8位地址反码、8位按键数据码、8位按键数据反码以及1位结束位组成[7],如图4所示.其中,引导码由9ms高电平和4.5ms的低电平组成,其代表一个数据的帧头.NEC协议采用脉冲之间不同时长的时间间隔来区分“0”和“1”编码.编码“0”是0.56ms高电平+0.56ms的低电平,編码“1”是0.56ms的高电平+1.69ms的低电平,以上分析的是遥控器发射端信号的编码方法,其接收端信号的编码方法与发射端的编码电平正好相反.通过上面的分析可知,能否正确接收一帧数据,其核心是识别9ms、4.5ms、0.56ms、1.69ms这四个关键时序信号,这里采用4个计数器分别对这四种时序信号进行计时,考虑信号传输时会有不同程度的误差,因此,计数值要有一定的范围.为准确读取遥控识别码,采用有限状态机来识别各种控制状态及数据的接收解码过程,状态转换图如图5所示,其中IDLE:空闲状态,等待红外一体化输出信号IR下降沿到来;LEADER_9:识别9ms的低电平引导码;LEADER_45:识别4.5ms的高电平引导码,若识别成功则进行读码状态,否则返回空闲状态.DATA_STATE:读码状态,连续读取32位的地址、数据信号,若读完或读取过程发生错误,返回空闲状态,重新识别.状态机的编码采用“0001、0010、0100、1000”的四位独热码编码方式,由于设计只需要得到遥控器8位的按键码值IR_db[7:0],因此,地址码及反码不输出.红外遥控解码模块接口功能如表2所示.4 系统仿真与测试系统顶层原理图如图6所示,由分频模块(pll6_4m)、按键消抖模块(key_filt)、音乐控制模块(music_control)、音曲存储模块(music_rom)、红外一体解码模块(IR)及乐曲显示驱动模块等组成,系统通过QuartusII软件进行综合并对部分模块进行仿真测试.首先对红外遥控模块进行编译及管脚分配,并在顶层中嵌入ISSP(In-System Sources and Probes Editor)模块,探测口与红外模块的IR_db[7:0]连接,并下载到FPGA开发板中,然后在QuartusII中调用ISSP,在红外遥控器中按下不同的功能键,观察prober探测端口采集的数据,如在遥控器中按下CH+(按键值为47H)和PLAY(按键值为43H)键,ISSP抓取的数据如图7所示,从图中看出其IR_db的数据值,与HT6221手册上的编码值相同[8].利用QuartusII集成的SignalTap II逻辑分析仪,对乐曲播放器电路的音符编码及音频等信号进行测试.SignalTap II提供了一个不使用外部I/O口引脚就能检测内部信号状态,SignalTapII采样时钟频率设为12.8KHz,采样深度为8K,保存SignalTap II设置后,编译并下载至FPGA开发板,启动SignalTap II逻辑分析仪,对LPM-ROM的地址信号addr、乐曲编码信号q 以及音频信号audio进行在线采集,采集信号如图8所示,从图中可以看出,地址信号addr发生变化,能够调用LPM-ROM中的音符编码,同时在audio端输出不同频率的方波,同时在开发板上的扬声器上也能听到优美准确的乐曲旋律,实现了预定的功能,达到设计要求.5 结束语乐曲播放系统采用单片的FPGA完成红外遥控按键码的识别、按键信号的采集及乐曲的存储及播放,能动态显示音符,经实际电路板测试音调准确,音质效果好,控制灵活,乐曲可根据用户需求随意变更或自行增加,具有功能扩展方便,且外围电路简单,稳定可靠等特点,可应用于车载MP3等场合.参考文献:〔1〕邱燕.基于51单片机音乐播放器的设计[J].通讯世界,2016(10):252-253.〔2〕何谐,唐大权,张淑廷等.一种基于51单片机的音乐播放器的设计[J].现代电子技术,2014,36(16):11-13.〔3〕刘垣,李外云,赵嘉怡.基于STC单片机WAVE音乐播放器的设计与实现[J].科技创新与应用,2015(34):50-51.〔4〕段耀勇,刘鹏,周瑞琪.中国传统数学与“十二平均率”的产生[J].赣南师范学院学报,2005(6):22-24.〔5〕于晶,杨晓慧,黄勇.基于FPGA的按键消抖电路设计方法的研究[J].电子设计工程,2011,19(22):1-3.〔6〕崔岩,吴国兴,顾媛媛,等.基于FPGA的红外遥控密码锁的设计[J].电子技术应用,2013,39(11):44-46.〔7〕常涛,雪琦.基于FPGA的红外遥控信号接收模块设计[J].电子元器件应用,2010,13(5):44-46.〔8〕袁玉卓,曾凯锋,梅雪松.FPGA自学笔记-设计与验证[M].北京航空航天大学出版社,2017.8.。
fpga音乐播放器课程设计一、课程目标知识目标:1. 让学生掌握FPGA基础知识,理解FPGA的内部结构和编程原理;2. 帮助学生了解音乐播放器的原理,掌握数字信号处理基础知识;3. 使学生能够运用Verilog或VHDL等硬件描述语言设计简单的FPGA音乐播放器。
技能目标:1. 培养学生动手实践能力,能够独立完成FPGA音乐播放器的设计、编程、调试与验证;2. 提高学生团队协作能力,能够在小组合作中发挥个人优势,共同完成项目任务;3. 培养学生解决问题和分析问题的能力,能够针对实际问题提出合理的解决方案。
情感态度价值观目标:1. 激发学生对电子设计和硬件编程的兴趣,培养良好的学习习惯;2. 培养学生勇于尝试、敢于创新的精神,增强自信心;3. 培养学生具备良好的沟通能力和团队协作精神,提高综合素质。
分析课程性质、学生特点和教学要求,本课程将目标分解为以下具体学习成果:1. 掌握FPGA基本原理,能够描述FPGA内部结构和编程方法;2. 学会使用硬件描述语言Verilog或VHDL编写简单的FPGA程序;3. 理解音乐播放器的基本原理,能够运用数字信号处理知识设计音乐播放器;4. 完成一个简易的FPGA音乐播放器设计项目,具备实际操作和调试能力;5. 在项目实践中,提高团队协作、沟通表达和问题解决能力。
二、教学内容1. FPGA基本原理及编程方法:包括FPGA内部结构、工作原理、硬件描述语言(Verilog/VHDL)基础、编程流程等;2. 数字信号处理基础知识:涉及采样定理、量化、编码、数字信号表示等基本概念;3. 音乐播放器原理:介绍音乐播放器的基本工作流程,包括音频信号的采集、处理、存储和播放;4. FPGA音乐播放器设计:结合教材章节内容,设计以下教学大纲:a. FPGA硬件设计:选用合适的FPGA开发板,了解硬件资源分配,设计FPGA硬件电路;b. 音频信号处理:学习音频信号的采样、量化、编码等处理方法,编写相应程序;c. 音乐播放器程序设计:运用Verilog或VHDL编写音乐播放器程序,实现音频信号播放功能;d. 系统调试与验证:对设计好的音乐播放器进行功能测试、性能优化和调试;5. 项目实践:根据教学进度,安排以下教学内容:a. 分组讨论:学生分组讨论设计方案,明确项目任务分工;b. 设计与编程:各组学生根据分工,完成FPGA音乐播放器的设计和编程;c. 调试与展示:学生调试音乐播放器,展示项目成果,分享设计经验;d. 评价与反馈:教师对各组项目成果进行评价,给予反馈和建议。
常州信息职业技术学院可编程逻辑器件开发应用综合项目设计报告2015 —2016 学年第二学期项目:音乐播放器的设计与实现班级:计应143学号:1408143321姓名:段新浩授课教师:聂章龙制定日期:2016年06月25日目录1 总体设计1.1主要实现的功能1.2功能框图2 软件设计2.1 主模块2.2 按键去抖动和分频模块2.3 音乐播放时间模块2.4 音乐显示时间模块3 程序测试4 结束语1 总体设计基于Verilog HDL的音乐播放器系统是以ALTERA公司的MAXⅡ系列芯片 EPM1270T144C5为主控单元,根据音乐发生的原理,将复杂可编程逻辑器件作为发生音乐的核心器件,用高速集成电路硬件描述语言Verilog HDL编程控制音乐发生的乐谱,配合周边硬件电路,由蜂鸣器发声器件发出音乐声,实验表明,采用该方法设计的音乐发生器成本低、修改方便。
1.1主要实现的功能①在4位动态数码管上显示音乐播放的时间;②在8*8点阵屏上显示相应歌曲的名字(汉语拼音或英文字母);③在1位静态数码管上显示高(H)、中(Z)、低(L)音调,并且利用8个小灯的亮灭来标识相应的音符(音符是几就亮第几盏小灯);④通过开始/暂停按键控制音乐的开始、暂停,通过乐曲选择按键控制音乐的选择;⑤选择时单个数码管上显示歌曲编号。
1.2功能框图实现音乐播放器的功能,其动能框图如图1—1所示:图1-1 音乐播放器功能框图2 软件设计2.1 主模块module music(clk,keyin,keyin1,buzzout,ledout,led,ldoa,ldob,seg,sl);input clk,keyin,keyin1;output buzzout;output[7:0] ledout,led,ldoa,ldob,seg,sl;wire[7:0] num;f_1M Q1(clk,clk0,sec); //按键去抖动和分频模块 key Q2(clk0,keyin,keyin1,key,key1); //按键取值模块music1 Q3(key,key1,clk,buzzout,ledout,led); //音乐程序模块dtled Q4(ldoa,ldob,clk,key1); //汉字显示模块music_time Q5(sec,key1,num); //音乐播放时间display Q6(clk,num,sl,seg); //音乐显示时间Endmodule目的:主模块的设计能够很清晰的理清各个模块之间的关系,很容易实现该功能的实现。
音乐播放器的Verilog代码module song( audio , clk , clr1);output audio;input clk; //我的开发板时钟频率为33.8688Mhzinput clr1;wire clr;assign clr=~clr1; //clr信号为高电平有效,但由于我按键复位是低电平有效,在这里我声明了一个反相器reg[1:0] n1;reg[23:0] n2;reg [13:0] count,origin;reg audiof;reg clk_6MHz,clk_4Hz;reg [4:0] j;reg [5:0] len;assign audio=audiof ; //控制开关always@(posedge clk or posedge clr)begin //6MHz分频if(clr) beginclk_6MHz<=0;n1<=0;endelse if(n1==6/2-1) begin//这个语句的分频频率为33.8688Mhz/6≈5.6MHz≈6MHzclk_6MHz<=~clk_6MHz;n1<=0;endelse n1<=n1+1;endalways@(posedge clk or posedge clr)begin //4Hz分频if(clr) beginclk_4Hz<=0;n2<=0;endelse if(n2==8467200/2-1) beginclk_4Hz<=~clk_4Hz;n2<=0;endelse n2<=n2+1;endalways @(posedge clk_6MHz or posedge clr) beginif(clr) begincount<=0;audiof<=0;endelse if(count==16383)begincount<=origin;audiof<=~audiof;endelsecount<=count+1;endalways @(posedge clk_4Hz or posedge clr ) beginif(clr) origin<=0;else begincase(j)5'd1:origin<=14'd4916; //low5'd2:origin<=14'd6168;5'd3:origin<=14'd7281;5'd4:origin<=14'd7791;5'd5:origin<=14'd8730;5'd6:origin<=14'd9565;5'd7:origin<=14'd10310;5'd8:origin<=14'd10647; //middle5'd9:origin<=14'd11272;5'd10:origin<=14'd11831;5'd11:origin<=14'd12087;5'd12:origin<=14'd12556;5'd13:origin<=14'd12974;5'd14:origin<=14'd13346;5'd15:origin<=14'd13516; //high5'd16:origin<=14'd13829;5'd17:origin<=14'd14108;5'd18:origin<=14'd14235;5'd19:origin<=14'd14470;5'd20:origin<=14'd14678;5'd21:origin<=14'd14864;default:origin<=14'd011111;endcaseendendalways@(posedge clk_4Hz or posedge clr) //乐谱beginif(clr) beginlen<=0;j<=0;endelse if(len==63)len<=0;else beginlen<=len+1;case(len)6'd0:j<=3;6'd1:j<=3;6'd2:j<=3;6'd3:j<=3;6'd4:j<=5;6'd5:j<=5;6'd6:j<=5;6'd7:j<=6;6'd8:j<=8;6'd9:j<=8;6'd10:j<=8;6'd11:j<=6;6'd12:j<=6;6'd13:j<=6;6'd14:j<=6;6'd15:j<=12;6'd16:j<=12;6'd17:j<=12;6'd18:j<=15;6'd19:j<=15;6'd20:j<=15;6'd21:j<=15;6'd22:j<=15;6'd23:j<=9;6'd24:j<=9;6'd25:j<=9;6'd26:j<=9;6'd27:j<=9;6'd28:j<=9;6'd29:j<=9;6'd30:j<=9;6'd31:j<=9;6'd32:j<=9;6'd33:j<=9;6'd34:j<=10;6'd35:j<=7;6'd36:j<=7;6'd37:j<=6;6'd38:j<=6;6'd39:j<=5;6'd40:j<=5;6'd41:j<=5;6'd42:j<=6;6'd43:j<=8;6'd44:j<=8;6'd45:j<=9;6'd46:j<=9;6'd47:j<=3;6'd48:j<=3;6'd49:j<=8;6'd50:j<=8;6'd51:j<=8;6'd52:j<=5;6'd53:j<=5;6'd54:j<=8;6'd55:j<=5;6'd56:j<=5;6'd57:j<=5;6'd58:j<=5;6'd59:j<=5;6'd60:j<=5;6'd61:j<=5;6'd62:j<=5;6'd63:j<=5;default:j<=1; endcaseendendendmodule。
基于FPGA的音乐播放器的设计作者:陈嘉来源:《中国新通信》 2018年第19期【摘要】本文主要从FPGA 概述角度出发,阐述了基于FPGA 音乐播放器电路设计原理,论述了基于FPGA 音乐播放器算法模块设计,最后对音乐播放器系统实现进行叙述,并从不同角度进行详细分析,从而为基于FPGA 的音乐音乐播放器设计研究提供参考。
【关键词】电路原理电子产品系统设计引言随着科学技术不断创新与发展,电子产品生命周期逐渐被缩短,大部分电子产品在半年内便会被新产品所替代,因此要进一步对电子产品开发周期实施缩短,由此便应用到可编程逻辑器件,不仅能够有效缩短产品开发周期,同时随着集成电路制作技术水平不断提升,可编程逻辑器件整体设计技术水平得到有效提升,从而应用到各类电子产品开发当中。
一、FPGA 概述分析FPGA 主要指一种现场可编程门阵列,其主要以CPLD、GAL、PLA 等编程器为基础,通过不断发展和创新产生,属于半定制电路之一,属于专用集成电路领域中的一种,其优势在于填补定制电路存在的缺陷,并且可以解决可编程器件门电路数有限问题。
在实际应用过程中,其主要利用逻辑单元陈列,其中包括内部连线、输入输出模块以及可配置逻辑模块CLB,通过小型查找表来实施组合逻辑,每一个D 触发器输入端都连接着查找表,然后利用触发器来实现I/O 和逻辑电路驱动,同时利用向内部静态储存单元在实现编程数据加载,从而最终实现整个FPGA 功能。
二、基于FPGA 音乐播放器电路设计原理作为一种基本逻辑器件,计数器应用比较广泛,尤其是在数字系统当中应用比较频繁,其主要应用功能是通过计算操作来发挥自身效果,其在应用过程中可以和定时、分频产生脉冲序列和节拍脉冲,分频器能够将频段不同的声音信号进行划分,同时单独将不同声音信号方法,然后将其输送到一定频段扬声器当中,并通过重放方式来实现播放目的,由此可见,播放电路基本原理主要是将声音信号进行单独方法,并通过放大方式来达到一定播放效果。
摘要根据国家发改委与专业教学委员会对教育机构的要求,为培养适应我国21世纪国民经济发展的电子设计人才;同时基于国家教委面向21世纪电工电子课程体系改革和电工电子工科教学基地建设两项教学改革研究成果。
要求高等本科在校学生能够自己动手完成简单的数字器件设计。
本次设计在自己手动焊接简易的PFGA板子上实现,并且在QusrtusII 9.0上利用VHDL设计数控分频器电路,利用数控分频原理设计音乐硬件演奏电路,并制定LPM-ROM 存储音乐数据,以“梁祝”乐曲为例,将音乐数据存储到LPM-ROM,就达到了已纯硬件的手段来实现乐曲演奏的效果,只要修改LPM-ROM所存储的音乐数据,将其转换为其他的音乐数据,再重新制定LPM-ROM,在连接到程序中就可以实现其他与取得演奏。
本次设计采用的FPGA主芯片位ALTERA公司的FLEX系列的EPF10K10LC84-4。
由于板子是自己手动在万用板上焊接的所以只焊接了必要的外设如蜂鸣器和LED。
关键词FPGA;音乐播放器;QuartusII;VHDL;目录摘要I第一章前言21.1关于EDA技术21.2 关于VHDL21.3 关于EDA工具31.4 有关本次课程设计3第二章设计实现42.1音乐演奏电路原理32.1.1音符频率的获得42.1.2乐曲节奏的控制错误!未定义书签。
2.1.3乐谱发生器错误!未定义书签。
2.1.4乐曲演奏电路原理框图错误!未定义书签。
2.2音乐硬件演奏电路的设计实现52.2.1各个模块的功能简介错误!未定义书签。
2.2.2music模块62.3地址发生器模块82.3.1地址发生器的VHDL设计82.3.2波形仿真92.4分频预置数模块92.4.1分频预置数模块的VHDL设计92.4.2波形仿真102.5十六进制模块错误!未定义书签。
12.5.1十六进制模块的VHDL设计错误!未定义书签。
12.5.2波形仿真错误!未定义书签。
12.6数控分频模块错误!未定义书签。
基于FPGA/CPLD的脉冲信号型乐曲播放器的设计摘要用纯硬件来完成乐曲演奏电路的逻辑非常复杂,仅凭传统的数字逻辑技术,即使最简单的电路也难以实现。
但是借助于功能强大的EDA工具和硬件描述语言,就可以轻松的实现设计。
本设计利用可编程逻辑器件设计一个控制器让不同频率的脉冲信号有序的输出并驱动扬声器发声,最终完成一首乐曲的演奏。
设计以《世上只有妈妈好》为例,分析了硬件电路发声的基本原理,探讨了可以实现设计的方案,利用VHDL语言在QuartusⅡ上编程设计了节拍发生器、分频器、顺序控制、音高控制等模块的功能。
最后,运用原理图编辑器调出已经设计好的各个模块,根据设计的要求进行连线、加输入输出脚,得到了总体设计的仿真实体。
并对总体设计进行了功能仿真和下载。
本设计完成了乐曲《世上只有妈妈好》的32个音符64个节拍的播放,每个节拍0.5秒,整曲播放时长为32秒。
基于FPGA,利用Quartus Ⅱ和VHDL语言完成的脉冲型乐曲播放器,其特点是设计简单、灵活、设计周期短;缺陷是实现播放的乐曲种类单一,播放时间长度较短,若想要实现较长的乐曲播放,则需要很长的源程序。
关键词:FPGA,EDA,VHDL,QuartusⅡ,乐曲播放器The design of the pulse-type music player based on FPGA / CPLDAbstractIt is very complex to complete the music playing logic circuit using pure hardware. Only depend on the traditional digital logic technology, it is difficult to achieve even the simple circuit. However, it is very ease to achieve by using the EDA tools and hardware description language. The design finished a controller that output a series of orderly pulse signal with different frequencies and driven speaker with, by using the programmable logic device ,and finally complete the concert of a music.The music <shi shang zhi you ma ma hao> was used as an example. The basic principal of the hardware circuit sing was analyzed. How could achieve the player’s faction was also discussed. Following functional module was designed in Quartus II by using VHDL language: pulse generator, frequencies divider, sequence control, pitch control and so on. Finally, simulate entity was build in the Block Editor of the Quartus II , using all of the module which has been designed and according to the design’s requirements to connect, and plus input and output pin. Following these, the player’s entity was simulated and downloaded. The <shi shang zhi you ma ma hao>’s note 32 of the 64 players beat was completed in this design. One beat was sat as 0.5 seconds long, and the whole song was played within 32 seconds。
基于FPGA的音乐播放器设计李富国;马鑫彤【摘要】主要从软件和硬件两个部分对基于FPGA的音乐播放器进行研究设计.硬件部分主要由音符数据地址发生器模块、预置数查表电路模块以及发声频率产生模块组成,软件部分利用Quartus II软件并结合EDA开发工具对各模块进行编译、逻辑综合,完成仿真测试工作.仿真测试结果表明:该音乐播放器能够完成乐曲演奏,各项性能满足设计要求.【期刊名称】《黑龙江科技信息》【年(卷),期】2018(000)036【总页数】2页(P59-60)【关键词】FPGA;音乐播放器;仿真测试【作者】李富国;马鑫彤【作者单位】长春大学机械与车辆工程学院,吉林长春 130022;长春理工大学电子信息工程学院,吉林长春 130022【正文语种】中文【中图分类】TN912.2进入21世纪,集成电路技术飞速发展,推动了FPGA的发展。
FPGA集成度高,编程灵活,能够适用于较大规模的电路设计中,同时其设计开发周期短,制造成本低,质量稳定,被广泛运用在产品生产中。
文章设计的基于FPGA的音乐播放器特点明显,抗干扰、音质好,小体积却可以实现相对更大的功率,满足了用户对不同使用环境的需要,在当下具有广阔的发展前景。
1 硬件电路发声原理1.1 音调的控制频率的高低决定了音调的高低,因此要想准确控制音调,只需要控制相应音调的频率即可。
而早在我国春秋时期,我们的老祖先便一直使用一种名为三分损益法的方法来确定管或弦的长度和发音高低之间的关系,此法又称十二不平均率。
而十二平均率正是从这里演变而来,它把一个音阶分为十二个相等的半音,使各相邻两律间的频率比都是相等的。
本设计正是依据此原理才能计算出每个音符的频率。
当有了这些具体频率的数值之后,我们只需要将其从基准频率中一次次分频即可得到该音符频率。
1.2 音长的控制音长即音符的持续时间,正如当我们演唱一首歌曲时,在一些需要抒情的地方一定会将整句话或者末尾的字的持续时间拉长,通过这种方法来渲染感情,而这其中的字或句持续时间的拉长就是一个典型的对音长的控制。
Verilog 音乐播放器1、音符对照表/link?url=Oax-aXOjWdo-tES0iGNkpxGpVP0OhEL-Xm42W IvqvUhQ6NNAs96MmOyANcHu6FzUhDCWZ1jyBtk2yDCxPSPID750t4zb3JR4Uq htWebECOS2、顶层结构3、代码3.1、顶层代码:module musicplayer_1 (clk,reset,Q);input clk;input reset;output Q;//----------------------------------------wire clk_MHz;wire clk_4Hz;wire [5:0]Index;//64ge yinfuwire [10:0]Tone;//2048//----------------------------------------clkMHz u1 (clk,reset,clk_MHz);//bao chi qian hou shun xu yi zhiclk4Hz u2 (clk,reset,clk_4Hz);notetab u3 (clk_4Hz,reset,Index);rom u4 (Index,clk,Tone);singout u5 (clk_MHz,reset,Tone,Q);endmodule3.2、U1代码module clkMHz (clk,reset,clk_MHz);//bao chi qian hou shun xu yi zhi input clk;input reset;output clk_MHz;//----------------------------------------------reg [5:0]Q1;reg clk_MHz_1;always @ (posedge clk or negedge reset)beginif (!reset) Q1<=6'd0;//Asy_rstelse if (Q1<6'd63) Q1<=Q1+1'b1;//0~63 64 circleelse Q1<=5'd0;end//------------------------------------------------------------------------ always @ (posedge clk or negedge reset)beginif (!reset) clk_MHz_1<=1'b1;//zhi ningelse if (Q1 == 6'd63) clk_MHz_1<=~clk_MHz_1;end//------------------------------------------------------------------------- assign clk_MHz=clk_MHz_1;endmodule3.3、U2代码module clk4Hz (clk,reset,clk_4Hz);input clk;input reset;output clk_4Hz;//--------------------------------------reg [21:0]Q2;reg clk_4Hz_1;always @ (posedge clk or negedge reset)beginif (!reset) Q2<=22'd0;//Asy_rstelse if (Q2<22'd2499999) Q2<=Q2+1'b1;//0~9999999 circleelse Q2<=22'd0;end//------------------------------------------------------------------------always @ (posedge clk or negedge reset)beginif (!reset) clk_4Hz_1<=1'b1;//zhi ningelse if (Q2 == 22'd2499999) clk_4Hz_1<=~clk_4Hz_1;end//-------------------------------------------------------------------------assign clk_4Hz=clk_4Hz_1;endmodule3.4、U3代码module notetab (clk_4Hz,reset,Index);input clk_4Hz;input reset;output [5:0]Index;//--------------------------------------------reg [5:0]W;always @ (posedge clk_4Hz or negedge reset)//sixteen circlebeginif (!reset) W<=6'd0;else if (W<6'd63) W<=W+1'b1;//[0-63] sum 64else W<=6'd0;endassign Index = W;endmodule3.5、U4代码(通过ROM自动生成,其中标红的部分需要根据自己的实际情况更改)// megafunction wizard: %ROM: 1-PORT%// GENERATION: STANDARD// VERSION: WM1.0// MODULE: altsyncram//============================================================ // File Name: rom.v// Megafunction Name(s):// altsyncram//// Simulation Library Files(s):// altera_mf//============================================================ // ************************************************************// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!//// 11.0 Build 208 07/03/2011 SP 1 SJ Web Edition// ************************************************************//Copyright (C) 1991-2011 Altera Corporation//Your use of Altera Corporation's design tools, logic functions//and other software and tools, and its AMPP partner logic//functions, and any output files from any of the foregoing//(including device programming or simulation files), and any//associated documentation or information are expressly subject//to the terms and conditions of the Altera Program License//Subscription Agreement, Altera MegaCore Function License//Agreement, or other applicable license agreement, including,//without limitation, that your use is for the sole purpose of//programming logic devices manufactured by Altera and sold by//Altera or its authorized distributors. Please refer to the//applicable agreement for further details.// synopsys translate_off`timescale 1 ps / 1 ps// synopsys translate_onmodule rom (Index,clk,Tone);input [5:0] Index;input clk;output [10:0] Tone;`ifndef ALTERA_RESERVED_QIS// synopsys translate_off`endiftri1 clk;`ifndef ALTERA_RESERVED_QIS// synopsys translate_on`endifwire [10:0] sub_wire0;wire [10:0] Tone = sub_wire0[10:0];altsyncram altsyncram_component (.address_a (Index),.clock0 (clk),.q_a (sub_wire0),.aclr0 (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),.clocken0 (1'b1),.clocken1 (1'b1),.clocken2 (1'b1),.clocken3 (1'b1),.data_a ({11{1'b1}}),.data_b (1'b1),.eccstatus (),.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 = "rom.mif",altsyncram_component.intended_device_family = "Cyclone II",altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO",altsyncram_component.lpm_type = "altsyncram",altsyncram_component.numwords_a = 64,altsyncram_component.operation_mode = "ROM",altsyncram_component.outdata_aclr_a = "NONE",altsyncram_component.outdata_reg_a = "CLOCK0",altsyncram_component.widthad_a = 6,altsyncram_component.width_a = 11,altsyncram_component.width_byteena_a = 1;endmodule//============================================================ // CNX file retrieval info//============================================================ // Retrieval info: PRIV ATE: ADDRESSSTALL_A NUMERIC "0"// Retrieval info: PRIV ATE: AclrAddr NUMERIC "0"// Retrieval info: PRIV ATE: AclrByte NUMERIC "0"// Retrieval info: PRIV ATE: AclrOutput NUMERIC "0"// Retrieval info: PRIV ATE: BYTE_ENABLE NUMERIC "0"// Retrieval info: PRIV ATE: BYTE_SIZE NUMERIC "8"// Retrieval info: PRIV ATE: BlankMemory NUMERIC "0"// Retrieval info: PRIV ATE: CLOCK_ENABLE_INPUT_A NUMERIC "0"// Retrieval info: PRIV ATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0"// Retrieval info: PRIV ATE: Clken NUMERIC "0"// Retrieval info: PRIV ATE: IMPLEMENT_IN_LES NUMERIC "0"// Retrieval info: PRIV ATE: INIT_FILE_LAYOUT STRING "PORT_A"// Retrieval info: PRIV ATE: INIT_TO_SIM_X NUMERIC "0"// Retrieval info: PRIV ATE: INTENDED_DEVICE_FAMILY STRING "Cyclone II" // Retrieval info: PRIV ATE: JTAG_ENABLED NUMERIC "0"// Retrieval info: PRIV ATE: JTAG_ID STRING "NONE"// Retrieval info: PRIV ATE: MAXIMUM_DEPTH NUMERIC "0"// Retrieval info: PRIV ATE: MIFfilename STRING "rom.mif"// Retrieval info: PRIV ATE: NUMWORDS_A NUMERIC "64"// Retrieval info: PRIV ATE: RAM_BLOCK_TYPE NUMERIC "0"// Retrieval info: PRIV ATE: RegAddr NUMERIC "1"// Retrieval info: PRIV ATE: RegOutput NUMERIC "1"// Retrieval info: PRIV ATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0"// Retrieval info: PRIV ATE: SingleClock NUMERIC "1"// Retrieval info: PRIV ATE: UseDQRAM NUMERIC "0"// Retrieval info: PRIV ATE: WidthAddr NUMERIC "6"// Retrieval info: PRIV ATE: WidthData NUMERIC "11"// Retrieval info: PRIV ATE: rden NUMERIC "0"// Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all// Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS"// Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_A STRING "BYPASS"// Retrieval info: CONSTANT: INIT_FILE STRING "rom.mif"// Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone II"// Retrieval info: CONSTANT: LPM_HINT STRING"ENABLE_RUNTIME_MOD=NO"// Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram"// Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "64"// Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM"// Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE"// Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0"// Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "6"// Retrieval info: CONSTANT: WIDTH_A NUMERIC "11"// Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1"// Retrieval info: USED_PORT: address 0 0 6 0 INPUT NODEFV AL "address[5..0]" // Retrieval info: USED_PORT: clock 0 0 0 0 INPUT VCC "clock"// Retrieval info: USED_PORT: q 0 0 11 0 OUTPUT NODEFV AL "q[10..0]"// Retrieval info: CONNECT: @address_a 0 0 6 0 address 0 0 6 0// Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0// Retrieval info: CONNECT: q 0 0 11 0 @q_a 0 0 11 0// Retrieval info: GEN_FILE: TYPE_NORMAL rom.v TRUE// Retrieval info: GEN_FILE: TYPE_NORMAL rom.inc FALSE// Retrieval info: GEN_FILE: TYPE_NORMAL rom.cmp FALSE// Retrieval info: GEN_FILE: TYPE_NORMAL rom.bsf FALSE// Retrieval info: GEN_FILE: TYPE_NORMAL rom_inst.v FALSE// Retrieval info: GEN_FILE: TYPE_NORMAL rom_bb.v TRUE// Retrieval info: LIB_FILE: altera_mf3.6、U5代码module singout (clk_MHz,reset,Tone,Q);input clk_MHz;input reset;input [10:0]Tone;output Q;//--------------------------------------reg [10:0]count;reg full;reg count2;always @ (posedge clk_MHz or negedge reset)beginif (!reset) count<=Tone; //fu chuzhielse if (count==11'b11111111111)begincount<=Tone; //centence not only one,must use "begin,end" cover itfull<=1'b1;endelse if (count<11'b11111111111)begincount<=count+1'b1;full<=1'b0;endendalways @ (posedge full or negedge reset) //only jun hen zhan kong bi,not change fen ping ratiobeginif (!reset) count2<=1'b0;else count2<=!count2;endassign Q=count2;endmodule4、Modelsim代码和波形图initialbeginclk=1;endalwaysbegin#1 clk=!clk;endinitialbeginreset=0;endalwaysbegin#2 reset=1;end。