简易电子琴 实训报告

  • 格式:doc
  • 大小:58.00 KB
  • 文档页数:11

下载文档原格式

  / 11
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《基于FPGA的数字系统设计》项目设计文档项目名称: 基于VHDL的简易电子琴

姓名:

院系:

专业:

学号:

指导教师:

完成时间: 2012 年 6月20日

基于FPGA的数字系统设计项目成绩评价表

指导教师:年月日

目录

1 项目名称、内容与要求………………………………………4页

设计内容…………………………………………………4页

具体要求…………………………………………………4页

2 系统整体架构(Architecture Description)………………4页

设计思路…………………………………………………4页

系统原理(包含:框图等阐述)与设计说明等内容…4页

创新点与原创性内容……………………………………5页

3 系统设计 (含HDL或原理图输入设计)………………………5页

注:此部分包含主要逻辑单元、模块、源代码等内容

HDL 代码…………………………………………………5页

系统整体电路图(或RTL级电路图)…………………7页

4 系统仿真(Simulation Waveform)…………………………7页

5 FPGA实现(FPGA Implementation)………………………9页

6 总结(Closing)……………………………………………10页参考书目(Reference):…………………………………………11页附录(Appendix):………………………………………………12页

1、项目名称、内容与要求

1.1设计内容:

设计一个简易的八音符电子琴,它可通过按键输入来控制音响。

具体要求:

1、设计一个简易电子琴;

2、利用实验箱的脉冲源产生1,2,3,。。。共7个或14个音阶信号;

3、用指示灯显示节拍;

4、*能产生颤音效果。

2、系统整体架构

设计思路

本课程设计目的在于灵活运用EDA技术编程实现一个简易电子琴,它要求在实验箱上构造一个电子琴电路,不同的音阶对应不同频率的正弦波。按下每个代表不同音阶的按键时,能够发出对应频率的声音

系统原理

采用现场可编程逻辑器件(FPGA)制作,利用EDA软件中的VHDL硬件描述语言编程进行控制,然后烧制实现。采用FPGA来设计的原理图如图所示。它由控制输入电路、FPGA、显示电路和扬声器电路组成。

图采用FPGA设计的电子琴原理方框图

控制输入电路主要是为用户设计的,起到一个输入控制的作用。FPGA是现场可编程逻辑器件,也是本设计方案的核心内容,它是实现电子琴运作的主要控制模块。由设计者把编好 VHDL程序烧制到现场可编程逻辑器件FPGA中,然后通过

控制输入电路把乐谱输入到FPGA,产生不同的频率驱动扬声器,发出不同的乐谱。同时也把发出的乐谱符号通过显示器输出。

创新点与原创性内容

对于电子琴的设计,很多方案均可以实现,但是采用数字逻辑电路来制作的话电路硬件所需的器材多,体积庞大,比较复杂,而且精度和稳定度都不是很高。如果采用的是现场可编程逻辑器件来实现, 它的优点是所有电路集成在一块芯片上,此方案所需的外围电路简单,这样它的体积就减少了,同时还提高了系统的稳定度。还可以用Modelsim XE 软件进行仿真和调试等。设计人员可以充分利用VHDL硬件描述语言方便的编程,提高开发效率,缩短研发周期,降低研发成本;而且易于进行功能的扩展,实现方法灵活,调试方便,修改容易。。因此,电子琴的设计我们选择采用现场可编程逻辑器件(FPGA)制作来实现。

3 系统设计

HDL 代码

library ieee;

use speakera is

port( clk : in std_logic; --时钟输入

index:in std_logic_vector( 6 downto 0); -- 按键输入

spks: out std_logic); --扬声器输出

end;

architecture one of speakera is

signal preclk,fullspks :std_logic;

signal tone: std_logic_vector( 10 downto 0);

begin

search : process (index)

begin

case index is

when "0000001" => tone <= "001";

when "0000010" => tone <= "000";

when "0000100" => tone <= "";

when "0001000" => tone <= "";

when "0010000" => tone <= "";

when "0100000" => tone <= "";

when "1000000" => tone <= "";

when others => tone <= "";

end case;

end process;

divdeclk :process(clk)

variable count4 :std_logic_vector( 3 downto 0);

begin

preclk <= '0';

if count4 > 11 then preclk <= '1'; count4 :="0000";

elsif clk'event and clk='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'; else count11 := count11 + 1;fullspks <= '0';