ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:274.34KB ,
资源ID:3484271      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-3484271.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(EDA乐曲硬件演奏电路设计 课程设计Word文档格式.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

EDA乐曲硬件演奏电路设计 课程设计Word文档格式.docx

1、3.5.2 LPM-ROM定制123.6 顶层文件144 时序仿真及下载调试过程164.1 时序仿真图164.2 引脚锁定以及下载175扩年夜乐曲硬件演奏电路的通用性185.1 完善分频预置数模块的功能18设计总结与心得体会21参考文献22乐曲硬件演奏电路设计设计要求利用FPGA,设计一个乐曲硬件演奏电路.乐曲的12平均率规定:每2个八度(如简谱中的中音1与高音1)之间的频率相差1倍.在2个八度音之间, 又可分为12个半音, 每2个半音的频率比为12/2.另外, 音符A的频率为440HZ, 音符B到C之间, E到F之间为半音, 其余为全音.由此可以计算出简谱中从高音l至高音1之间每个音符的频率

2、.设计音符查找表电路模块, 时钟模块, 数控分频器模块, 音乐节拍发生模块电路.1、方案论证与比较利用FPGA来实现乐曲硬件演奏电路.乐曲的12平均率规定:制作一个纯硬件电路来完成乐曲演奏.与利用微处置器来实现乐曲演奏相比, 以纯硬件完成乐曲演奏电路的逻辑要复杂很多, 如果不借助于功能强年夜的EDA工具和硬件描述语言, 仅凭传统的数字逻辑技术, 即使最简单的演奏电路也难以实现.所以选择方案一.2 乐曲演奏电路原理2.1 音乐演奏电路原理图1 电路原理框图该主系统由三个模块:Songer顶层文件、div分频器、译码器组成.且Songer顶层文件还包括3个子文件分别是NoteTabs, ToneT

3、aba和Speakera, 另外, 我们还需建立一个名为“music”的LPM_ROM模块与NoteTabs模块连接. 音符频率的获得多个分歧频率的信号可通过对某个基准频率进行分频器获得.由于各个音符的频率多为非整数, 而分频系数又不能为小数, 故必需将计算机获得的分频系数四舍五入取整.若基准频率过低, 则分频系数过小, 四舍五入取整后的误差较年夜.若基准频率过高, 虽然可以减少频率的相对误差, 但分频结构将变年夜.实际上应该综合考虑这两个方面的因素, 在尽量减少误差的前提下, 选取合适的基准频率.本文中选取750KHz的基准频率.由于现有的高频时钟脉冲信号的频率为12MHz, 故需先对其进行

4、16分频, 才华获得750KHz的基准频率.对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号(占空比=1/分频系数).为提高输出信号的驱动能力, 以使扬声器有足够的功率发音, 需要再通过一个分频器将原来的分频器的输出脉冲均衡为对称方波(占空比=1/2), 但这时的频率将是原来的1/2.由于最年夜分频系数是1274, 故分频器采纳11位二进制计数器才华满足要求. 乐曲节奏的控制本课设的两只老虎乐曲, 最小的节拍为1/4拍, 若将1拍的时间定为1秒, 则只需要提供一个4Hz的时钟频率即可发生1/4拍的时长(0.25秒), 对其它占用时间较长的节拍(必为1/4拍的整数倍)则只需要将该音符连续输出

5、相应的次数即可.计数时钟信号作为输出音符快慢的控制信号, 时钟快时输出节拍速度就快, 演奏的速度也就快, 时钟慢时输出节拍的速度就慢, 演奏的速度自然降低. 乐谱发生器本文将乐谱中的音符数据存储在LPM-ROM中, 如“两只老虎”乐曲中的第一个音符为“3”, 此音在逻辑中停留了4个时钟节拍, 即1秒的时间, 相应地, 音符“3”就要在LPM-ROM中连续的四个地址上都存储.当一个4Hz的时钟来时, 相应地就从LPM-ROM中输出一个音符数据. 乐曲演奏电路原理框图我们知道, 组成乐曲的每个音符的发音频率值及其继续的时间是乐曲能连续演奏所需的两个基本要素, 问题是如何来获取这两个要素所对应的数值

6、以及通过纯硬件的手段来利用这些数值实现所希望乐曲的演奏效果.图1中, 模块U1类似于抚琴人的手指;U2类似于琴键;U3类似于琴弦或音调发声器.音符的频率可以由图1中的SPEAKERA获得, 这是一个数控分频器.由其clk端输入一具有较频率(这里是12MHz)的信号, 通过SPEAKERA分频后由SPKOUT输出, 由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号, 为了有利于驱动扬声器, 需另加一个D触发器以均衡其占空比, 但这时的频率将是原来的1/2.SPEAKERA对clk输入信号的分频比由11位预置数Tone10.0决定.SPKOUT的输出频率将决定每一音符的音调, 这样, 分

7、频计数器的预置值Tone10.0与SPKOUT的输出频率, 就有了对应关系.音符的继续时间须根据乐曲的速度及每个音符的节拍数来确定, 图1中模块TONETABA的功能首先是为SPEAKERA提供决定所发音符的分频预置数, 而此数在SPEAKERA输入口停留的时间即为此音符的节拍值.输向TONETABA中Index3.0的值ToneIndex3.0的输出值与继续的时间由模块NOTETABS决定.在NOTETABS中设置了一个8位二进制计数器, 作为音符数据ROM的地址发生器.获得乐曲演奏电路的原理框图如图1所示:图1 电路原理图3音乐硬件演奏电路的设计实现音乐硬件演奏电路主要是用VHDL语言来设

8、计, 并利用QuartusII软件工具来编译、测试和仿真.根据顶层原理图, 共分为地址发生器模块、分频预置数模块、数控分频模块这三个模块.而music模块是寄存乐曲中的音符数据, 在我们的顶层原理图中并没有显示出来, 地址发生器模块作为music模块中所定制的音符数据ROM的地址发生器, 分频预置数模块提供分频预置数即给数控分频模块提供计数初值.数控分频模块根据分频预置数输出各个音符所对应的频率.3.1 地址发生器模块地址发生器模块设置了一个8位二进制计数器(计数最年夜值为138), 作为音符数据ROM的地址发生器.每来一个时钟脉冲信号(Clk), 8位二进制计数器就计数一次, ROM文件中的

9、地址也就随着递增, 音符数据ROM中的音符也就一个接一个连续的取出来了.1 地址发生器的VHDL设计这个计数器的计数频率选为4Hz, 即每一计数值的停留时间为0.25秒, 恰为当全音符设为1秒, 四四拍的4分音符继续时间.例如, 地址发生器在以下的VHDL逻辑描述中, “两只老虎”乐曲的第一个音符为“3”, 此音在逻辑中停留了4个时钟节拍, 即1秒时间.那么相应随着法式中的计数器按4Hz的时钟频率作加法计数时, 即随地址递增时, 将从音符数据ROM中将连续取出4个音符“3”通过toneindex3.0端口输向分频预置数模块.这样两只老虎乐曲中的音符就一个接一个的通过toneindex3.0端口

10、输向分频预置数模块.法式如下LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY NoteTabs ISPORT (clk: IN STD_LOGIC;ToneIndex:OUT STD_LOGIC_VECTOR (3 DOWNTO 0);END;ARCHITECTURE one OF NoteTabs ISCOMPONENT MUSICPORT (address:IN STD_LOGIC_VECTOR(7 DOWNTO 0);inclock:IN STD_LOGIC;q:END COMP

11、ONENT;SIGNAL Counter:STD_LOGIC_VECTOR (7 DOWNTO 0);BEGINCNT8:PROCESS(clk,Counter)IF Counter=138 THEN Counter=00000000;ELSIF (clkEVENT AND clk=1) THEN CounterCounter,q=ToneIndex,inclock=clk);END one;法式的功能是每来一个时钟, 地址值递增1, 并将这个地址上所存储的音符数据输出.当Clk来了一个时钟脉冲, 输出相应地址上的音符3, 地址值递增1;接下来的三个时钟脉冲来时, 输出也是音符3, 地址连续递

12、增3次;再下一个脉冲来时, 输出为音符5等等都符合模块中的音符数据文件中的地址/数据表. 分频预置数模块分频预置数模块是乐曲简谱码对应的分频预置数查表电路.它提供了每个音符所对应的分频预置数, 即给数控分频模块提供计数初值, 以”两只老虎”乐曲为例, 列出了在这个乐曲中所用到的13个音符的分频预置数.1 分频预置数模块的VHDL设计在这个模块的VHDL逻辑描述中设置了“两只老虎”乐曲中全部音符所对应的分频预置数, 共13个, 每一音符的停留时间由音乐节拍和地址发生器模块的时钟(Clk)的输入频率决定, 在此为4Hz.这13个值的输出由法式的4位输入值index3.0确定.输向法式4中index

13、3.0的值又由地址发生器模块的输出toneindex3.0的输出值和继续时间决定.法式如下:library ieee;use ieee.std_logic_1164.all;entity tonetaba isport(index:in std_logic_vector(3 downto 0); code:out std_logic_vector(3 downto 0); high:out std_logic; tone:out std_logic_vector(10 downto 0);end entity tonetaba;architecture one of tonetaba isbe

14、ginsearch:process(index)case index iswhen0001=tone01100000101codehighnull;end case;end process;end one;模块的功能是输出各个音符所对应的分频预置数, 当index是“0000”, tone输出为2047, 即休止符的分频预置数;当index是“0101”时, tone输出为1197即高音5的分频预置数;当index是“1111”时, tone输出为1728即高音1的分频预置数等等其它状态时, tone分别输出相应音符的分频预置数. 数控分频模块音符的频率由数控分频模块获得, 这是一个数控分频电

15、路.它是由一个初值可变的加法计数器构成.该计数器的模为2047, 当计数器记满时, 计数器发生一个溢出信号FULL, 此溢出信号就是用作发音的频率信号.在计数器的输入端给定分歧的初值, 而此预置数就是表1中的计数初值, 就可获得分歧音符的发音频率信号.它计满时所需要的计数初值可由下式来暗示.计数初值(Tone)=2047分频系数而分频系数又可有下式来求:分频系数=基准频率/音符的发生频率高音时Tone值小, 分频系数年夜, 溢出信号周期长, 扬声器发出的声音低, Tone随音乐的乐谱变动年夜, 自动控制分频比, 实现了数控分频, 发生信号的频率与音调Tone成正比.这就是利用数控分频器自动演奏

16、音乐的原理.1 数控分频模块的VHDL设计其时钟(Clk)端输入的是12MHz的信号, 从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号, 为了有利于驱动扬声器, 需另加一个D触发器以均衡其占空比, 这时的频率就酿成原来的1/2, 刚好就是相应音符的频率.数控分频模块中对Clk输入信号的分频比由11位预置数tone10.0决定.Fout的输出频率将决定每一个音符的音调, 这样, 分频计数器的预置值tone10.0与Fout的输出频率就有了对应关系.例如在分频预置数模块中若取tone10.0=1036, 将发出音符为“3”音的信号频率.法式如下:use ieee.std_logic_unsig

17、ned.all;entity speakera isport(clk: in std_logic; in std_logic_vector(10 downto 0); spks: out std_logic);end entity speakera;architecture one of speakera issignal preclk,fullspks: std_logic;divideclk: process(clk)variable count4: std_logic_vector(3 downto 0);preclk11 then preclkcount4:0000elsif clke

18、vent and clk= then count4:=count4+1;end if;genspks: process(preclk,tone)-11variable count11: std_logic_vector(10 downto 0);if preclkevent and preclk=thenif count11=16#7ff#then count11:=tone;fullspkselse count11:=count11+1;delayspks: process(fullspks)variable count2:if fullspksevent and fullspks= the

19、n count2:=not count2;if count2= then spkselse spksmegawizard plug-in manager, 选择“creat a new”, 然后按“next”键, 进入图2所示界面.选择LPM-ROM;最后在browse下的栏中键入路径与输出文件名:“D:mucic.vhd”, 注意后缀vhd小写.图3 选择路径(2)单击“next”键, 将呈现图3所示的界面, 选择ROM数据位宽度为4, 地址线宽为8, 即设置此ROM能存储8位二进制数据共64个, 然后进入图4所示的窗口.(3)通过在图4所示窗口的“browse”钮, 找ROM中的加载文件路

20、径和文件名:alteraQuartusIImusic.mif”, 注意ROM元件的inclock文件名:alteraQuartusIImusic.mif”, 注意ROM元件的inclock是地址锁存钟.此模块的功能是输出相应地址上所存储的音符数据, 当address是0、1、2、3时, q的输出是3;当address是4、5、6时, q的输出是5;当address是7时, q的输出是6等等都符合模块中的音符数据文件中的地址/数据表.这里必需选择AUTO和Dual clock:used separate input and outputClocks选项图4 芯片的选择(4)单击“next”键,

21、将呈现图5所示的界面, 选择允许在线编程, 地址线宽为8, 即设置此ROM能存储8位二进制数据共64个, 通过在图4所示窗口的“browse”钮, 找ROM中的加载文件路径和文件名:alteraQuartusIImusic.mif”, 注意ROM元件的inclock是地址锁存钟, 然后单击Next完成LPM_ROM的定制.如下图所示:图5 选择是否在线编程顶层文件法式如下:ENTITY Songer IS PORT (CLK12MHZ:CLK8HZ: CODE1: OUT STD_LOGIC_VECTOR (3DOWNTO 0);HIGH1: OUT STD_LOGIC; SPKOUT: OU

22、T STD_LOGIC);END ENTITY Songer;ARCHITECTURE one OF Songer IS COMPONENT NoteTabs PORT (clk: ToneIndex: OUT STD_LOGIC_VECTOR (3 DOWNTO 0);COMPONENT ToneTabaPORT (Index: IN STD_LOGIC_VECTOR (3 DOWNTO 0); CODE: OUT STD_LOGIC_VECTOR (3 DOWNTO 0); HIGH:Tone: OUT STD_LOGIC_VECTOR (10 DOWNTO 0);COMPONENT Sp

23、eakera Tone: OUT STD_LOGIC_VECTOR (10 DOWNTO 0); SpkS: out STD_LOGIC);SIGNAL Tone: STD_LOGIC_VECTOR (10 DOWNTO 0);SIGNAL ToneIndex: STD_LOGIC_VECTOR (3 DOWNTO 0); NoteTabs PORT MAP(clk=CLK8HZ,ToneIndex=ToneIndex);u2:ToneTabaPORTMAP(Index=ToneIndex,Tone=Tone,CODE=CODE1,HIGH=HIGH1);u3:SpeakeraPORTMAP(clk=CLK12

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2