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

加入VIP,免费下载资源
 

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

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

下载须知

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

版权提示 | 免责声明

本文(简易电子琴设计-可编程逻辑设计实践课程报告.doc)为本站会员(精***)主动上传,沃文网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知沃文网(发送邮件至2622162128@qq.com或直接QQ联系客服),我们立即给予删除!

简易电子琴设计-可编程逻辑设计实践课程报告.doc

1、基于FPGA的简易电子琴设计报告3一、设计简介3二、方案论述41)、基本乐理知识:42)、模块方案:41、数控分频部分:4各音阶频率对应的分频值以及初始化52、音乐节拍产生器:53、键盘输入及译码模块64、音量控制模块:75、数码管显示模块:8三、总体结构框图:8四、单元模块设计81、键盘输入译码模块ToneData82、播放速度控制模块(包括暂停功能):103、自动演奏模块114、分频器模块(Speaker):145)、数码管显示译码模块156)、数码管动态扫描模块167、音量调节18五、系统测试20六、设计总结23基于FPGA的简易电子琴设计报告一、设计简介本次的课程设计是围绕着可编程逻辑

2、器件进行的,可编程器件强大的并行性能使得其能轻易实现许多顺序执行程序的功能,并且效率高得多,但由顺序执行的思想转化为并行的思维方式,并不是那么容易的。通过这次课程设计熟悉了FPGA设计的思路与方法,为将来的进一步发展奠定了基础。本次选择电子琴为课题,并不仅仅因为其较为简单,而是基于个人对于音频等多媒体信息处理的兴趣,希望通过此次课程设计收获些相关的知识。本次课设设计的电子琴主要实现了以下功能:1、 手动演奏功能。共用到8个按键,其中1个为shift键,用于切换不同组的音符。Shift置零时,其余七个按键为中音Do至Xi。Shift置高时,其余七个按键为低音的So La Xi和高音的Do Re

3、Mi Fa。2、 自动演奏功能。内部可识别21个音符,rom容量为512位,字宽为5位(031)。其中用0表示休止符。17表示低音DoXi,1117表示中音DoXi,2131用于表示高音DoXi。其余未使用,用于日后扩展功能。内置两首歌曲,一首占256个rom空间。3、由song键选择歌曲(高电平为歌曲0,低电平为歌曲1)。 由auto键选择手动演奏模式或自动播放模式(高电平为自动播放模式,低电平为手动演奏模式)。 由back键控制前进或者倒退播放,D1,D0键控制播放速度。Back与D1,D0按键配合可以构成快进快退,暂停播放功能。功能如下:backD1D0功能*11暂停000正常速播放00

4、11.5倍速播放0102倍速播放100正常速倒退1011.5倍速快退1102倍速倒退4、 音量调整功能。可实现音量的渐变,由于按键有限,设置了8级音量,由Volume2Volume0按键控制,三个按键为111时音量最大,三个按键为000时为静音模式。此模块用了脉冲调制与DA转换两种方式实现。5、 数码管动态扫描显示音符音高音量。二、方案论述1)、基本乐理知识:由于组成乐曲的每个音符的频率值(音调)及其持续时间(音长)是乐曲演奏的基本数据,因此需要控制输出到扬声器的激励信号的频率高低和该频率持续的时间。频率的高低决定了音调的高低,而乐曲的简谱与各音名的频率对应关系如下表所示:所有不同频率的信号都

5、是从同一基准频率分频而来的。 由于音节频率多为非整数, 而分频系数又不能为小数,故必须计算得到的分频系数进行四舍五入取整, 并且其基准频率和分频系数应综合加以选择, 从而保证音乐不会走调。 2)、模块方案:1、数控分频部分:由乐理知识可知,对电子琴声音的操作即对音乐频率以及音乐持续时间的操作。整体采用一个基准频率,基准频率经各个分频器产生的频率不应与简谱中各个音调的频率差别太大,基频太低则误差太大,基频太高则分频器过于复杂,因此因综合各方面考虑。由于简谱中最高音不超过2k,取所有音的最小公倍数便可。但人耳的精度,故只要保证各音名的相对频率不变即可。由可得各个音色的分频系数。采用N位的分频器的话

6、,则初始化时计数器的值应为:-1本实验采用12M时钟频率,预先进过16分频,为减少偶次谐波,展宽脉冲,在扬声器之前要进过一个2分频电路,故可得下表:各音阶频率对应的分频值以及初始化(12M,预16分频,再经2分频展宽)音名频率初始值音名频率初始值音名频率初始值低音1261.36612 中音1532.251342 高音11046.51689 低音2293.67770 中音2587.331409 高音21174.661728 低音3329.63909 中音3659.251478 高音31318.511763 低音4349.23973 中音4698.461510 高音41396.921779 低音5

