简易电子琴 实训报告
- 格式:doc
- 大小:58.00 KB
- 文档页数:11
《基于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';