




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录一:前言.1二:设计任务要求2三:总体框图2四:选择器件3 五:功能模块:3 1:Songer模块3 1)NoteTabs模块(程序 仿真图)5 2)ToneTaba模块(程序 仿真图)6 3)Speakera模块(程序 仿真图)8 2:div模块(程序 仿真图)11 3:七段译码器模块(程序)13六:总体设计电路图15 1顶层设计的电路原理图15 2顶层设计的仿真结果17 3电路的管脚图18七:结束语19八:心得体会19 乐曲硬件演奏电路设计一、 前言乐曲演奏广泛用于自动答录装置、手机铃声、集团电话、及智能仪器仪表设备。实现方法有许多种,在众多的实现方法中,以纯硬件完成乐曲演奏,随着FPGA集成度的提高,价格下降,EDA设计工具更新换代,功能日益普及与流行,使这种方案的应用越来越多。如今的数字逻辑设计者面临日益缩短的上市时间的压力,不得不进行上万门的设计,同时设计者不允许以牺牲硅的效率达到保持结构的独特性。使用现今的EDA软件工具来应付这些问题,并不是一件简单的事情。FPGA预装了很多已构造好的参数化库单元LPM器件。通过引入支持LPM的EDA1软件工具,设计者可以设计出结构独立而且硅片的使用效率非常高的产品。 本文介绍在EDA开发平台上利用VHDL语言设计数控分频器电路,用数控分频的原理设计音乐硬件演奏电路,并定制LPM-ROM存储音乐数据,以“梁祝”乐曲为例,将音乐数据存储到LPM-ROM,就达到了以纯硬件的手段来实现乐曲的演奏效果。只要修改LPM-ROM所存储的音乐数据,将其换成其他乐曲的音乐数据,再重新定制LPM-ROM,连接到程序中就可以实现其它乐曲的演奏。二、设计任务要求 本文介绍在EDA开发平台上利用VHDL语言设计数控分频器电路,利用数控分频的原理设计音乐硬件演奏电路,并定制LPM-ROM存储音乐数据,以“感恩的心”乐曲为例,将音乐数据存储到LPM-ROM,就达到了以纯硬件的手段来实现乐曲的演奏效果。只要修改LPM-ROM所存储的音乐数据,将其换成其他乐曲的音乐数据,再重新定制LPM-ROM,连接到程序中就可以实现其它乐曲的演奏。三、总体框图TONETABA译码器NOTETABS分频器扬声器SPEAKERA该主系统由三个模块:Songer.vhd、div.vhd、SEG7.Vhd(7段译码器)组成。首先定制Songer.Vhd,此模块包括3个小模块,分别是NoteTabs模块,ToneTaba模块,Speakera模块,此外,我们还需建立一个名为“music”的LPM_ROM模块与NoteTabs模块连接。根据给出的乘法器逻辑原理图及其模块的VHDL描述在QUARTUS2上完成设计。完成编译,综合,仿真,管脚分配,编程下载。1对于模块NoteTabs的功能描述:该模块的功能就是定义音符数据ROM“music”随着该模块中的计数器控制时钟频率速率作加法计数时,即地址值递增时,音符数据ROM中的音符数据。将从ROM中通过ToneIndex3.0端口输向ToneTaba模块,演奏寂寞的季节。在该模块中设置了一个8位二进制计数器(计数最大值为197),作为音符数据ROM的地址发生器。这个计数器的计数频率为4Hz,即每一计数值的停留时间为0.25秒,恰为当全音符设为1秒时,四四拍的4分音符持续时间。2对于模块ToneTaba,是乐曲简谱码对应的分频预置数查找表电路,其中设置了乐曲的全部音符所对应的分频置数,每一音符的停留时间由音乐节拍和音调发生器模块NoteTabs的CLK的输入频率决定,这些值由对应于ToneTaba的4位输入值Index3.0确定,最多有16种可选值。输向ToneTaba中Index3.0的值ToneIndex3.0的输出值与持续的时间由模块NoteTabs决定。3模块Speakera是一个数控分频器,音符的频率可由此模块获得。由CLK端输入一具有较高频率的信号,通过Speakera分频后由SPKOUT输出。由于直接从数控分频器中出来的输出信号是脉宽极窄的脉冲式信号。为了利用驱动扬声器,需加一个D触发器以均衡其占空比,频率将是原来的1/2。Speakera对CLK输入信号的分频比由预置数Tone决定。SPKOUT的输出频率将决定每一音符的音调。4. SEG7 模块是一个七段译码器,作用是在硬件上显示音频的高低,用0到7分别对应空节拍、do、ri、mi、fa、suo、la、xi,高音时,LED亮,数码管显示对应数字。四、选择器件1.EP1C12Q240C8芯片及相应的连接设备2.外置扬声器3.7段数码管4. 计算机5. LED灯一个五、功能模块1对于模块Songer梁祝乐曲简谱如下:其仿真波形如下1) LPM_ROM模块定义音符数据ROM“music”。 Music模块存放乐曲中的音符数据,它是利用LPM-ROM来实现的,将乐谱中相应的音符放在一个连续的地址上。它首先是编写音符数据文件,将乐谱中相应的音符存放在一个连续的地址上。因为1拍的时间定为1秒,提供的是4Hz的时钟频率(即1/4拍的整数倍),则需将这个音符存储在相应次数的连续几个地址上。然后对音符数据进行ROM定制。随着NoteTabs中的计数器按时钟频率速度作加法计数时,音符数据将从ROM中通过ToneIndex端口输向ToneTaba模块。ROM中的音符数据模块(music)程序为:WIDTH=4;DEPTH=256;ADDRESS_RADIX=DEC;DATA_RADIX=DEC;CONTENT BEGINEnd;(每个冒号为一行)其中WIDTH=4,表示数据输出为宽为4;DEPTH=256,表示共有256个4位数据点;ADDRESS-RADIX=DEC,表示地址信号用十进制;DATA-RADIX=DEC,表示输出数据是十进制数。在QUARTUS中,我们需要建立一个.MIF文件来储存ROM文件,这样在建立LPM_ROM文件时可以方便的插入自己所需要的音乐歌曲的程序。2)NoteTabs模块的程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity NoteTabs is port (clk : in std_logic;ToneIndex : out std_logic_vector(3 downto 0);end;architecture one of NoteTabs is component MUSICPORT(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(clk,Counter)beginif Counter=138 then Counter=00000000;elsif (clkevent and clk=1) then CounterCounter,q=ToneIndex,clock=clk);end;该波形图只举了乐曲ROM“music”的一部分例子,其仿真结果正好符合ROM中的“MUSIC”模块的文件,各个地址对应的ROM中的数据。3) 对于模块ToneTabaToneTaba是乐曲简谱码对应的分频预置数查表电路。以下为ToneTaba的模块程序: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 is beginSearch: process(Index)begincase Index is when 0000 = Tone=11111111111;CODE=0000;HIGH Tone=01100000101;CODE=0001;HIGH Tone=01110010000;CODE=0010;HIGH Tone=10000001100;CODE=0011;HIGH Tone=10010101101;CODE=0101;HIGH Tone=10100001010;CODE=0110;HIGH Tone=10101011100;CODE=0111;HIGH Tone=10110000010;CODE=0001;HIGH Tone=10111001000;CODE=0010;HIGH Tone=11000000110;CODE=0011;HIGH Tone=11001010110;CODE=0101;HIGH Tone=11010000100;CODE=0110;HIGH Tone=11011000000;CODE=0001;HIGHNULL;end case;end process;end;该模块的波形图为该仿真的结果符合TONETABA模块中的分频预置数及频率。4) 对于Speakera模块音符的频率是由该模块获得音符频率的获得:多个不同频率的信号可通过对某个基准频率进行分频器获得。该程序选取750KHz的基准频率。由于现有的高频时钟脉冲信号的频率为12MHz,需对其进行16分频,才能获得750KHz的基准频率。对基准频率分频后的输出信号是一些脉宽极窄的尖脉冲信号。为提高输出信号的驱动能力,以使扬声器有足够的功率发音,需要再通过一个分频器(D触发器)将原来的分频器的输出脉冲均衡为对称方波,这时的频率将是原来的1/2,即为375KHz。各个音符的频率及其对应的分频系数(基准频率375KHz)音符名频 率(Hz)分频系数计数初值休止符37500002047低音1294.3491274773低音2330.3961135912低音3370.9210111036低音4386.5989701077低音5394.7379501197低音6495.3767571290低音7555.566751372中音1588.6976371410中音2638.845871480中音3742.5745051542中音4796.1784681579中音5882.3534251622中音6989.4463791668中音71136.3633301717高音11175.5493191728高音21353.7902771770高音31512.0972481799高音41609.4422331814高音51802.8842081839高音62027.0271851862高音72272.7271651882Speakera的模块程序library ieee;use ieee.std_logic_1164.all;entity Songer is port( CLK12MHZ : in std_logic;CLK8HZ : in std_logic; CODE1 : out std_logic_vector(3 downto 0); HIGH1 : out std_logic;SPKOUT : out std_logic);end;architecture one of Songer is component NoteTabs is port (clk : in std_logic;ToneIndex : out std_logic_vector(3 downto 0);end component;component ToneTabaport( 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 component;component Speakeraport(clk : in std_logic;Tone : in std_logic_vector(10 downto 0);SpkS : out std_logic);end component;signal Tone : std_logic_vector(10 downto 0);signal ToneIndex : std_logic_vector(3 downto 0); beginu1:NoteTabs port map (clk=CLK8HZ,ToneIndex=ToneIndex);u2: ToneTaba port map (Index=ToneIndex,Tone=Tone,CODE=CODE1,HIGH=HIGH1);u3: Speakera port map (clk=CLK12MHZ,Tone=Tone,SpkS=SPKOUT);end;speakera的仿真图如下:5) div模块 由于我们所使用的硬件设备不能满足我们所需要的两个CLK输出的频率,所以我们使用一个分频器来实现把一个50MHz的晶体振荡频率分成一个12MHz,一个8Hz两个分频率,再把两个频率分别给所需的两个模块,div模块的程序:LIBRARY ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY div IS PORT( clk :IN STD_LOGIC; CLK12MHz,CLK8Hz: OUT std_logic);END fenpin;ARCHITECTURE one of fenpin isbeginnana:process(clk)variable cnt:integer range 0 to 2;variable tmp:std_logic;beginif(clkevent and clk=1)thenif cnt=1 thencnt:=0;tmp:=not tmp;elsecnt:=cnt+1;end if;end if;CLK12MHz=3124999 thencnt:=0;tmp:=not tmp;elsecnt:=cnt+1;end if;end if;CLK8Hz=tmp;end process nbnb;end one;此程序的仿真图为:(由于CLK8Hz过于小,所以在仿真图中看不到)6) 七段数码管模块此时VGA的状态为0010地址线分配为此部分程序应用我们前面用过的SEG7模块即可实现,程序为:地址线分布为library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;ENTITY SEG7 IS PORT(num:IN std_logic_vector(3 downto 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=led(1); G=led(0); DP=0; ledCLK8HZ,ToneIndex=ToneIndex);u2: ToneTaba port map (Index=ToneIndex,Tone=Tone,CODE=CODE1,HIGH=HIGH1);u3: Speakera port map (clk=CLK12MHZ,Tone=Tone,SpkS=SPKOUT);end;2 顶层设计的仿真结果如下:将Songer模块设为当前文件,进行编译,编译成功:3 电路的顶层文件管脚分配图如下:4 连线及下载 在硬件电路上实现此程序 CLK接50MHz晶振输入,高音HIGH接IO9,然后再与LED连接,S
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025网络安全行业劳动合同模板
- 2025采购销售货物合同书
- 租赁园区大棚合同范本
- 2025携手共进合作开发土地合同模板
- 2025风电场EMC合同模板
- 民间抵押汽车合同范本
- 车辆采购合同范本
- 爷孙房屋购买合同范本
- 道闸租赁合同范本
- 定制车库维修合同范本
- 福建省福州市联盟校2023-2024学年高一下学期期末考试英语试题(解析版)
- 2025文化和旅游部直属事业单位招聘社会人员29人模拟试卷附答案详解
- 2024-2025学年重庆市万州区八年级(下)期末语文试卷
- 2025年乒乓球二级裁判考试题及答案
- 血标本采集考试试题附有答案
- 2025年公共安全生产试题及答案
- 员工工资及考勤管理制度
- 浙江省温州市龙湾区2024-2025学年七年级下学期学业水平期末检测数学试题
- 废料出售管理办法
- 企业干部退出管理办法
- 河南选调生管理暂行办法
评论
0/150
提交评论