Verilog音乐播放器

合集下载

基于FPGA红外遥控乐曲播放器设计

基于FPGA红外遥控乐曲播放器设计

基于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的音乐播放器的设计-毕业设计论文

基于FPGA的音乐播放器的设计-毕业设计论文
2 编写设计报告,要求包括方案选择,程序清单,调试过程,测试结果及心得.
第三章
3.1
为了便于理解,首先介绍一下硬件电路的发声原理.我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制 某个引脚输出一定频率的矩形波,接上扬声器就能发出相应频率的声音.而乐曲中的每一音符对应着一个确定的频率,因此,要想 发出不用音符的音调,实际上只要控制它输出相应音符的频率即可.乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调.而要准确地演奏出一首乐曲,仅仅让扬声器能够发声是不够的,还必须准确地控制乐曲的节奏,即每个音符的持续时间.由此可见,乐曲中每个音符的发音频率及其持续的时间是乐曲能够连续演奏的两个关键因素.
课程设计
课程名称:可编程数字片上系统实训
设计题目:基于FPGA的音乐播放器设计
院系:电气信息学院
指导教师:谷雷
专业:通信工程
学号:122700109
姓名:尚斌成
长春建筑学院
2015年12月31日
摘 要
在 开发环境下,采用 硬件描述语言设计了一个可以在 芯片上实现的音乐播放器.通过将音乐播放器电路设计进行模块化分解,层次化设计,分成几个单独的结构体,每个结构体实现部分功能,经顶层文件将各单独结构体进行综合,最后将设计代码结合 模块制作的 文件下载到 实验箱进行功能验证,实现乐曲播放.由于音乐播放器的通用性及 语言的可移植性, 因此本音乐播放器可直接应用于各种不同系列的 芯片的设计中.
而简易电子琴,工作原理与乐曲演奏一样,只是将固定预置乐曲变成了手动按键输入,节拍时间取决于按键的停留时间,如果合适,同样能播放出完整的歌曲来.
3.1.1
频率的高低决定了音调的高低.音乐的十二平均率规定:每两个八度音(如简谱中的中音1和高音1)之间的频率相差一倍.在两个八度音之间又分为十二个半音.另外,音名A(简谱中的低音6)的频率为440Hz,音名B到C之间、E到F之间为半音,其余为全音.由此可以计算出简谱中从低音1到高音1之间每个音名对应的频率,所有不同频率的信号都是从同一个基准频率分频得到的.由于音阶频率多为非整数,而分频系数又不能为小数,因此必须将计算得到的分频数四舍五入取整.若基准频率过低,则由于分频比太小,四舍五入取整后的误差较大,若基准频率过高,虽然误差较小,但分频数将变大.实际的设计应综合考虑这两方面的因素,在尽量减小频率误差的前提下取合适的基准频率.因此,要想 发出不同音符的音调,实际上只要控制它输出相应音符的频率即可.综合考虑各因素,本文中选取12MHZ作为CLK的分频计数器的输入分频信号.乐曲都是由一连串的音符组成,因此按照乐曲的乐谱依次输出这些音符所对应的频率,就可以在扬声器上连续地发出各个音符的音调.

fpga音乐播放器课程设计

fpga音乐播放器课程设计

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 HDL与CPLDFPGA项目开发教程 第3版-电子课件项目11 音乐播放器设计

Verilog HDL与CPLDFPGA项目开发教程 第3版-电子课件项目11 音乐播放器设计
always@(keyin) begin keyin_reg=keyin; case(keyin_reg) 8'b11111110:count_end=16'h5993; 8'b11111101:count_end=16'h4fd0; …… 8'b10111111:count_end=16'h2f74; 8'b01111111:count_end=16'h2cca; 8'b11111100:count_end=16'h27e7; 8'b11111010:count_end=16'h238d; …… 8'b10111110:count_end=16'h17ba; default:count_end=16'hffff; endcase end assign buzzout=buzzout_reg; assign ledout=keyin_reg;
if(count1<25'd3000000) count1=count1+1;
else begin count1=0; clk_4Hz=~clk_4Hz; end
end
//定义基准时钟输入 //定义声响输出口 //定义高、中、低音标志
//定义基准时钟分频寄存器 //定义音谱分频寄存器 //控制音谱播放顺序 //4Hz信号
if(counter==47) counter=0; else counter=counter+1; case(counter)
0:{high,med,low}=9'b000000011; 1:{high,med,low}=9'b000000011; 2:{high,med,low}=9'b000000011; 3:{high,med,low}=9'b000000011; 4:{high,med,low}=9'b000000101; 5:{high,med,low}=9'b000000101; 6:{high,med,low}=9'b000000101; 7:{high,med,low}=9'b000000110; …… endcase end assign buzzout=buzzout_reg; endmodule

音乐播放器的Verilog代码

音乐播放器的Verilog代码

音乐播放器的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的音乐播放器的设计

基于FPGA的音乐播放器的设计

基于FPGA的音乐播放器的设计作者:陈嘉来源:《中国新通信》 2018年第19期【摘要】本文主要从FPGA 概述角度出发,阐述了基于FPGA 音乐播放器电路设计原理,论述了基于FPGA 音乐播放器算法模块设计,最后对音乐播放器系统实现进行叙述,并从不同角度进行详细分析,从而为基于FPGA 的音乐音乐播放器设计研究提供参考。

【关键词】电路原理电子产品系统设计引言随着科学技术不断创新与发展,电子产品生命周期逐渐被缩短,大部分电子产品在半年内便会被新产品所替代,因此要进一步对电子产品开发周期实施缩短,由此便应用到可编程逻辑器件,不仅能够有效缩短产品开发周期,同时随着集成电路制作技术水平不断提升,可编程逻辑器件整体设计技术水平得到有效提升,从而应用到各类电子产品开发当中。

一、FPGA 概述分析FPGA 主要指一种现场可编程门阵列,其主要以CPLD、GAL、PLA 等编程器为基础,通过不断发展和创新产生,属于半定制电路之一,属于专用集成电路领域中的一种,其优势在于填补定制电路存在的缺陷,并且可以解决可编程器件门电路数有限问题。

在实际应用过程中,其主要利用逻辑单元陈列,其中包括内部连线、输入输出模块以及可配置逻辑模块CLB,通过小型查找表来实施组合逻辑,每一个D 触发器输入端都连接着查找表,然后利用触发器来实现I/O 和逻辑电路驱动,同时利用向内部静态储存单元在实现编程数据加载,从而最终实现整个FPGA 功能。

二、基于FPGA 音乐播放器电路设计原理作为一种基本逻辑器件,计数器应用比较广泛,尤其是在数字系统当中应用比较频繁,其主要应用功能是通过计算操作来发挥自身效果,其在应用过程中可以和定时、分频产生脉冲序列和节拍脉冲,分频器能够将频段不同的声音信号进行划分,同时单独将不同声音信号方法,然后将其输送到一定频段扬声器当中,并通过重放方式来实现播放目的,由此可见,播放电路基本原理主要是将声音信号进行单独方法,并通过放大方式来达到一定播放效果。

基于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数控分频模块错误!未定义书签。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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。

相关文档
最新文档