Verilog多首乐曲选择演奏电路设计.docx

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Verilog多首乐曲选择演奏电路设计

基于verilog硬件乐曲演奏电路设计(quartus II) 模块可以实现4x4键盘扫描按键播放音乐,ROM中存四首歌曲,可以通过选择播放。 一、设计任务与要求 设计目的 :利用数控分频器设计硬件演奏电路。 设计内容 :学习课本定制音符数据ROM“music”。填入新的乐曲。争取可以在一个ROM装上多首歌曲,可手动或自动选择歌曲。 设计要求 :用仿真波形和电路原理图,详细叙述硬件电子琴的工作原理及其verilog文件中相关语句功能,叙述硬件实现情况。 二、总体框图 ROM“music” 音符控制输出 数控分频器 音符译码 七段数码管 分频器 蜂鸣器 LED灯 ROM中的音乐数据文件刚可由编辑好的音符填入MIF文件中再定制LPM_ROM将音符数据加载入ROM中,并设计程序在运行时自动读取ROM中的文件并置入数控分频器中。 当采用四四拍曲子时,每节拍持续时间为0.5秒。置入数控分频器的速度也应与此同步或一致,避免音乐过快或过快慢而失真。 我给出的C调音阶频率表,各频率对应的预置数就与数控分频推动蜂鸣器发出声音的频率对应。在编写数控分频器时,不仅要考虑预置数的输入方式,还要考虑输入的速度,以及驱动蜂鸣器发声的频率。 为了在扩展能够在ROM中同时存放多首歌曲,并可以手动选择需要的歌曲,故可将ROM中分若干段存放不同曲子。当手动选择歌曲时,可根据输入的选择信号,读出ROM中对应地址的曲子,并将ROM中的曲子完整的播放出来。 为了显示高、中、低三种音调,可在音符预置数的译码过程中,同时译出高、中、低三种音阶的信号,并利用三个LED灯输出信号。同时,也可利用该译码模块,将当前演奏的音符简谱表达出来。 下面给出C调音节频率表: 音阶频率Hz音阶频率Hz音阶频率Hz1661.227830.617415.311479.986739.9963701318.525659.335329.631174.664587.334293.671108.733554.373277.19987.762493.882246.9488014401220三、功能模块 3.1 音符数据地址发生器模块CNT138T 模块CNT138T是一个10位二进制计数器,内部计数最大值为500,作为音乐ROM地址发生器。这个计数器的计数频率即为4HZ,即每一个数值停留时间为0.25秒 。可以通过选则en的值 00 01 10 11,选择不同的歌曲。 module CNT138T (clk,cnt,en); input clk; input [1:0] en; output [9:0] cnt; reg [9:0] cnt; always @(posedge clk ) begin case(en) 0:begin if(cnt=138) cnt=cnt+1; else cnt=0;end 1:begin if(cnt=139cnt=263) cnt=cnt+1; else cnt=139;end 2:begin if(cnt=263cnt=335) cnt=cnt+1; else cnt=263;end 3:begin if(cnt=335cnt=439) cnt=cnt+1; else cnt=335;end endcase end endmodule 模块图: 仿真图: 3.2 分频预置查表模块F_CODE 模块F_CODE 乐曲简谱码对应的分频预置数查表为SPKER提供所发音符的分频预置数,分频分频预置数共14个,每一个音符的停留时间由音乐节拍和音调发生查表模块MUSIC中简码和时钟inclock的频率决定,为4hz即0.25s一个上升沿到来就传送一次数据。 程序: module f_code (inx,code,h,to); input [3:0] inx; output h; output [3:0] code; output [10:0] to; reg[10:0] to; reg[3:0] code; reg h; always @(inx) begin case (inx) 0:begin to =11H7FF; code=0;h=0;end 1:begin to =11H305; code=1;h=0;end 2:begin to =11H390; code=2;h=0;end 3:begin to =11H40C; code=3;h=0;end 4:begin to =11H45C; code=4;h=0;end 5:begin to =11H4AD; cod

文档评论(0)

shenlan118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档