当前位置:文档之家› 硬件电子琴电路设计

硬件电子琴电路设计

江西理工大学应用科学学院SOPC/EDA综合课程设计报告设计题目:硬件电子琴电路设计设计者:学号:班级:指导老师:***完成时间:2011-1-04设计报告综合测试总评格式(10)内容(40)图表(10)答辩(20)平时(20)目录一、设计任务与要求 (1)二、总体框图 (2)三、选择器件 (5)四、功能模块 (6)1.Songer模块 (6)1.1NoteTabs模块 (6)1.2ToneTaba模块 (11)1.3Speakera模块 (13)2.div模块 (16)3.七段译码器模块 (18)五、总体设计电路图 (21)1.顶层设计的电路原理图 (21)2.顶层设计的仿真结果 (23)3.电路的管脚图 (23)六、结束语 (24)七、心得体会 (25)硬件电子琴电路设计一、设计任务与要求使用FPGA设计一模拟电子琴键,实现电子琴按键的DO,Re,Mi,Fa,Sol,La,Si等中音以及相应的高音。

二、总体框图系统设计方案:方案一:采用单个的逻辑器件组合实现。

这样虽然比较直观,逻辑器件分工鲜明,思路也比清晰,一目了然。

但是由于元器件种类、个数繁多,而过于复杂的硬件电路也容易引起系统的精度不高、体积过大等不利因素。

例如八个不同的音符是由八个不同的频率来控制发出的,而采用方案一就需要运用不同的分频器来对信号进行不同程度的分频。

所用仪器之多显而易见。

方案二:采用VHDL语言编程来实现电子琴的各项功能。

系统主要由电子琴发声模块、选择控制模块和储存器模块组成。

和方案一相比较,方案二就显得比较笼统,只是把整个系统分为了若干个模块,而不牵涉到具体的硬件电路。

但是我们必须看到用超高速硬件描述语言VHDL的优势,它不仅具有良好的电路行为描述和系统描述的能力而且通俗易懂。

经过对以上两种方案的分析、比较和总结,我们选用方案二来进行八音符电子琴的设计。

”(2). ToneTaba模块:是乐曲简谱码对应的分频预置数查找表电路,其中设置了乐曲的全部音符所对应的分频置数,每一音符的停留时间由音乐节拍和音调发生器模块NoteTabs 的CLK的输入频率决定,这些值由对应于ToneTaba的4位输入值Index[3..0]确定,最多有16种可选值。

输向ToneTaba中Index[3..0]的值ToneIndex[3..0]的输出值与持续的时间由模块NoteTabs决定。

(3). Speakera模块:是一个数控分频器,音符的频率可由此模块获得。

由CLK端输入一具有较高频率的信号,通过Speakera分频后由SPKOUT输出。

由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号。

为了利用驱动扬声器,需加一个D触发器以均衡其占空比,频率将是原来的1/2。

Speakera对CLK输入信号的分频比由预置数Tone决定。

SPKOUT的输出频率将决定每一音符的音调。

2. Div模块:由于所使用的硬件设备不能满足设计所需要的两个CLK输出的频率,所以使用一个分频器来实现把一个50MHz的晶体振荡频率分成一个12MHz,一个8Hz两个分频率,再把两个频率分别给所需的两个模块。

3. EG7模块:SEG7 模块是一个七段译码器,作用是在硬件上显示音频的高低,用0到7分别对应空节拍do、ri、mi、fa、suo、la、xi,高音时,LED灯亮,数码管显示对应数字。

发音原理:(1). 乐曲演奏的原理组成乐曲的每个音符的频率值(音调)及其持续时间(音长)是乐曲能连续演奏所需的两个基本数据,因此只要控制输出到扬声器的激励信号的频率的高低和持续时间,就可以使扬声器发出连续的乐曲声。

(2).音调的控制: 频率的高低决定了音调的高低。

2.1 基准频率f0的选取所有不同频率的信号都是从同一个基准频率f0分频而得到的。

由于音节频率多为非整数,而分频系数又不能为小数,因此必须将计算所得的分频数四舍五入取整。

若基准频率过高,则分频比太小,取整后误差较大。

若基准频率过高,虽然误差减小,但分频数变大。

综合这两方面因素,在尽量减小频率误差的前提下取合适的基准频率,在此取f0=12MHz。

2.2 分频系数,二进制计数器计数的容量N和预置数的选取 :分频系数A=f0/音名频率分频系数n=f0/音名频率/2N〉=MAX{分频系数n}由表1可得最大分频系数为1274,因此N=2048为2的11次方。

因此二进制计数器设为11位二进制加法计数器,其计数容量为2048,计数的最大值为2047。

预置数=N-分频系数n表1为各音阶的频率、对应的分频系数及预置数:(3). 音长的控制:音符的持续时间须根据乐曲的速度及每个音符的节拍数来确定的。

《采茶舞曲》中最短的音符为四分音符,如果全音符的持续时间为1s,则四分音符的持续时间为0.25s,二分音符持续的时间为0.5s等等,只需再提供一个4Hz的时钟频率。

每来一个脉冲计一次数,每一计数值的停留时间为0.25s,即要输入一个全音符时需要计四次数才行,则应在Rom表格中输出相应音符四次,表示一个全音符的持续时间。

三、选择器件1.装有QuartusII软件的计算机一台;2.外置扬声器;3.7段数码管;4.LED灯一个;5.芯片:使用altera公司生产的Cyclone系列芯片,如EP1C12Q240C8芯片;6.EDA实验箱一个;7.下载接口是数字芯片的下载接口(JTAG),主要用于FPGA芯片的数据下载。

