当前位置:文档之家› 简易电子琴实训报告样本

简易电子琴实训报告样本

《基于FPGA的数字系统设计》项目设计文档
项目名称:基于VHDL的简易电子琴
姓名:
院系:
专业:
学号:
指导教师:
完成时间: 年6月20日基于FPGA的数字系统设计项目成绩评价表
指导教师: 年月日
目录
1 项目名称、内容与要求………………………………………4页
1.1 设计内容…………………………………………………4页
1.2 具体要求…………………………………………………4页
2 系统整体架构( Architecture Description) ………………4页
2.1 设计思路…………………………………………………4页
2.2 系统原理( 包含: 框图等阐述) 与设计说明等内容…4页
2.3 创新点与原创性内容……………………………………5页
3 系统设计(含HDL或原理图输入设计)………………………5页
注: 此部分包含主要逻辑单元、模块、源代码等内容
3.1 HDL 代码…………………………………………………5页
3.2 系统整体电路图( 或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、利用实验箱的脉冲源产生1, 2, 3, 。

共7个或14个音阶信号;
3、用指示灯显示节拍;
4、*能产生颤音效果。

2、系统整体架构
2.1 设计思路
本课程设计目的在于灵活运用EDA技术编程实现一个简易电子琴, 它要求在实验箱上构造一个电子琴电路, 不同的音阶对应不同频率的正弦波。

按下每个代表不同音阶的按键时, 能够发出对应频率的声音
2.2 系统原理
采用现场可编程逻辑器件( FPGA) 制作, 利用EDA软件中的VHDL硬件描述语言编程进行控制, 然后烧制实现。

采用FPGA来设计的原理图如图1.1所示。

它由控制输入电路、FPGA、显示电路和扬声器电路组成。

图1.1 采用FPGA设计的电子琴原理方框图控制输入电路主要是为用户设计的,起到一个输入控制的作用。

FPGA是现场可编程逻辑器件, 也是本设计方案的核心内容, 它是实现电子琴运作的主要控制模块。

由设计者把编好VHDL程序烧制到现场可编程逻辑器件FPGA中,然后经过控制输入电路把乐谱输入到FPGA,产生不同的频率驱动扬声器,发出不同的乐谱。

同时也把发出的乐谱符号经过显示器输出。

2.3 创新点与原创性内容
对于电子琴的设计,很多方案均能够实现,可是采用数字逻辑电路来制作的话电路硬件所需的器材多,体积庞大,比较复杂,而且精度和稳定度都不是很高。

如果采用的是现场可编程逻辑器件来实现, 它的优点是所有电路集成在一块芯片上, 此方案所需的外围电路简单,这样它的体积就减少了, 同时还提高了系统的稳定度。

还能够用Modelsim XE 5.3d软件进行仿真和调试等。

设计人员能够充分利用VHDL硬件描述语言方便的编程, 提高开发效率, 缩短研发周期, 降低研发成本; 而且易于进行功能的扩展, 实现方法灵活, 调试方便, 修改容易。

因此,电子琴的设计我们选择采用现场可编程逻辑器件( FPGA) 制作来实现。

3 系统设计
3.1 HDL 代码
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity 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 <= "";
when "0000010" => tone <= "";
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';。

相关主题