7、391.991090 中音5783.991569 高音51567.981808 低音64401195 中音68801621 高音617601834 低音7493.881288 中音7987.761667 高音71975.521857 注:对于音乐中的休止符,其分频系数设为0,初始值设为2N-1即可(此处为2047)。音量调整12M CLK计数器初始值数控分频电路2、音乐节拍产生器:在音乐中,时间被分成均等的基本单位,每个单位叫做一个“拍子”或 称一拍。拍子的时值是以音符的时值来表示的,一拍的时值可以是四分音符(即以四分音符为一拍),也可以是二分音符(以二分音符为一拍)或八分音符(以八分音符为一

8、拍)。故设置一个4Hz的时钟,每一次计数停留的时间为0.25s,即最小节拍。并经一个二进制计数器进行计数,将计数器的值作为ROM的地址进行寻址,这样便可以读出储存在ROM中的乐谱了。当要实现快进、快退、播放、暂停功能时:设置两个播放速度控制键,调整播放的速度,实现快进,快退中“快”的功能。设置一个正序/逆序播放按键,正序时地址递增,实现“进”的功能,逆序时地址递减,实现“退”的功能。这两组按键配合即可实现快进,快退,暂停,播放功能。因为要求有自动演奏功能和键盘弹奏功能,所以设置一个开关auto对其模式进行选择。考虑到总线的抢占问题,所以要在合适的时候输出高阻态,让出总线控制权。自动播放键节拍频

9、率输入播放控制按键由播放控制按键决定分频比,正常播放时为4Hz,内含地址产生器和储存音乐的ROM各个音调对应的计数器初值由自动播放键控制使能,当自动播放键按下时,正常输出,当未按下时,输出高阻态。3、键盘输入及译码模块此模块实际为一个查表模块,对于不同的按键输入,从表中读取相应的分频值及计数器初始化值,由节拍发生器决定其停留时间,改变节拍可改变演奏音符延时长短,将其输出给数控分频器,即可得到相应的声音。节拍输入键盘按键根据键盘信号查表输出各音调初始值各个音调对应的计数器初值自动播放键由自动播放键控制使能,当自动播放键按下时,输出高阻态,当未按下时,正常输出。节拍选择4、音量控制模块:方案一:进

10、过数控分频模块输出的是占空比为50%的脉冲信号,可直接接入麦克风便可以了。为了实现音量调控,可将输出信号与以高频信号相乘,改变其占空比,占空比改变之后,输出功率也随之改变,响度也随之改变。负面影响是会加入一个高次的载波。所以载波频率不能太低(20kHz),否则喇叭输出会有噪声。改变高频信号的占空比即改变了音频信号的占空比,从而改变音频信号的功率,实现声音的多级可调。示意图如下:音频输入音量调控键喇叭音量值输出音量调整模块,通过高频信号与音频信号相乘从而改变其占空比方案二:通过DA0809进行数模转换,将输出的值转为模拟量输出,同样也可得到调节音量的效果。5、数码管显示模块:可从计数器的初始值逆

11、推得到相对应的音色音高,从音量控制模块获得相关的音量信息。数码管以动态显示的方式输出相应的信息,在极短的时间片段中只点亮一个数码管。计数器初值音量值输入数码管译码及动态显示音符音高音量三、总体结构框图:分频输出模块自动播放控制手动播放控制按键输入音量调整数码管显示喇叭 系统分为输入部分,主控部分,音量调整部分和数码管显示部分。主控部分为核心,同时也是最花时间的部分,其包括模式选择,总线分配,系统编码译码,分频控制等部分,是整个电子琴的心脏,因此此模块的实现至关重要。各模块功能已在前文中具体阐述,后文将阐述各模块的具体实现。四、单元模块设计1、键盘输入译码模块ToneDatalibrary ie

