cpld的音乐播放器的设计内容摘要:
它通过记谱的方式来记录一段音乐,因此与 wave 音乐相比,它可以极大地减少存储容量。 MIDI 音乐的基本原理为:组成乐曲的每一个音符的频率值及其持续的时间是乐曲能连续演奏的两个基本数据,因此只要控制输出到扬声器的激励信号频率的高低和每一个频率信号的持续时间,就可以使扬声器发生连续的乐曲。 如图所示,为 CPLD 内部芯片设计原理图。 模块设计 音乐编码器模块设计 此模块包括节拍控制电路和音符产生电路。 节拍控制电路以乐曲中最短音符的节拍为基准,产生乐曲所需要的全部节拍。 在大部分音乐中,多以 1/4 为一拍,一拍 则为一秒,同时在乐谱中,一般最短的音符多为 1/16 音符,因此为了达到四首歌曲的统一,我们将 1/16 音符设置为计数器的一个计数,对应的 1/4 音符则是四个计数。 为了节省内部资源,我们 广西大学电气工程学院 EDA 课程设计 只演奏高潮部分。 这样的话,比如说《涛声依旧》为 4/4 拍的音乐,即一个小节有 4 拍,而高潮部分共有 8 个小节,所以在计数器的范围上我们设定为 0~127,即 128 位的计数器即可。 另外,在设计中为了让歌曲循环播放,计数器设定计满自动清零计数的功能,这样,只要不断电,不关开关,歌曲就可以自动循环播放了。 音符产生电路采用查找表形式 [12]。 在节 拍控制产生电路的接拍信号作用下,按乐曲中音符持续时间的长短输出相应音符名称。 具体歌曲的音符,只需要通过互联网查找后,将对应音符储存在内部即可。 音调发生模块设计 此模块包括预置数产生电路和频率发生器。 预置数产生电路设计采用查找表形式,按照音符的频率要求产生相应的预置数 [13]。 根据可变模值计数器的设计原理及音符的分频系数,可计算出乐曲中各音符的预置数,如表 所示。 表 音符的分频数和预置数 音名 分频系数 初始值 低音 5 5102 3089 低音 6 4545 3646 低音 7 4050 4141 中音 1 3822 4369 中音 2 3405 4786 中音 3 3034 5157 中音 4 2863 5328 中音 5 2551 5640 中音 6 2273 5918 中音 7 2025 6166 高音 1 1911 6280 高音 2 1703 6488 高音 3 1517 6674 高音 4 1432 6759 高音 5 1275 6816 休止符 0 0 8191 广西大学电气工程学院 EDA 课程设计 在音符的选择上,选择了最广泛应用的 16 个音。 若想编辑音域更广的音乐,则需要重新设定初始值。 频率发生器由可变模值计数器 实现。 由于系统要求产生出的信号频率较高,因此选用 2MHz高频脉冲作为可变模值计数器的技计数脉冲。 所以,上图所给出的分频系数是用分频后的 2MHz基础上计算得出的。 各音阶频率及相应的分频如表 所示。 表 音符与频率对照表 音名 频率 /Hz 分频系数 低音 5 5102 低音 6 440 4545 低音 7 4050 中音 1 3822 中音 2 3405 中音 3 3034 中音 4 2863 中音 5 783. 99 2551 中音 6 880 2273 中音 7 2025 高音 1 1911 高音 2 1703 高音 3 1517 高音 4 1432 高音 5 1275 休止符 0 8191 0 由于音阶频率多为非整数,而分频系数又不能为小数,故必须将得到的分频数四舍五入取整。 由于最大的分频系数为 5102,故采用 13位二进制计数器已能满足分频要求。 在表中可以看到不同音阶对应的不同初始值。 对于不同的分频系数,只要加载不同的 初始值即可。 采用加载初始值而不将分频输出译码反馈,可以有效地减少设计占用可编程逻辑器件的资源。 “ 0”表示休止符,在很多音乐中,休止符也是一个重要的音符。 对于休止符,只要将分频系数设为 0,扬声器就不会发声了。 广西大学电气工程学院 EDA 课程设计 顶层模块设计 顶层模块的设计可以采用原理图设计或者 VHDL设计,我们直接采用 VHDL语言进行顶层模块设计,将上述所提到的所有模块,利用 ponent 语句进行集合,然后利用管脚映射的方法,将所有输入输出连接在一起,这样就设计出了一个完整的 MIDI 音乐播放芯片,只需再连入外围电路即可进行演示。 时钟电 路 在本次设计中,除了要提供给 CPLD 的 4MHz 晶振时钟以外,还要产生 4Hz时钟接入音乐节奏时钟。 这两个时钟信号都是利用板载 50MHz晶振分频后提供的。 音乐节奏时钟 在上一章节中提到,我们以 1/16 音符为最小计数单元,而这个音符所占用的时间理论值为 ,所以我们在外部接入 4Hz的时钟信号给计数器,已满足正常的音乐播放要求。 音频功率放大电路 由 CPLD 芯片输出的音频信号很微弱,不能直接去驱动扬声器,因此需要一个音频放大电路对输出的音频信号进行放大,然后再去驱动扬声器。 我们采用由集成功率放大器 LM386 组成的音频功率放大器,如图 所示。 其中 C2 是交流耦合电容,将功率放大器的交流输出送到负载上,输出信号通过 Rw 接到 LM386的同相端。 C1 是退耦电容, R1C3 网络起到消除高频自激振荡作用。 歌曲选择 本次音乐播放器的设计在歌曲的选择上也至关重要。 由于现在 WAVE、 MP3格式音乐的广泛流行, MIDI 音乐听起来会稍显单调,有些歌曲在用 MIDI 放出广西大学电气工程学院 EDA 课程设计 来的时候,会有一些失真,而且没有 MP3 格式音乐那么流畅,因此在选歌上要慎重,所以尽量选择多一些歌曲,通过多次的调试,调试出最后放出来效果较好的音乐。 经过了 多次调试,最后确定了《美丽的神话》这首歌,这这首歌旋律明朗,耳熟能详,便于辨识。 而且我很喜欢。 芯片制作及系统调试 CPLD 程序下载 本次设计采用的是 Aletra 公司的 MAX II 系列,因此,必须用 Quartus II 软件系列才能对该芯片进行编译、仿真、下载等功能。 下载模式我们采用 JTAG 线的下载方式。 Altera 的 Quartus II 是业内领先的 FPGA/CPLD 设计软件,具有最全面的开发环境,实现无与伦比的性能表现。 本次设计采用 VHDL语言编程设计。 在 Quartus 软件中 VHDL文本输入中,输入所 有程序,并建立相应的工程项目,直接在该软件中进行编译及仿真,编译的同时,可以显示出当前芯片容量是否够用,如果不够用,则需要对程序进行进一步优化,直到容量达到芯片标准为止。 所有准备就绪后,则通过软件中的下载功能,通过 JTAG 端口,将程序下载到芯片中。 由于笔记本电脑只有通过 USB BLASTER 下载,而经过测试 WIN7 无法识别 USB BLASTER。 所以只有通过 XP 虚拟机来完成这一步,但是可以在 WIN7下进行仿真。 系统仿真 把程序下载到芯片内部后,将第四章所介绍的外围电路与 CPLD 连接后,形成整个系统。 而仿 真调试则主要针对音符预置数模块,扬声器发生及分频模块和音符储存模块进行调试。 由于我们这个程序的频率较大为 4MHz和 4Hz。 经过仿真发现由于周期太大仿真的显示结果效果不好。 4Hz情况下甚至无法正常仿真。 所以我们选择用一些较大的频率将我们实际的频率进行等比例的放大。 这样可以方便我们的计算与观察。 广西大学电气工程学院 EDA 课程设计 音符储存模块仿真 广西大学电气工程学院 EDA 课程设计 音符预置数模块仿真 广西大学电气工程学院 EDA 课程设计 分频器模块仿真 XP 虚拟机下程序下载成功图 顶层模块 RTL 图 结论 通过对芯片内部的编程设计,加上必要的 外围电路,构成了这个 MIDI 音乐播放器的系统,整体工作量适中。 在前人已有的音乐播放器的基础上,添加四首歌曲。cpld的音乐播放器的设计
相关推荐
aterial=Silicon =1 = 抽取参数 nxj= um n++ sheet rho= ohm/square n1dvt= V chan surf conc=+016 atoms/cm3 13 半个 NMOS 结构的镜像 前面构建了半个 NMOS 结构,要得到完整的结构,就需要在向器件仿真器输出结构或电极命名之前完成。 语句如下: structure mirror right 14保存
式进行组合: S=γ GSGk+ψ wγ wSwk+ψ Eγ ESEk 进行构件强度、连接件 和预埋件承载力计算时: 重力荷载:γ G: ; 风 荷 载:γ w: ; 地震作用:γ E: ; 进行位移及挠度计算时; 重力荷载:γ G: ; 风 荷 载:γ w: ; 地震作用:γ E: ; 上式中,风荷载的组合系数ψ w为 ; 地震作用的组合系数ψ E为 ; 四、立柱计算 { TC 四
,读写速度比 Yaffs 更快 ,并支持大容量的 NANDFlash 芯片。 Android 开发平台提供了大量的开源社区源码,给该平台下开发 Android 手机应用程序的开发人员提供许多帮助,而且 Google 公司还针对移动设备进行了优化。 这样极大方便了开发人员在手机上开 发的自由性,也为 3D 大型游戏的开发提供了坚实的基础,为 Android 手机未来的发展埋下了伏笔。
源 RNAs表达的影响。 7. 利用生物信息学方法对 Xoo侵染水稻获得的小 RNA 进行分类 , 预测小 RNA的靶基因 ; mRNA 表达谱分析。 8. 鉴定及获得带有乙烯耐受基因的抗性水稻株系;分析在阻断乙烯反应后对稻瘟病菌的抗病 变化。 鉴定及获得组成性乙烯反应的水稻材料株系;分析在组成性乙烯发育水稻株系中,具有抗性或是具有感病性水稻对病 原 菌侵染的反应及病斑程度。
||\n)。 printf([][]\n)。 printf(请选择服务 项目。 \n)。 flushall()。 scanf(%d,amp。 x)。 //菜单选择 if(headnext==NULLamp。 amp。 x!=1amp。 amp。 x!=6) { printf(系统中无入住信息,请先进行入房登记。 \n)。 goto A。 } switch(x) { case 1: