乐器演奏电路设计-vhdl.doc_第1页
乐器演奏电路设计-vhdl.doc_第2页
乐器演奏电路设计-vhdl.doc_第3页
乐器演奏电路设计-vhdl.doc_第4页
乐器演奏电路设计-vhdl.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

重庆交通大学计算机与信息学院设计性实验报告班 级: 通信工程 专业 07 级 2 班 姓名(学号): 实验项目名称: 乐器演奏电路设计 实验项目性质: 设计性 实验所属课程: VHDL 实验室(中心): 指 导 教 师 : 徐雯娟 实验完成时间: 2009 年 12 月 13 日设计性实验乐曲演奏实验 Page 13 of 13教师评阅意见: 签名: 年 月 日实验成绩:一、实验目的1,了解普通扬声器的工作原理;2,了解QuartusII4.1中提供了宏功能元件库mega_lpm。3,使用LPM_ROM参数化存储模块。二、实验内容及要求要求能够演奏出友谊地久天长的曲调或可另选一段较完整的曲调。(扩展要求:能够从数码管上显示出当前曲调的简谱和频率)SPEAKERCLKTONE SPKSU3NOTE TABSTONEINDEXCLKU1TONE TAB HIGHINDEX CODE TONEU2三、实验原理1,音符的频率:可以由上图中的U3获得,这是一个数控分频器。由其clk 端输入一具有较高频率(这里是12MHz)的信号,通过U3分频后由SPKOUT输出,U3对clk 输入信号的分频比由11位预置数Tone10.0决定。SPKOUT的输出频率将决定每一音符的音调,这样,分频计数器的预置值Tone10.0与SPKOUT 的输出频率,就有了对应关系。2,音符的持续时间:须根据乐曲的速度及每个音符的节拍数来确定,图中模块U2的功能首先是为U3提供决定所发音符的分频预置数,而此数在U3输入口停留的时间即为此音符的节拍值。模块U2是乐曲简谱码对应的分频预置数查表电路,其中设置了乐曲全部音符所对应的分频预置数(一共8个),每一音符的停留时间由音乐节拍和音调发生器模块U1的clk的输入频率决定(如为4Hz),这8个值的输出由对应于U2的3位输入值Index2.0确定。3,乐谱的存储:在U1中设置了一个7位二进制计数器(计数最大值为65),作为音符数据ROM 的地址发生器。这个计数器的计数频率若选为4Hz,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒时,四四拍的4分音符持续时间。随着U1中的计数器按4Hz的时钟速率作加法计数时,即随地址值递增时,音符数据ROM 中的音符数据将从ROM中通过ToneIndex2.0端口输向U2模块,乐曲就开始连续自然地演奏起来了。音高频率对照表(徐老师给定发的原频率对照表中频率偏低)1234567低音261293329349396440493中音523587659698784880988高音1047117513191397156817601975四、实验仪器、材料1,2MHZ和4HZ的信号源2,ACEX1K EP1K30TC1441芯片3,扬声器五、方案设计(设计性实验需要,综合性实验无该项)1,音符的产生:音符的产生是利用数控分频器模块SPKEAR对输入的时钟信号CLK400KHZ进行分频,预置数为TONE10.0,然后分频得出频率为CLK/2*(2048- TONE10.0),通过控制输入预置数TONE10.0来达到不同的输出频率,以达到控制扬声器发出不同的声音。例如:当设置预置数TONE10.0为1538时,输出SPKEAR频率为396,为低音5。2,频率的分频:由于实验给定信号源为12MHZ,不满足数控分频器模块SPKEAR对输入时钟信号的要求,遂其进行30分频(PULSE30),产生0.4MHZ的时钟信号。3,预置数的产生:预置数TONE10.0由模块TONE TAB产生。模块TONE TAB有输入端口INDEX2.0送入音符,模块由CASE选择语句产生与INDEX2.0输入端口送入的音符相对应的预置数TONE10.0,也同时产生其音符CODE2.0送入音符显示模块DISPCODE,和频谱频率frenquence9.0送入频率显示模块DISPFREN。例如:当输入端口INDEX2.0送入000(为低音5对应的编码),有CAES选择语句产生TONE10.0为1538,frenquence9.0为396 以及CODE2.0为101的输出。4,音符的存储:音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定。由存储模块music_rom_data控制,以四分之一节拍为1个单位在LPM_ROM中进行存储音符的编码(例如本实验友谊地久天长中频谱共涉及了8个音符,使用3个二进制数分别对其编码进行存储;又有二分之一节拍数的音符存储2个单元,以此类推,直到对整首歌曲的乐谱存储结束)。存储模块music_rom_data的输出为数控分频器模块TONETAB的输入端INDEX2.0。音符与编码对照表:音符5(低音)123561(高音)6(低音)编码0000010100111001011101115,音符的输出驱动:音符的存储由计数器模块LPM_COUNTE控制。计数器在时钟CLK4HZ的控制下,没0.25s送出一个6位数值q5.0,作为存储模块music_rom_data的地址输入端口。这样便达到每个存储单元以同一频率进行有控制的输出。6,频谱显示模块DISPCODE和频率显示模块DISPFRENQUENCE有本组另一同学(袁亮)设计。六、实验过程及原始记录1,制作存储模块music_rom_data.(1)定制LPM_ROM初始化数据文件建立.mif格式文件:选择FileNewMemory Initialization File项,选择数据位为256,数据宽度为8,建立.mif格式文件,将歌曲频谱以编码的形式,以四分之一节拍为一单位进行存储。(其实128位数据位已经够本实验歌曲友谊地久天长使用)形成如下图的数据文件:(2),定制LPM_ROM元件LPM宏功能模块设定选择ROM_DATA模块数据线和地址线宽度调入ROM初始化数据文件LPM_ROM设计完成生成用于例化的LPM_ROM的VHDL文件music_data_rom.vhd:LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY lpm;USE lpm.lpm_components.all;ENTITY music_data_rom ISPORT(address: IN STD_LOGIC_VECTOR (5 DOWNTO 0);q: OUT STD_LOGIC_VECTOR (2 DOWNTO 0);END music_data_rom;ARCHITECTURE SYN OF music_data_rom ISSIGNAL sub_wire0: STD_LOGIC_VECTOR (2 DOWNTO 0);COMPONENT lpm_romGENERIC (intended_device_family: STRING;lpm_width: NATURAL;lpm_widthad: NATURAL;lpm_address_control: STRING;lpm_outdata: STRING;lpm_file: STRING;lpm_type: STRING);PORT (address: IN STD_LOGIC_VECTOR (5 DOWNTO 0);q: OUT STD_LOGIC_VECTOR (2 DOWNTO 0);END COMPONENT;BEGINq ACEX1K,lpm_width = 3,lpm_widthad = 6,lpm_address_control = UNREGISTERED,lpm_outdata = UNREGISTERED,lpm_file = music_rom_data.mif,lpm_type = LPM_ROM)PORT MAP (address = address,q = sub_wire0);END SYN;2,制作计数器模块COUNTER实验步骤如上:生成用于例化的LPM_COUNTER的VHDL文件counter.vhd:LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY lpm;USE lpm.all;ENTITY counter ISPORT(clk_en: IN STD_LOGIC ;clock: IN STD_LOGIC ;q: OUT STD_LOGIC_VECTOR (5 DOWNTO 0);END counter;ARCHITECTURE SYN OF counter ISSIGNAL sub_wire0: STD_LOGIC_VECTOR (5 DOWNTO 0);COMPONENT lpm_counterGENERIC (lpm_direction: STRING;lpm_port_updown: STRING;lpm_type: STRING;lpm_width: NATURAL);PORT (clk_en: IN STD_LOGIC ;clock: IN STD_LOGIC ;q: OUT STD_LOGIC_VECTOR (5 DOWNTO 0);END COMPONENT;BEGINq UP,lpm_port_updown = PORT_UNUSED,lpm_type = LPM_COUNTER,lpm_width = 6)PORT MAP (clk_en = clk_en,clock = clock,q = sub_wire0);END SYN;3,制作数控分频器SPKEAR模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY speaker IS PORT(CLK: IN STD_LOGIC; tone:IN integer range 0 to 2048; spks:out std_logic);END speaker;ARCHITECTURE ONE OF speaker IS SIGNAL FULL: STD_LOGIC; BEGIN P_REG: PROCESS(CLK) VARIABLE CNT8:integer range 0 to 2048; BEGIN IF CLKEVENT AND CLK=1 THEN IF CNT8=2048 THEN CNT8:=tone; FULL=1; ELSE CNT8:=CNT8+1; FULL=0; END IF; END IF; END PROCESS P_REG; P_DIV:PROCESS(FULL) VARIABLE CNT2:STD_LOGIC; BEGIN IF FULLEVENT AND FULL=1 THEN CNT2:=NOT CNT2; IF CNT2=1 THEN spks=1; ELSE spks frequence=396;code=101;tone frequence=523code=001;tone frequence=587;code=010;tone frequence=659;code=011;tone frequence=784;code=101;tone frequence=1047;code=110;tone frequence=1175;code=001;tone frequence=440;code=110;tone=1595; end case; end process;end behave_tonetab;5,制定PULSE30模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity pulse30 is port(clk :in std_logic; fout:out std_logic); end;architecture behave_pulse30 of pulse30 is SIGNAL FULL: STD_LOGIC; BEGIN P1: PROCESS(CLK) VARIABLE CNT30:integer range 1 to 30; BEGIN IF CLKEVENT AND CLK=1 THEN IF CNT30=30 THEN CNT30:=1; FULL=1; ELSE CNT30:=CNT30+1; FULL=0; END IF; END IF; END PROCESS P1; P2:PROCESS(FULL) VARIABLE CNT2:STD_LOGIC; BEGIN IF FULLEVENT AND FULL=1 THEN CNT2:=NOT CNT2; IF CNT2=1 THEN fout=1; ELSE foutindex=000tone=1538speak=396(持续时间0.25s);address=000001index=000tone=1538speak=396(持续时间0.25s);address=000010index=001tone=1666speak=523(持续时间0.25s);address=000011index=001tone=1666speak=523(持续时间0.25s);address=000100index=001tone=1666speak=523(持续时间0.25s);address=000101index=001tone=1666speak=523(持续时间0.25s);八、实验体会在实验题目拿到手里的那一刻,还不知意味着什么,只是感觉看着好难,但是也好新奇。心里面有跃跃一试的激动,但是又因为之前从来没有设计过此类的设计项目,也有一些胆颤。于是我专门找了一整块的时间来研究此道设计题,待到抬头时却发现徐老师给的有关实验题目和原理的课件上面已经将实验的步骤和方法以及思想,罗列的清晰可现。我想要是再真的做不出来可真是对不起自己的时间,对不起这张课件上面的字迹,也浪费了徐老师的心思!但在实验实现的过程中却遇到了麻烦,(1)首先是制作存储模块music_rom_data,因为之前没有遇到过LPM宏功能模块的使用,还有上课时没有认真听这方面的讲课内容(挺不好意思的),所以不知从何下手,从图书馆查找资料也只是对LPM宏模块本身的理解及应用,没有使用步骤,也不知道应该以怎样德形式将频谱存入.mif格式文件,这对于实验就不知要怎样实现。周五的晚上于是我对自己说:你什么时候想好实验的存储方法就什么时候睡觉,这样持续到了2:30,突然恍然大悟,觉醒,于是将音符以编码的形式将其存储(好像我有点笨了,呵呵)。(2)然后在进行模块SPEAKER的设计时,发现若以设计题目给定的12MHZ进行分频,那预置数TONE10.0将为负数,于是计算过后,发现若进行30分频将时钟信号调制为0.4MHZ则可以正常进行试验。接下来整个实验一气呵成!待到周六本组另外一同学袁亮将无误的显示模块连接,呵呵,实验编译成功!在这了还要感谢袁亮同学对我的信任!当周日的时候,进入了实验室,心里有点小紧张,也有点小兴奋。想一定会成功的。带着忐忑的心里,在链接编译下载之后却发现实验箱中的扬声器不争气的没有半点生气,很是郁闷。待徐老师的耐心指导之下,发现是少了用来驱动存储模块的计数器模块COUNTER。重新下载之后,发现扬声器发出的只是低鸣声结果换了一个实验箱仍然是这样的结果,排除了试验箱的扬声器的问题;然后从新计算了例化语言VHDL,发现没有计算问题,也没有逻辑问题;遂于是去参考一下别

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论