12、ee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;USE IEEE.STD_LOGIC_ARITH.ALL;-为增加易读性,用到了conv_std_logic_vector函数ENTITY ToneData IS PORT( key_in: in std_logic_vector(7 downto 0); code : out std_logic_vector(3 downto 0); auto : std_logic; Tone : out std_logic_vector(10 downto 0);end enti

13、ty;ARCHITECTURE one OF ToneData IS beginprocess(key_in) begin if auto = 0 then-模式判断 case key_in is-键盘判断 when 00000000|10000000=Tone=conv_std_logic_vector(2047,11);codeTone=conv_std_logic_vector(1342,11);codeTone=conv_std_logic_vector(1409,11);codeTone=conv_std_logic_vector(1478,11);codeTone=conv_std

14、_logic_vector(1510,11);codeTone=conv_std_logic_vector(1569,11);codeTone=conv_std_logic_vector(1621,11);codeTone=conv_std_logic_vector(1667,11);codeTone=conv_std_logic_vector(1090,11);codeTone=conv_std_logic_vector(1195,11);codeTone=conv_std_logic_vector(1288,11);codeTone=conv_std_logic_vector(1689,1

15、1);codeTone=conv_std_logic_vector(1728,11);codeTone=conv_std_logic_vector(1763,11);codeTone=conv_std_logic_vector(1779,11);code Tone=11111111111; end case; else Tone = ZZZZZZZZZZZ;-高阻态输出 end if;end process; end one;说明:这是一个简单的译码模块,通过选择key_in的值确定键盘的输入,从而根据预先算好的分频器的初始值赋予Tone,作为下一级模块的输入,同时注意到总线的占用问题,所以当

16、未选择手动演奏模块时(auto为1时),输出高阻态,让出总线控制权。仿真输出结果:可见对于不同的输入,此模块都有正确的译码输出。2、播放速度控制模块(包括暂停功能):library ieee;-实际即是一个2位的数控分频器use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity DVF is port ( clk : in std_logic; d : in std_logic_vector(1 downto 0);-输入控制端 fout : out std_logic );-D触发器输出脉冲end entity;ar

17、chitecture one of DVF is signal full : std_logic; begin P1: process (clk) variable cnt2 : std_logic_vector(1 downto 0); begin if clkevent and clk = 1 then if cnt2 = 11 then cnt2 := d; - D被同步预置给计数器cnt8 full = 1; -同时是使溢出标志信号full输出为高电平 else cnt2 := cnt2 + 1; -否则继续作加1计数 full = 0; - 且益处信号为低电平 end if ; en

18、d if ; end process P1; P2: process(full) variable cnt : std_logic; begin if fullevent and full = 1 then cnt := not cnt; -如果益处标志信号full为高电平,D触发器输出取反 if cnt = 1 then fout = 1 ; else fout = 0; end if; end if ; end process P2;end one ;程序说明:此为一个2位预置数的分频模块和一个D触发器的组合,起到控制播放速度的作用,当d=”11”时,无分频信号输出,起到暂停的作用。由于正

19、常播放音乐时频率为4hz,所以此模块的输入时钟为32hz。仿真波形:3、自动演奏模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;USE IEEE.STD_LOGIC_ARITH.ALL;entity notetabs isport( clk,auto,back,song,pause: in std_logic; Toneindex : out std_logic_vector(10 downto 0);end entity;architecture one of notetabs is com

20、ponent romport(address : in std_logic_vector(8 downto 0); inclock : in std_logic; q : out std_logic_vector(4 downto 0);end component;-声明ROM模块signal counter: std_logic_vector(8 downto 0);-地址发生器,512位signal tone :std_logic_vector(4 downto 0);-输出音符signal temp :std_logic_vector(1 downto 0);begincnt8 : pr

21、ocess(clk)begin temp counter = counter+1;if counter(8)= 1 then counter counter = counter-1;if counter(8)= 1 then counter counter = counter+1;if counter(8)= 0 then counter counter = counter-1;if counter(8)= 0 then counternull;-判断最高位,决定切换歌曲以及歌曲的循环 end case; end if; end process;decoder:process(tone)-从r

22、om取出数据进行译码,作为下一级的输入 begin if auto = 1 then-判断自动/手动模式 if pause =1 then Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex Toneindex ToneindexToneindex=c

23、onv_std_logic_vector(2047,11); end case; end if;-译码,Toneindex为分频器的初值 else Toneindex counter,q=tone,inclock=clk);end;程序说明:此模块有4个控制输入信号。Auto键,手动/自动模式切换按键。Back,倒退播放按键。Song,歌曲选择按键。Pause,暂停按键,与控制播放速度的d1,d0连接,通过一与门接入此模块,当d1,d0为11时,pause输入为1,此时此模块无输入脉冲(DVF模块阻止了脉冲),若不加处理,此时将一直输出暂停之前的一个音符,所以利用pause信号,当暂停时,输出

24、休止符。此模块的程序分为三部分:第一部分为内部rom的连接,利用MigaWizard Plug-in Manager生成ROM的软核嵌入到此模块中,counter与rom的地址线相连接,rom的输入端与器件的tone管脚相连接,便可在tone上获取rom的信息。第二部分为地址控制部分,但接收到脉冲上升沿时,根据外部输入(auto和back),决定rom的首地址(counter的初值)和counter的变化方式(递增或递减或暂停)以及切换歌曲时的地址切换。第三部分为decoder译码部分,从rom中取得数据后需要经过译码成为分频器的初始值后作为下一级的输入信号。MegaWizard Plug-I

25、n Manager设置截图(右):Rom内数据截图,部分(下):4、分频器模块(Speaker):LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY SPEAKER ISPORT(CLK : IN STD_LOGIC;-12M脉冲输入 Tone_in: IN STD_LOGIC_VECTOR (10 DOWNTO 0);-11位预置数输入端 Spks: OUT STD_LOGIC);-音频信号输出端END ENTITY;ARCHI

26、TECTURE ONE OF SPEAKER ISSIGNAL PreCLK,FullSpks:std_logic;BEGINDivideCLK:PROCESS(CLK)-预16分频variable count4 : std_logic_vector(3 downto 0);BEGIN PreCLK = 0; IF count4 = 15 THEN PreCLK = 1;count4 := 0000; elsif clkevent and clk = 1 then count4:=count4+1; end if;END PROCESS;GenSpks:PROCESS(PreCLK,Tone_

27、in)-根据预置数分频variable count11:std_logic_vector(10 downto 0);begin if PreCLKevent and PreCLK = 1 then if count11 =16#7FF# then count11:=Tone_in; FullSpks = 1; else count11:= count11+1;FullSpks=0; end if; end if;end process;DelaySpks:PROCESS(FULLSPKS)-2分频展宽脉冲VARIABLE COUNT2:STD_LOGIC;BEGIN IF FULLSPKSEV

28、ENT AND FULLSPKS = 1 THEN COUNT2:=NOT COUNT2; IF COUNT2 = 1 THEN SPKS=1; ELSE SPKS D1=conv_std_logic_vector(0,4);D0 D1=conv_std_logic_vector(0,4);D0 D1=conv_std_logic_vector(0,4);D0 D1=conv_std_logic_vector(0,4);D0 D1=conv_std_logic_vector(0,4);D0 D1=conv_std_logic_vector(0,4);D0 D1=conv_std_logic_v

29、ector(0,4);D0 D1=conv_std_logic_vector(1,4);D0 D1=conv_std_logic_vector(1,4);D0 D1=conv_std_logic_vector(1,4);D0 D1=conv_std_logic_vector(1,4);D0 D1=conv_std_logic_vector(1,4);D0 D1=conv_std_logic_vector(1,4);D0 D1=conv_std_logic_vector(1,4);D0 D1=conv_std_logic_vector(2,4);D0 D1=conv_std_logic_vect

30、or(2,4);D0 D1=conv_std_logic_vector(2,4);D0 D1=conv_std_logic_vector(2,4);D0 D1=conv_std_logic_vector(2,4);D0 D1=conv_std_logic_vector(2,4);D0 D1=conv_std_logic_vector(2,4);D0D1=conv_std_logic_vector(0,4);D0=conv_std_logic_vector(0,4); end case;end process;end one; 程序说明:此程序通过预置数的值反推出其所代表的音符,同时由D1输出音

31、量高低信息,由D0输出音符信息。6)、数码管动态扫描模块LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;use ieee.std_logic_unsigned.all;entity LEDSCAN isport(CLK:in std_logic; S:OUT STD_LOGIC_VECTOR(2 DOWNTO 0); D3:IN STD_LOGIC_VECTOR(3 DOWNTO 0); D2:IN STD_LOGIC_VECTOR(3 DOWNTO 0); D1:IN STD_LOGIC_VECTOR(3 DOWNTO 0); D0:IN STD_LOGIC

32、_VECTOR(3 DOWNTO 0); A:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);end LEDSCAN;architecture ONE of LEDSCAN isSIGNAL C:STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL D:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINP1:PROCESS(CLK) BEGINIF CLKEVENT AND CLK=1THEN IF C011THEN C=C+1;ELSE C=000; END IF; END IF; S D D D D NULL;END CASE;END PROCESS P1;P2:PROCESS(D)BEGIN CASE D ISWHEN 0000= A A A A A=

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922