版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SOPC/EDA综合课程设计--等精度数字频率计设计者:万和华自动化072班40号孙金1江西理工大学应用科学学院SOPC/EDA综合课程设计报告设计题目:硬件乐曲自动演奏电路设计设计者:余海光学号:32班级:自动化082指导老师:王忠锋完成时间:2010年01月19日设计报告综合测试总评格式(10)(10)(10)内容(40)图表(10)(10)(10)答辩(20)(20)(20)平时(20)(20)(20)目录一:设计任务要求………………2二:总体框图……………………2三:选择器件……………………3四:各模块电路及顶层文件……31:音乐数据ROM模块…………32:音符控制输出模块NOTETABS…………………73:音符译码电路TONETABS…………………84:数控分频器计输出模块SPEAKERA…………115.顶层设计VHDL描述songer模块…………12五:管脚锁定……………………14六:硬件仿真结果…………………16七:心得体会……………………16八:参考资料……………………17一、设计任务要求本文介绍在EDA开发平台上利用VHDL语言设计数控分频器电路,利用数控分频的原理设计音乐硬件演奏电路,并定制LPM-ROM存储音乐数据,以"感恩的心"乐曲为例,将音乐数据存储到LPM-ROM,就达到了以纯硬件的手段来实现乐曲的演奏效果。只要修改LPM-ROM所存储的音乐数据,将其换成其他乐曲的音乐数据,再重新定制LPM-ROM,连接到程序中就可以实现其它乐曲的演奏。二、总体框图该主系统由三个模块:tonetaba.vhd、notetabs.vhd、speakera.vhd组成。①首先定制notetabs.vhd、模块中的音符数据ROM"music"。②根据给出的乘法器逻辑原理图及其模块的VHDL描述在MAX+plusⅡ上完成设计。③完成编译,综合,仿真,管教分配,编程下载。1.对于模块NoteTabs的功能描述:该模块的功能就是定义音符数据ROM"music"随着该模块中的计数器控制时钟频率速率作加法计数时,即地址值递增时,音符数据ROM中的音符数据。将从ROM中通过ToneIndex[4..0]端口输向ToneTaba模块,演奏《送别》。在该模块中设置了一个8位二进制计数器(计数最大值为197),作为音符数据ROM的地址发生器。这个计数器的计数频率为4Hz,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒时,四四拍的4分音符持续时间。2.对于模块ToneTaba,是乐曲简谱码对应的分频预置数查找表电路,其中设置了乐曲的全部音符所对应的分频置数,每一音符的停留时间由音乐节拍和音调发生器模块NoteTabs的CLK的输入频率决定,这些值由对应于ToneTaba的5位输入值Index[4..0]确定,最多有22种可选值。输向ToneTaba中Index[4..0]的值ToneIndex[4..0]的输出值与持续的时间由模块NoteTabs决定。3.模块Speakera是一个数控分频器,音符的频率可由此模块获得。由CLK端输入一具有较高频率的信号,通过Speakera分频后由SPKOUT输出。由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号。为了利用驱动扬声器,需加一个D触发器以均衡其占空比,频率将是原来的1/2。Speakera对CLK输入信号的分频比由预置数Tone决定。SPKOUT的输出频率将决定每一音符的音调。三、选择器件1.EP1C12Q240C8芯片及相应的连接设备2.外置扬声器3.7段数码管4.计算机5.LED灯一个四、各模块电路及顶层文件--1.音乐数据ROM模块:该模块为音乐曲谱的存放文件。其利用LPM_ROM宏模块将共设定256每个音符宽度为5位,可存放高、中、低三阶21个音符的数据。文件名为music.mif.其中[0..127]存放第一首歌《挥着翅膀的女孩》,[127..255]存放第二首歌《菊花台》。在该数据中,每个字符持续时间为0.25秒(由音符控制输出模块的时钟源4HZ信号确定),故在根据乐谱中音符的实际持续时间进行编写。如四四拍的则每拍时间为0.5秒,则此处对应数据应该持续两个字符。ROM中的音符数据模块(MUSIC)程序如下:WIDTH=5;DEPTH=512;ADDRESS_RADIX=UNS;DATA_RADIX=UNS;CONTENTBEGIN [0..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; [128..130]:10; 131:9; [132..133]:10; [134..135]:0; 136:10; 137:12; 138:10; 139:9; [140..143]:10; [144..146]:8; 147:9; 148:10; 149:12; [150..151]:10; [152..154]:9; 155:8; [156..159]:9; [160..162]:10; 163:12; 164:13; [165..167]:12; 168:13; [169..170]:12; 171:10; [172..174]:12; 175:5; [176..177]:10; [178..179]:9; [180..181]:12; 182:10; [183..186]:9; 187:8; [188..191]:9; [192..194]:10; 195:9; [196..200]:10; 201:12; 202:10; 203:9; [204..207]:10; [208..210]:8; 211:9; 212:10; 213:12; [214..215]:10; [216..218]:9; 219:8; [220..223]:9; [224..226]:10; 227:12; 228:13; [229..231]:12; 232:13; [233..234]:12; 235:10; [236..239]:12; 240:0; 241:10; 242:9; 243:10; [244..245]:12; 246:10; [247..248]:9; [249..253]:8; [254..255]:0;MIF文件内容如下:--2.音符控制输出模块NOTETABS:该模块利用已定制完成的music.mif文件,通过给出LPM_ROM的数据地址,使LPM_ROM输出对应的音符,再送入音符译码电路,最终演奏出编好的音乐。NOTETABS的模块图形如下:VHDL语句描述如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitynotetabsis port(clk:instd_logic; rst:instd_logic; choose:instd_logic_vector(1downto0); toneindex:outstd_logic_vector(4downto0)); end;architectureoneofnotetabsiscomponentmusic port(address:instd_logic_vector(8downto0); inclock:instd_logic; q:outstd_logic_vector(4downto0)); endcomponent; signalcounter:std_logic_vector(8downto0); signaltmp:std_logic_vector(8downto0); signalrset:std_logic; begin choosemusic:process(choose(0),choose(1),clk)—选歌信号检测进程: variablea:std_logic_vector(1downto0); variableb:std_logic_vector(1downto0); variablec:std_logic_vector(1downto0); begin ifclk'eventandclk='1'then b:=a; a:=choose; c:=b-a; endif; ifc="00"thenrset<='0'; elserset<='1'; endif; endprocess; cnt8:process(clk,counter,rset,rst,choose,tmp)—ROM地址控制输出进程 begin ifrst='1'thentmp<="000000000"; elsifrset='1'thentmp<="000000000"; elsiftmp=127thentmp<="000000000"; elsif(clk'eventandclk='1')thentmp<=tmp+1; endif; casechooseis when"00"=>counter<=tmp; when"01"=>counter<=tmp+128; whenothers=>counter<="000000000"; endcase; endprocess; u1:musicportmap(address=>counter,q=>toneindex,inclock=>clk); end;该模块时序仿真图如下:时序仿真说明:TMPLOOK对应模块中的RSET信号,每当CHOOSE的信号发生改变,即选歌里,即将TMP置零,并通过CASE语句将歌曲音符的地址输出给其他模块。RST为手动信号,为仿真方便,此处不使用MIF文件的数据,而用ADDRESS表示ROM的地址信号。根据时序图可看出,当CHOOSE发生变化时,ADDRESS也相应的改变,即完成在同一ROM内存放多首歌曲并通过手动按键的方式进行选歌。--3.音符译码电路TONETABATONETABA的模块图形如下:/该模块将NOTETABS输出的音符译成输出电路的数控分频所需要预置数,并将对应的简谱数码用数码管显示出来,同时根据输出的音符,判断其高、中、低特性,并通过三个LED灯显示出来。其所输出的预置数由最后一级的数控频器所决定,参考值如下表:音阶频率频率设定数预置数音阶频率频率设定数预置数低74152891101101001011中35543193110001111001低63702745101010111000中24933082110000001001低53292576101000010000中14402960101110001111低42932390100101010101高716613795111011010010低32772291100011110010高614793758111010101101低22462063100000001111高513183717111010000100低1220182311100011111高411743670111001010110中78303494110110100101高311083645111000111100中67403420110101011100高29873589111000000101中56593337110100001001高18803528110111000111中458732441100101011000音04095111111111111其计算公式如下:由于所设计的数控分频计采用12MHZ作为时钟源,并通过一次12分频给出频率为1MHZ的脉冲溢出信号,再对该1MHZ的溢出信号进行12位2进制码的带预置数进行计数,并给出一个频率随预置数变化的脉冲信号。由于该脉冲信号不具有驱动蜂鸣器的能力,故对此脉冲信号进行2分频以推动蜂鸣器发声,故最终输出信号的频率与预置数的关系如下:其中为音阶对应的频率。模块VHDL语句描述如下:libraryieee;useieee.std_logic_1164.all;entitytonetabais port(index:instd_logic_vector(4downto0); code:outstd_logic_vector(3downto0); high0:outstd_logic_vector(2downto0); tone:outstd_logic_vector(11downto0)); end;architectureoneoftonetabaisbeginsearch:process(index)begin caseindexis when"00000"=>tone<="111111111111";code<="0000";high0<="000";--0/4095 when"00001"=>tone<="011100011111";code<="0001";high0<="001";--L1/1823 when"00010"=>tone<="100000001111";code<="0010";high0<="001";--L2/2063 when"00011"=>tone<="100011110010";code<="0011";high0<="001";--L3/2291 when"00100"=>tone<="100101010101";code<="0100";high0<="001";--L4/2390 when"00101"=>tone<="101000010000";code<="0101";high0<="001";--L5/2576 when"00110"=>tone<="101010111000";code<="0110";high0<="001";--L6/2745 when"00111"=>tone<="101101001011";code<="0111";high0<="001";--L7/2891 when"01000"=>tone<="101110001111";code<="0001";high0<="010";--M1/2960 when"01001"=>tone<="110000001001";code<="0010";high0<="010";--M2/3082 when"01010"=>tone<="110001111001";code<="0011";high0<="010";--M3/3193 when"01011"=>tone<="110010101100";code<="0100";high0<="010";--M4/3244 when"01100"=>tone<="110100001001";code<="0101";high0<="010";--M5/3337 when"01101"=>tone<="110101011100";code<="0110";high0<="010";--M6/3420 when"01110"=>tone<="110110100101";code<="0111";high0<="010";--M7/3494 when"01111"=>tone<="110111000111";code<="0001";high0<="100";--H1/3528 when"10000"=>tone<="111000000101";code<="0010";high0<="100";--H2/3589 when"10001"=>tone<="111000111100";code<="0011";high0<="100";--H3/3645 when"10010"=>tone<="111001010110";code<="0100";high0<="100";--H4/3670 when"10011"=>tone<="111010000100";code<="0101";high0<="100";--H5/3717 when"10100"=>tone<="111010101101";code<="0110";high0<="100";--H6/3758 when"10101"=>tone<="111011010010";code<="0111";high0<="100";--H7/3795 whenothers=>null; endcase; endprocess; end;--4.数控分频器计输出模块SPEAKERA:该模块主体为一个12位的可预置数计数器。可由第六次实验的数控分频计修改得来。其通过NOTETABS得到预置数,并对些进行计数。当计满时便给出一个溢出信号。再对此溢出信号进行二分频得到能驱动蜂鸣器且频率符合C大调的21个音阶的频率。由此发出不同信号。SPEAKERA的模块图形如下:其VHDL语言描述如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityspeakeraisport(clk:instd_logic; tone:instd_logic_vector(11downto0); spks:outstd_logic);end;architectureoneofspeakerais signalpreclk,fullspks:std_logic;begindivideclk:process(clk)—对12MHZ时钟源进行12分频,输出1MHZ的脉冲信号。 variablecount4:std_logic_vector(3downto0);beginpreclk<='0';ifcount4>11thenpreclk<='1';count4:="0000";elsifclk'eventandclk='1'thencount4:=count4+1;endif;endprocess;genspks:process(preclk,tone)—12位预置数数控分频器 variablecount11:std_logic_vector(11downto0);begin ifpreclk'eventandpreclk='1'then ifcount11="111111111111"thencount11:=tone;fullspks<='1'; elsecount11:=count11+1;fullspks<='0';endif; endif;endprocess;delayspks:process(fullspks)—2分频,蜂鸣器推动电路。 variablecount2:std_logic; begin iffullspks'eventandfullspks='1'thencount2:=notcount2; ifcount2='1'thenspks<='1'; elsespks<='0';endif; endif; endprocess;end;时序仿真图如下:因TONE为12位,时序仿真是会因为计数次数过多而次导致仿真长时间不能完成。故为便于时序仿真,VHDL语言描述中仅将TONE[11DOWNTO0]修改为[3DOWNTO0],其仿真结果本质一致。由时序仿真可见,根据预置数的不同,其输出的频率也有规律性的变化。--5.顶层设计VHDL描述songer模块:在设计好各个子模块后,即可开始设计顶层文件。其只需要定义好输入的CHOOSE信号,推动蜂鸣器的CLK12MHZ信号及控制节拍速度的CLK8HZ的信号,及显示的高、中、低的三个LED灯信号输出,驱动蜂鸣器的SPKOUT以及数码管简谱显示信号即可。其VHDL语言如下:libraryieee;useieee.std_logic_1164.all;entitysongeris port(clk12mhz:instd_logic; rst:instd_logic; choose:instd_logic_vector(1downto0); clk8hz:instd_logic; code1:outstd_logic_vector(3downto0); high1:outstd_logic_vector(2downto0); spkout:outstd_logic);end;architectureoneofsongeriscomponentnotetabs port(clk:instd_logic; rst:instd_logic; choose:instd_logic_vector(1downto0); toneindex:outstd_logic_vector(4downto0));endcomponent;componenttonetabaport(index:instd_logic_vector(4downto0); code:outstd_logic_vector(3downto0); high0:outstd_logic_vector(2downto0); tone:outstd_logic_vector(11downto0));endcomponent;componentspeakeraport(clk:instd_logic; tone:instd_logic_vector(11downto0); spks:outstd_logic);endcomponent;signaltone:std_logic_vector(11downto0);signaltoneindex:std_logic_vector(4downto0);beginu1:notetabsportmap(clk=>clk8hz,toneindex=>toneindex,rst=>rst,choose=>choose);u2:tonetabaportmap(index=>toneindex,tone=>tone,code=>code1,high0=>high1);u3:speakeraportmap(clk=>clk12mhz,tone=>tone,spks=>spkout);end;由于时序仿真时,受12位预置数及普通计算机性能的限制,仿真时间极长,因将预置数模块修改为4位,其他部分对应修改,但数值仅做参考,实际结果请参考本程序的硬件仿真结果。其仿真结果如下:五、管脚锁定:为实现所设计的功能
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公交车洗车外包合同
- 公司社保签外包合同
- 兰州劳务外包合同
- 农电工签外包合同
- 动物防疫外包合同
- 化验室外包合同
- 医院程序员外包合同
- 司机业务外包合同
- 员工餐饮外包合同
- 商用车风控外包合同
- 2026国家艺术基金管理中心招聘应届毕业生4人考试备考题库及答案解析
- 2025-2026年济南槐荫区九年级中考数学二模考试试题以及含答案
- 2026届山东青岛市平度市高三下学期模拟检测(一)历史试卷
- 2026年大理供电局项目制用工招聘(60人)笔试备考试题及答案解析
- 2026重庆市航空应急救援总队公开招聘34人笔试模拟试题及答案解析
- GB/T 47355-2026外包指南
- 中国鼻咽癌诊治指南(2026版)
- 市场监督管理局全流程市场监管工作手册(标准版)
- UPS电源售后服务承诺书范本
- 统编人教版五年级语文下册《田忌赛马》示范教学课件
- 急性气管支气管炎课件教学
评论
0/150
提交评论