




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数电实验报告题 目 基于FPGA的八音符电子琴电路设计 时 间 2011年6月25日 第一章 实验任务与原理一、实现功能基于FPGA开发办设计一个八音符电子琴,由键盘输入控制音响或自动演奏。用户可以将自己编制的乐曲存入电子琴,演奏时可以选择键盘输入乐曲或者自动演奏已存入的乐曲。二、原理阐述1、系统设计方案:采用VHDL语言编程来实现电子琴的各项功能。系统主要由电子琴发声模块、选择控制模块和储存器模块组成。分频器NOTETABSTONETABASPEAKERA扬声器译码器 八音符电子琴设计总体框图该系统由三个模块:Songer、Div和SEG7(7段译码器)组成。(1) Songer模块:此模块
2、包括3个小模块,分别是NoteTabs模块,ToneTab模块和Speakera模块。此外,还需建立一个名为“music”的LPM_ROM模块与NoteTabs模块连接。(2) NoteTabs模块:该模块的功能就是定义音符数据ROM“music”随着该模块中的计数器控制时钟频率速率作加法计数时,即地址值递增时,音符数据ROM中的音符数据。将从ROM中通过ToneIndex3.0端口输向ToneTaba模块,演奏采茶舞曲。(3) ToneTaba模块:是乐曲简谱码对应的分频预置数查找表电路,其中设置了乐曲的全部音符所对应的分频置数,每一音符的停留时间由音乐节拍和音调发生器模块NoteTabs的
3、CLK的输入频率决定,这些值由对应于ToneTaba的4位输入值Index3.0确定,最多有16种可选值。输向ToneTaba中Index3.0的值ToneIndex3.0的输出值与持续的时间由模块NoteTabs决定。(4) Speakera模块:是一个数控分频器,音符的频率可由此模块获得。由CLK端输入一具有较高频率的信号,通过Speakera分频后由SPKOUT输出。由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号。为了利用驱动扬声器,需加一个D触发器以均衡其占空比,频率将是原来的1/2。Speakera对CLK输入信号的分频比由预置数Tone决定。SPKOUT的输出频率将决定
4、每一音符的音调。(5) Div模块:由于所使用的硬件设备不能满足设计所需要的两个CLK输出 的频率,所以使用一个分频器来实现把一个50MHz的晶体振荡频率分成一个12MHz,一个8Hz两个分频率,再把两个频率分别给所需的两个模块。(6)EG7模块:SEG7 模块是一个七段译码器,作用是在硬件上显示音频的高低,用0到7分别对应空节拍do、ri、mi、fa、suo、la、xi,高音时,LED灯亮,数码管显示对应数字。2、发音原理:(1) 乐曲演奏的原理组成乐曲的每个音符的频率值(音调)及其持续时间(音长)是乐曲能连续演奏所需的两个基本数据,因此只要控制输出到扬声器的激励信号的频率的高低和持续时间,
5、就可以使扬声器发出连续的乐曲声。(2)音调的控制: 频率的高低决定了音调的高低。(4)基准频率f0的选取 所有不同频率的信号都是从同一个基准频率f0分频而得到的。由于音节频率多为非整数,而分频系数又不能为小数,因此必须将计算所得的分频数四舍五入取整。若基准频率过高,则分频比太小,取整后误差较大。若基准频率过高,虽然误差减小,但分频数变大。综合这两方面因素,在尽量减小频率误差的前提下取合适的基准频率,在此取f0=12MHz。(5)分频系数,二进制计数器计数的容量N和预置数的选取 分频系数A=f0/音名频率分频系数n=f0/音名频率/2N=MAX分频系数n 由表1可得最大分频系数为1274,因此N
6、=2048为2的11次方。因此二进制计数器设为11位二进制加法计数器,其计数容量为2048,计数的最大值为2047。预置数=N-分频系数n表1为各音阶的频率、对应的分频系数及预置数:(6)音长的控制:音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定的。采茶舞曲中最短的音符为四分音符,如果全音符的持续时间为1s,则四分音符的持续时间为0.25s,二分音符持续的时间为0.5s等等,只需再提供一个4Hz的时钟频率。每来一个脉冲计一次数,每一计数值的停留时间为0.25s,即要输入一个全音符时需要计四次数才行,则应在Rom表格中输出相应音符四次,表示一个全音符的持续时间。第二章 FPGA模块程序设
7、计与仿真1、Songer模块Songer模块由三个模块组成:NoteTabs模块,ToneTaba模块和Speakera模块。Notetabs模块类似于弹琴人的手指,Tonetaba类似于琴键,Speakera类似于琴弦或音调发生器。(1)NoteTabs模块:原理:在这个模块中设置了一个8位二进制计数器,作为音符数据ROM的地址发生器。这个计数器的计数频率选为4HZ,即每一计数值的停留时间为0.25秒,当全音符设为1秒时,4分音符持续时间为0.25s, 2分音符持续的时间为0.5s等等。每来一个脉冲计一次数,每一计数值的停留时间为0.25s,即要输入一个全音符时需要计数4次才行,则应在Rom
8、表格中输出相应音符四次,表示一个全音符的持续时间,要输入一个2分音符则需要计数2次,依次类推。程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee。Std_logic_arith.all;entity notetabs is port(clk1:in std_logic; toneindex:out std_logic_vector(3 downto 0);End notetabs;architecture one of notetabs iscomponent music po
9、rt(address:in std_logic_vector(7 downto 0); clock:in std_logic; q:out std_logic_vector(3 downto 0);end component; signal counter:std_logic_vector(7 downto 0);begincnt8:process(clk1,counter) begin if counter=336 then counter<="00000000" elsif(clk1'event and clk1='1')then coun
10、ter<=counter+1; end if; end process;u1:music port map(address=>counter,q=>toneindex,clock=>clk1);end;NoteTabs模块波形仿真图:(注:每来一个时钟clk,输出一个相应的数,每个音符的拍子不一样所记次数也不一样)图5 Notetabs的波形仿真图采茶舞曲简谱如图6图6 采茶舞曲简谱下表7是Rom表格:(即为此程序中调用的music模块)。表7 Rom表格(2)ToneTaba模块:原理:ToneTaba是乐曲简谱码对应的分频预置数查表电路。音符的持续时间需要根据乐曲的
11、速度及每个音符的节拍数来确定,Tonetaba的功能首先是为Speakera提供决定所发音符的分频预置数,而此数在Speakera输入口停留的时间为此音符的节拍值。模块Tonetaba是乐曲简码对应的分频预置数查表电路,其中设置了采茶舞曲乐曲全部音符所对应的分频预置数,共16 个,每一音符的停留时间由音乐节拍和音调发生器模块Notetabs的clk的输入频决定,在此为4Hz。这16个值得输出由对应于Tonetaba的4位输入值Index3.0确定。输向Tonetaba中Index3.0的值,ToneIndex3.0的输出值与持续的时间由模块Notetabs决定。程序library ieee;u
12、se ieee.std_logic_1164.all;use ieee,std_logic_arith.all;use ieee.std_logic_unsigned.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 ToneTaba;architecture one of ToneTaba i
13、s beginSearch: process(Index)begincase Index is When "0001"=>tone<="01100000101"code<="0001"high<='0'-773When "0010"=>tone<="01110010000"code<="0010"high<='0'-912When others => null; end case;end p
14、rocess;end;(注:每一个index的值都对应一个code,tone值,index的值从0000到0111对应的,high为低电,从1000到1111对应的high为高电。)ToneTaba模块波形仿真图如图10:图10 Tonetaba的波形仿真图(3)Speakera(数控分频器)模块:原理:数控分频器的功能是当在输入端给定不同的输入数时,将对输入的时钟信号有不同的分频比,数控分频器是用计数值可并行预置的加法计数器来完成的。在此,音符的频率可由数控分频器Speakera获得。由其clk端输入一具有较高频率的信号,通过Speakera分频后由 Spkout 输出,由于直接从数控分频器
15、中出来的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,需加一个D触发器以均衡其占空比,但这时的频率将是原来的1/2。Speakera对clk输入信号的分频比由11位预置数Tone10.0决定。Spkout 的输出频率将决定每一音符的音调,这样分频计数器的预置值Tone10.0与Spkout的输出频率就有了对应关系。程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity speakera is port(clk2:in s
16、td_logic; tone:in std_logic_vector(10 downto 0); spks:out std_logic);end speakera;architecture one of speakera is signal preclk,fullspks:std_logic;begin divideclk:process(clk2) variable count4:std_logic_vector(3 downto 0); begin preclk<='0' if count4>11 then preclk<='1' coun
17、t4:="0000" elsif clk2'event and clk2='1' then count4:=count4+1; end if; end process; genspks:process(preclk,tone) variable count11:std_logic_vector(10 downto 0); begin if preclk'event and preclk='1' then if count11=16#7FF# then count11:=tone; fullspks<='1'
18、; else count11:=count11+1; fullspks<='0' end if; end if; end process; delayspks:process(fullspks) variable count2:std_logic; begin if fullspks'event and fullspks='1' then count2:=not count2; if count2='1' then spks<='1' else spks<='0' end if; end
19、if; end process;end;Speakera(数控分频器)模块仿真波形如图12:图12 Speakera的波形仿真图2、Div模块:原理:由于我们所使用的硬件设备不能满足我们所需要的两个CLK输出的频率,所以我们使用一个分频器来实现把一个50MHz的晶体振荡频率分成一个12MHz,一个8Hz两个分频率,再把两个频率分别给所需的两个模块。程序:LIBRARY ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;ENTITY div IS PORT(
20、clk :IN STD_LOGIC; CLK12MHz,CLK8Hz: OUT std_logic);END div;ARCHITECTURE one of div is begin u1:process(clk) variable cnt:integer range 0 to 2; variable tmp:std_logic; begin if(clk'event and clk='1')then if cnt>=1 then cnt:=0; tmp:=not tmp; else cnt:=cnt+1; end if; end if; CLK12MHz<
21、=tmp; end process u1; u2:process(clk) variable cnt:integer range 0 to 3125000; variable tmp:std_logic; begin if(clk'event and clk='1')then if cnt>=3124999 then cnt:=0; tmp:=not tmp; else cnt:=cnt+1; end if; end if; CLK8Hz<=tmp; end process u2;end one;Div模块波形仿真图如图14: 图14 Div的波形仿真图(注
22、:由50MHz的时钟信号分频得到CLK12MHz,CLK12MHz)3、SEG7模块:原理: SEG7 模块是一个七段译码器,作用是在硬件上显示音频的高低,用0到7分别对应空节拍do、ri、mi、fa、suo、la、xi,高音时,LED灯亮,数码管显示对应数字。VGA为0010。 程序:library ieee; use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee std_logic_arith.all;ENTITY SEG7 IS PORT(num:IN std_logic_vector(3 downto
23、0); A:OUT std_logic; B:OUT std_logic; C:OUT std_logic; D:OUT std_logic; E:OUT std_logic; F:OUT std_logic; G:OUT std_logic; DP:OUT std_logic );END SEG7;ARCHITECTURE fun OF SEG7 ISsignal led:std_logic_vector(6 downto 0);BEGIN A<=led(6); B<=led(5); C<=led(4); D<=led(3); E<=led(2); F<=
24、led(1); G<=led(0); DP<='0' led<="1111110"when num="0000"else "0110000"when num="0001"else "1101101"when num="0010"else "1111001"when num="0011"else "0110011"when num="0100"else "
25、1011011"when num="0101"else "1011111"when num="0110"else "1110000"when num="0111"else "1111111"when num="1000"else "1111011"when num="1001"else "1110111"when num="1010"else "001111
26、1"when num="1011"else "1001110"when num="1100"else "0111101"when num="1101"else "1001111"when num="1110"else "1000111"when num="1111"END fun;SEG7模块波形仿真如图17: 图17 Seg7的波形仿真图(0000-1000)( 注:当nums输入0000-1000时,A
27、-H输出0-8的相应值) 图17 Seg7的波形仿真图1001-1111)(nums输入1001-1111时,A-H输出916的相应值)4、 总体设计电路图(1)顶层设计的电路原理图如图18:图18 顶层设计的电路原理图原理:Notetabs中按Rom表格中已填好的乐曲输出一谱子,转化为相应的二进制数输出,再将输出的二进制数输入Tonetaba中,转化为相应的预置数输入数控分频器Speakera中进行分频并输出,输出接扬声器用于发音。从Notetabs中输出的二进制数也将对应于Tonetaba中的二进制数,输出接数码显示管用于显示所发音的简码,还有一个高低音的输出连接一个Led灯,灯亮表示高音
28、,灯暗表示低音。Songer模块就是顶层设计文件,所有的模块都由它调用。Songer模块的程序为:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity songer is port(clk8HZ,clk12MHZ:in std_logic; num:out std_logic_vector(3 downto 0); high1:out std_logic; spkout:out std_logic);end entity songer;architecture one of songer i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025双方协商解除租赁合同答辩状
- 护理绩效考核与管理
- 石场与农户合同范本
- 京东企业并购合同范本
- 网络改造合同范本
- 房子出兑合同范本
- 2025转让合同附义务范本
- 过期食品购销合同范本
- 护具用品订购合同范本
- 退休返聘合同范本2017
- 建筑公司分包合同管理办法
- 2025至2030苏打水行业发展趋势分析与未来投资战略咨询研究报告
- 2025年秋季学期德育工作计划:向下扎根向上开花
- 2025-2030中国家政服务行业信用体系建设与服务质量监管报告
- 2025年安徽省普通高中学业水平选择性考试(物理)科目高考真题+(答案解析版)
- 2025年成都东部集团有限公司及下属企业招聘考试笔试试卷【附答案】
- 各分项工程质量保证措施
- 国税编制管理办法
- 特种畜禽管理办法
- 消防员心理健康教育课件教学
- 医院学术委员会组织职责
评论
0/150
提交评论