Cyclone器件的配置器件:此次设计实验采用ALTERA公司的cyclone系列的FPGA芯片EP1C12,设计和仿真采用ALTERA公司的QUARTUS II软件,EP1C12各项参数参照表2。

表2 EP1C12参数表Cyclone的性能特性:1、新的可编程体系结构,实现低成本设计。

2、嵌入式存储器资源支持多种存储器应用和数字信号处理(DSP)实现3、专用外部存储器接口电路,支持与DDR FCRAM和SDRAM器件以及SDR SDRAM存储器的连接。

4、支持串行总线和网络接口以及多种通信协议片内和片外系统时序管理使用嵌入式PLL5、支持单端I/O标准和差分I/O技术,LVDS信号数据速率高达640Mbps。

6、处理功耗支持Nios II 系列嵌入式处理器7、采用新的串行配置器件的低成本配置方案8、Quartus II 软件OpenCore评估特性支持免费的IP功能评估四、功能模块1)、Songer模块如图3:图3 Songer模块Songer模块由三个模块组成:Note Tabs模块,ToneTaba模块和Speakera模块。

Notetabs模块类似于弹琴人的手指,Tonetaba类似于琴键,Speakera类似于琴弦或音调发生器。

1.NoteTabs模块:原理:在这个模块中设置了一个8位二进制计数器,作为音符数据 ROM的地址发生器。

这个计数器的计数频率选为4HZ,即每一计数值的停留时间为0.25秒,当全音符设为1秒时,4分音符持续时间为0.25s, 2分音符持续的时间为0.5s等等。

每来一个脉冲计一次数,每一计数值的停留时间为0.25s,即要输入一个全音符时需要计数4次才行,则应在Rom表格中输出相应音符四次,表示一个全音符的持续时间,要输入一个2分音符则需要计数2次,依次类推。

NoteTabs模块图如图4:图4 NoteTabs模块程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY NOTETABS ISPORT (CLK1: IN STD_LOGIC;TONEINDEX: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END;ARCHITECTURE ONE OF NOTETABS ISCOMPONENT MUSICPORT (ADDRESS: IN STD_LOGIC_VECTOR (7 DOWNTO 0);CLOCK: IN STD_LOGIC;Q: OUT STD_LOGIC_VECTOR (7 DOWNTO 0));END COMPONENT;SIGNAL COUNTER:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINCNT8:PROCESS (CLK1,COUNTER)BEGINIF COUNTER=336 THEN COUNTER<="00000000";ELSIF (CLK1'EVENT AND CLK1='1')THENCOUNTER<=COUNTER+1;END IF;END PROCESS;END;NoteTabs模块波形仿真图如图5:(注:每来一个时钟clk,输出一个相应的数,每个音符的拍子不一样所记次数也不一样)图5 Notetabs的波形仿真图《采茶舞曲》简谱如图6图6 《采茶舞曲》简谱下表7是ROM表格:(即为此程序中调用的MUSIC模块)。

表7 ROM表格ROM模块图如图8:2.ToneTaba模块:原理:ToneTaba是乐曲简谱码对应的分频预置数查表电路。

音符的持续时间需要根据乐曲的速度及每个音符的节拍数来确定,Tonetaba的功能首先是为Speakera提供决定所发音符的分频预置数,而此数在Speakera输入口停留的时间为此音符的节拍值。

模块Tonetaba是乐曲简码对应的分频预置数查表电路,其中设置了《采茶舞曲》乐曲全部音符所对应的分频预置数,共16 个,每一音符的停留时间由音乐节拍和音调发生器模块Notetabs的clk的输入频率决定,在此为4Hz。

这16个值得输出由对应于Tonetaba的4位输入值Index[3..0]确定。

输向Tonetaba中Index[3..0]的值,ToneIndex[3..0]的输出值与持续的时间由模块Notetabs决定。

如图9:图9 ToneTab模块程序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;ARCHITECTURE ONE OF TONETABA ISBEGINSEARCH: PROCESS (INDEX)BEGINCASE INDEX ISWHEN"0000"=>TONE<="11111111111";CODE<="0100";HIGH<='0';--1077 WHEN"0101"=>TONE<="10010101101";CODE<="0101";HIGH<='0';--1197 WHEN"0110"=>TONE<="10100001010";CODE<="0110";HIGH<='0';--1290 WHEN"0111"=>TONE<="10101011100";CODE<="0111";HIGH<='0';--1372 WHEN"1000"=>TONE<="10110000010";CODE<="0001";HIGH<='1';--1410 WHEN"1001"=>TONE<="10111001000";CODE<="0010";HIGH<='1';--1480 WHEN"1010"=>TONE<="11000000110";CODE<="0011";HIGH<='1';--1542 WHEN"1011"=>TONE<="11000101000";CODE<="0100";HIGH<='1';--1576 WHEN"1100"=>TONE<="11001010110";CODE<="0101";HIGH<='1';--1622 WHEN"1101"=>TONE<="11010000100";CODE<="0110";HIGH<='1';--1668 WHEN"1110"=>TONE<="11011000000";CODE<="0001";HIGH<='1';--1728 WHEN"1111"=>TONE<="11011101010";CODE<="0010";HIGH<='1';--1770 WHEN OTHERS => NULL;END CASE;END PROCESS;END;(注:每一个index的值都对应一个code,tone值,index的值从0000到0111对应的high为低电,从1000到1111对应的high 为高电。

相关主题