- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)