




已阅读5页,还剩18页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
乐曲硬件演奏电路设计一、设计任务与要求设计目的 :利用数控分频器设计硬件演奏电路。设计内容 :学习课本定制音符数据ROM“music”。填入新的乐曲。争取可以在一个ROM装上多首歌曲,可手动或自动选择歌曲。设计要求 :用仿真波形和电路原理图,详细叙述硬件电子琴的工作原理及其VHDL文件中相关语句功能,叙述硬件实现情况。二、总体框图 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三、功能模块-1、音乐数据ROM模块:该模块为音乐曲谱的存放文件。其利用LPM_ROM宏模块将共设定512个音符,每个音符宽度为5位,可存放高、中、低三阶21个音符的数据。文件名为music.mif.其中0.127存放第一首歌挥着翅膀的女孩, 127.255存放第二首歌菊花台,256.383存放第三首歌两只老虎384.512存放第四首歌世上只有妈妈好。在该数据中,每个字符持续时间为0.25秒(由音符控制输出模块的时钟源4HZ信号确定),故在根据乐谱中音符的实际持续时间进行编写。如四四拍的则每拍时间为0.5秒,则此处对应数据应该持续两个字符。MIF文件内容如下:WIDTH=5;DEPTH=512;ADDRESS_RADIX=UNS;DATA_RADIX=UNS;CONTENT BEGIN0.2: 10;3: 11;4.5: 12;6: 8;7: 9;8.10: 10;11 : 11;12.13: 12;14 : 9;15 : 10;16.18: 11;19 : 10;20.21: 8;22 : 11;23 : 10;24.25: 11;26 : 6;27 : 8;28.29: 9;30 : 8;31 : 9;32.34: 10;35 : 11;36.37: 12;38 : 13;39 : 14;40.41: 15;42 : 10;43 : 11;44.45: 12;46 : 9;47 : 10;48 : 11;49 : 10;50 : 11;51.53: 15;54 : 9;55 : 10;56 : 11;57 : 10;58 : 11;59.61: 16;62 : 15;63 : 14;64.66: 15;67 : 16;68 : 17;69 : 16;70 : 15;71 : 14;72.75: 15;76 : 14;77.78: 12;79 : 8;80.83: 13;84 : 12;85.86: 8;87 : 10;88.90: 9;91 : 10;92 : 11;93 : 12;94 : 15;95 : 14;96.98: 15;99 : 16;100: 17;101: 16;102: 15;103: 14;104.107: 15;108: 14;109.110: 12;111: 8;112.115: 13;116.117: 12;118: 15;119: 14;120.127: 15;0.2: 10;3: 9;4.5: 10;6.7: 0;8: 10;9: 12;10: 10;11: 9;12.15: 10;16.18: 8;19: 9;20: 10;21: 12;22.23: 10;24.26: 9;27: 8;28.31: 9;32.34: 10;35: 12;36: 13;37.39: 12;40: 13;41.42: 12;43: 10;44.46: 12;47: 5;48.49: 10;50.51: 9;52.53: 12;54: 10;55.58: 9;59: 8;60.63: 9;64.66: 10;67: 9;68.72: 10;73: 12;74: 10;75: 9;76.79: 10;80.82: 8;83: 9;84: 10;85: 12;86.87: 10;88.90: 9;91: 8;92.95: 9;96.98: 10;99: 12;100: 13;101.103: 12;104: 13;105.106: 12;107: 10;108.111: 12;112: 0;113: 10;114: 9;115: 10;116.117: 12;118: 10;119.120: 9;121.125: 8;126.127: 0;0.1: 8;2.3: 9;4.5: 10;6.9: 8;10.11: 9;12.13: 10;14.15: 8;16.17: 10;18.19: 11;20.23: 12;24.25: 10;26.27: 11;28.32: 12;33: 13;34: 12;35: 11;36.37: 10;38.39: 8;40: 12;41: 13;42: 12;43: 11;44.45: 10;46.49: 8;50.51: 12;52.57: 8;58.59: 12;60.65: 8;66.67: 9;68.69: 10;70.73: 8;74.75: 9;76.77: 10;78.79: 8;80.81: 10;82.83: 11;84.87: 12;88.89: 10;90.91: 11;92.96: 12;97: 13;98: 12;99: 11;100.101: 10;102.103: 8;104: 12;105: 13;106: 12;107: 11;108.109: 10;110.113: 8;114.115: 12;116.119: 8;120.122: 13;123: 12;124.125: 10;126.127: 12;384.385: 15;386: 13;387: 12;388.391: 13;392.393: 10;394: 12;395: 13;396.397: 12;398: 10;399: 9;400: 8;401: 6;402: 12;403: 10;404.410: 9;411: 10;412.414: 12;415: 13;416.418: 10;419: 9;420.423: 8;424.426: 12;427: 10;428: 9;429: 8;430: 6;431: 8;432.435: 5;436.439: 0;440.441: 8;442.443: 12;444.447: 8;448.450: 13;451: 12;452.453: 10;454.455: 12;456.457: 15;458: 13;459: 12;460.463: 13;464.465: 10;466: 12;467: 13;468.469: 12;470: 10;471: 9;472: 8;473: 6;474: 12;475: 10;476.482: 9;483: 10;484.486: 12;487: 13;488.490: 10;491: 9;492.495: 8;496.498: 12;499: 10;500: 9;501: 8;502: 6;503: 8;504.507: 5;508.511: 0;END;2、分频模块该程序块主要是把从实验箱接入的50MHZ的频率进行分频,分别得到1MHZ和4HZ的脉冲,以备后面模块使用。程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity dve isport ( clk : in std_logic;q1 : out std_logic;q2 : out std_logic);end dve;architecture one of dve isbeginprocess(clk)variable a1 : integer range 0 to 49;beginq149 then q1=1;a1:=0;elsif clkevent and clk=1 thena1:=a1+1;end if;end process;process(clk)variable a2 : integer range 1 to 12500000;beginq212500000 then q2=1;a2:=1;elsif clkevent and clk=1 then a2:=a2+1;end if;end process;end one;仿真波形如下:由于把50MHZ的时钟脉冲分成1MHZ和4HZ,分频系数很大导致仿真有很大困难,特别是最终要的到4HZ脉冲就需要进行12500000次分频,所以在仿真图中很难明显看出q2的输出波形,但可以肯定该模块在逻辑上是正确的。第 23 页 共 23 页3、音符控制输出模块NOTETABS:该模块利用已定制完成的music.mif文件,通过给出LPM_ROM的数据地址,使LPM_ROM输出对应的音符,再送入音符译码电路,最终演奏出编好的音乐。VHDL语句描述如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity notetabs isport(clk:in std_logic;rst:in std_logic;choose:in std_logic_vector (1 downto 0);toneindex:out std_logic_vector (4 downto 0);end;architecture one of notetabs is component musicport(address:in std_logic_vector(8 downto 0);clock:in std_logic;q:out std_logic_vector(4 downto 0);end component;signal counter:std_logic_vector(8 downto 0);signal tmp:std_logic_vector(8 downto 0);signal rset:std_logic;beginchoosemusic:process(choose(0),choose(1),clk) 选歌信号检测进程:variable a:std_logic_vector(1 downto 0);variable b:std_logic_vector(1 downto 0);variable c:std_logic_vector(1 downto 0);beginif clkevent and clk=1 thenb:=a;a:=choose;c:=b-a;end if;if c=00 then rset=0;else rset=1;end if;end process;cnt8: process(clk,counter,rset,rst,choose,tmp) ROM地址控制输出进程beginif rst=1 then tmp=000000000;elsif rset=1 then tmp=000000000;elsif tmp=127 then tmp =000000000;elsif (clkevent and clk=1) then tmp counter counter counter counter countercounter,q=toneindex,clock=clk);end;仿真波形如下:时序仿真说明:TMPLOOK对应模块中的RSET信号,每当CHOOSE的信号发生改变,即选歌里,即将TMP置零,并通过CASE语句将歌曲音符的地址输出给其他模块。RST为手动信号,为仿真方便,此处不使用MIF文件的数据 ,而用ADDRESS表示ROM的地址信号。根据时序图可看出,当CHOOSE发生变化时,ADDRESS也相应的改变,即完成在同一ROM内存放多首歌曲并通过手动按键的方式进行选歌。4、音符译码电路TONETABS:该模块将NOTETABS输出的音符译成输出电路的数控分频所需要预置数,并将对应的简谱数码用数码管显示出来,同时根据输出的音符,判断其高、中、低特性,并通过三个LED灯显示出来。其所输出的预置数由最后一级的数控频器所决定,参考值如下表:音阶频率频率设定数预置数音阶频率频率设定数预置数低74152891 101101001011 中35543193 110001111001 低63702745 101010111000 中24933082 110000001001 低53292576 101000010000 中14402960 101110001111 低42932390 100101010101 高716613795 111011010010 低32772291 100011110010 高614793758 111010101101 低22462063 100000001111 高513183717 111010000100 低12201823 11100011111 高411743670 111001010110 中78303494 110110100101 高311083645 111000111100 中67403420 110101011100 高29873589 111000000101 中56593337 110100001001 高18803528 110111000111 中45873244 110010101100 0音0 4095111111111111其计算公式如下:由于所设计的数控分频计采用12MHZ作为时钟源,并通过一次12分频给出频率为1MHZ的脉冲溢出信号,再对该1MHZ的溢出信号进行12位2进制码的带预置数进行计数,并给出一个频率随预置数变化的脉冲信号。由于该脉冲信号不具有驱动蜂鸣器的能力,故对此脉冲信号进行2分频以推动蜂鸣器发声,故最终输出信号的频率与预置数的关系如下:其中为音阶对应的频率。模块VHDL语句描述如下:library ieee;use ieee.std_logic_1164.all;entity tonetaba isport(index:in std_logic_vector (4 downto 0);code:out std_logic_vector(3 downto 0);high0:out std_logic_vector(2 downto 0);tone:out std_logic_vector(11 downto 0);end;architecture one of tonetaba isbeginsearch:process(index)begincase index iswhen00000=tone=111111111111;code=0000;high0tone=011100011111;code=0001;high0tone=100000001111;code=0010;high0tone=100011110010;code=0011;high0tone=100101010101;code=0100;high0tone=101000010000;code=0101;high0tone=101010111000;code=0110;high0tone=101101001011;code=0111;high0tone=101110001111;code=0001;high0tone=110000001001;code=0010;high0tone=110001111001;code=0011;high0tone=110010101100;code=0100;high0tone=110100001001;code=0101;high0tone=110101011100;code=0110;high0tone=110110100101;code=0111;high0tone=110111000111;code=0001;high0tone=111000000101;code=0010;high0tone=111000111100;code=0011;high0tone=111001010110;code=0100;high0tone=111010000100;code=0101;high0tone=111010101101;code=0110;high0tone=111011010010;code=0111;high0null;end case;end process;end;仿真波形如下:5、数控分频器计输出模块SPEAKERA:该模块主体为一个12位的可预置数计数器。可由第六次实验的数控分频计修改得来。其通过NOTETABS得到预置数,并对些进行计数。当计满时便给出一个溢出信号。再对此溢出信号进行二分频得到能驱动蜂鸣器且频率符合C大调的21个音阶的频率。由此发出不同信号。其VHDL语言描述如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity speakera isport(clk:in std_logic;tone:in std_logic_vector(11 downto 0);spks:out std_logic);end;architecture one of speakera issignal preclk,fullspks:std_logic;begindivideclk:process(clk)对12MHZ时钟源进行12分频,输出1MHZ的脉冲信号。variable count4:std_logic_vector(3 downto 0);beginpreclk11 then preclk=1;count4:=0000;elsif clkevent and clk=1 then count4:=count4+1;end if;end process;genspks:process(preclk,tone)12位预置数数控分频器variable count11:std_logic_vector(11 downto 0);beginif preclkevent and preclk=1 then if count11=111111111111then count11:=tone; fullspks=1;else count11:=count11+1;fullspks=0;end if;end if;end process;delayspks:process(fullspks)2分频,蜂鸣器推动电路。variable count2 :std_logic;beginif fullspksevent and fullspks =1 then count2:=not count2;if count2=1 then spks=1;else spks=0;end if;end if;end process;end;时序仿真图如下:仿真结果说明 :因TONE为12位,时序仿真是会因为计数次数过多而次导致仿真长时间不能完成。故为便于时序仿真,VHDL语言描述中仅将TONE11 DOWNTO 0 修改为3 DOWNTO 0,其仿真结果本质一致。由时序仿真可见,根据预置数的不同,其输出的频率也有规律性的变化。6、译码模块DELEDlibrary ieee;useieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity deled is port( code1 : in std_logic_vector(3 downto 0);led : out std_logic_vector(6 downto 0);end deled;architecture one of deled isbegin led = 1111110 when code1=0000else 0110000 when code1=0001else 1101101 when code1=0010else 1111001 when code1=0011else 0110011 when code1=0100else 1011011 when code1=0101else 1011111 when code1=0110else 1110000 when code1=0111;end;7、顶层设计VHDL描述 songer 模块:在设计好各个子模块后,即可开始设计顶层文件。其只需要定义好输入的CHOOSE信号,推动蜂鸣器的CLK12MHZ信号及控制节拍速度的CLK8HZ的信号,及显示的高、中、低的三个LED灯信号输出,驱动蜂鸣器的SPKOUT以及数码管简谱显示信号即可。其VHDL语言如下:library ieee;use ieee.std_logic_1164.all;entity songer isport(clk : in std_logic;rst : in std_logic;choose : in std_logic_vector(1 downto 0);led :out std_logic_vector(6 downto 0);high1 : out std_logic_vector(2 downto 0);spkout : out std_logic;VGA: out std_logic_vector(3 downto 0);db : out std_logic);end songer;architecture one of songer iscomponent notetabsport(clk1 : in std_logic;rst : in std_logic;choose : in std_logic_vector(1 downto 0);toneindex : out std_logic_vector(4 downto 0);end component;component tonetaba port(index : in std_logic_vector(4 downto 0);code : out std_logic_vector(3 downto 0);high0 : out std_logic_vector(2 downto 0);tone : out std_logic_vector(11 downto 0);end component;component speakera port(clk2 : in std_logic;tone : in std_logic_vector(11 downto 0);spks : out std_logic);end component;component dve port(clk : in std_logic;q1 : out std_logic;q2 : out std_logic) ;end component;component deled port( code1 : in std_logic_vector(3 downto 0);led : out std_logic_vector(6 downto 0);end component;signal a : std_logic;signal b : std_logic;signal c : std_logic_vector(3 downto 0);signal tone : std_logic_vector(11 downto 0);signa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年新型城镇化建设项目推广服务合同
- 2025年度制造业委托代理招聘及员工培训服务协议
- 说话礼仪知识培训课件
- 语言知识培训班课件
- 2025合作合同范本联盟协议
- 2025租房合同简单示例模板
- 红酒培训知识与礼仪教案课件
- 红酒培训基础知识书籍课件
- 2025二手设备采购合同
- 2025文具耗材采购协议合同范本
- 2025年彩票兑奖岗笔试备考秘籍
- 1.2 从立体图形到平面图形第3 课时截一个几何体 北师大版七年级数学上册教案
- 2025版食品加工委托生产合同范本
- 2025年租用企业宿舍协议书
- 2025年老司机三力测试题及答案
- (2025年标准)货拉拉签协议书
- 学堂在线 中国传统艺术-篆刻、书法、水墨画体验与欣赏 章节测试答案
- 工厂供电理论知识培训课件
- 2025年中国船舶集团校园招聘面试模拟题及答案
- 2025房屋租赁托管合同示范文本
- (2025年标准)股东合伙协议及分红协议书
评论
0/150
提交评论