简易电子琴 实训报告.docx
《简易电子琴 实训报告.docx》由会员分享,可在线阅读,更多相关《简易电子琴 实训报告.docx(13页珍藏版)》请在冰点文库上搜索。
简易电子琴实训报告
《基于FPGA的数字系统设计》项目设计文档
项目名称:
基于VHDL的简易电子琴
姓名:
院系:
专业:
学号:
指导教师:
完成时间:
2012年6月20日
基于FPGA的数字系统设计项目成绩评价表
设计题目
基于VHDL的简易电子琴
设计要求
1)设计一个简易电子琴;
2)利用实验箱的脉冲源产生1,2,3,。
。
。
共7个或14个音阶信号;
3)用指示灯显示节拍;
4)*能产生颤音效果。
设计过程
采用现场可编程逻辑器件(FPGA)制作,利用EDA软件中的VHDL硬件描述语言编程进行控制,然后烧制实现。
采用的是现场可编程逻辑器件来实现,它的优点是所有电路集成在一块芯片上,此方案所需的外围电路简单,这样它的体积就减少了,同时还提高了系统的稳定度。
由设计者把编好VHDL程序烧制到现场可编程逻辑器件FPGA中,然后通过控制输入电路把乐谱输入到FPGA,产生不同的频率驱动扬声器,发出不同的乐谱。
同时也把发出的乐谱符号通过显示器输出。
项目设计成绩评价
评价项目
指标
满分
评分
工作量、工作态度和出勤率
按期圆满的完成了规定的任务,难易程度和工作量符合教学要求,工作努力,遵守纪律,出勤率高,工作作风严谨,善于与他人合作。
30
课程设计质量
项目设计系统架构合理,设计过程简练正确,分析问题思路清晰,结构严谨,文理通顺,撰写规范,图表完备正确。
40
创新
工作中有创新意识,对前人工作有一些改进或有一定应用价值。
15
答辩
能正确回答指导教师所提出的问题。
15
综合成绩等级
指导教师:
年月日
1项目名称、内容与要求………………………………………4页
1.1设计内容…………………………………………………4页
1.2具体要求…………………………………………………4页
2系统整体架构(ArchitectureDescription)………………4页
2.1设计思路…………………………………………………4页
2.2系统原理(包含:
框图等阐述)与设计说明等内容…4页
2.3创新点与原创性内容……………………………………5页
3系统设计(含HDL或原理图输入设计)………………………5页
注:
此部分包含主要逻辑单元、模块、源代码等内容
3.1HDL代码…………………………………………………5页
3.2系统整体电路图(或RTL级电路图)…………………7页
4系统仿真(SimulationWaveform)…………………………7页
5FPGA实现(FPGAImplementation)………………………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、显示电路和扬声器电路组成。
控制输入电路
FPGA
显示电路
扬声电路
图1.1采用FPGA设计的电子琴原理方框图
控制输入电路主要是为用户设计的,起到一个输入控制的作用。
FPGA是现场可编程逻辑器件,也是本设计方案的核心内容,它是实现电子琴运作的主要控制模块。
由设计者把编好VHDL程序烧制到现场可编程逻辑器件FPGA中,然后通过控制输入电路把乐谱输入到FPGA,产生不同的频率驱动扬声器,发出不同的乐谱。
同时也把发出的乐谱符号通过显示器输出。
2.3创新点与原创性内容
对于电子琴的设计,很多方案均可以实现,但是采用数字逻辑电路来制作的话电路硬件所需的器材多,体积庞大,比较复杂,而且精度和稳定度都不是很高。
如果采用的是现场可编程逻辑器件来实现,它的优点是所有电路集成在一块芯片上,此方案所需的外围电路简单,这样它的体积就减少了,同时还提高了系统的稳定度。
还可以用ModelsimXE5.3d软件进行仿真和调试等。
设计人员可以充分利用VHDL硬件描述语言方便的编程,提高开发效率,缩短研发周期,降低研发成本;而且易于进行功能的扩展,实现方法灵活,调试方便,修改容易。
。
因此,电子琴的设计我们选择采用现场可编程逻辑器件(FPGA)制作来实现。
3系统设计
3.1HDL代码
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityspeakerais
port(clk:
instd_logic;--时钟输入
index:
instd_logic_vector(6downto0);--按键输入
spks:
outstd_logic);--扬声器输出
end;
architectureoneofspeakerais
signalpreclk,fullspks:
std_logic;
signaltone:
std_logic_vector(10downto0);
begin
search:
process(index)
begin
caseindexis
when"0000001"=>tone<="01100000101";
when"0000010"=>tone<="01110010000";
when"0000100"=>tone<="10000001100";
when"0001000"=>tone<="10000101101";
when"0010000"=>tone<="10010001010";
when"0100000"=>tone<="10011011100";
when"1000000"=>tone<="10100100010";
whenothers=>tone<="11111111111";
endcase;
endprocess;
divdeclk:
process(clk)
variablecount4:
std_logic_vector(3downto0);
begin
preclk<='0';
ifcount4>11thenpreclk<='1';count4:
="0000";
elsifclk'eventandclk='1'thencount4:
=count4+1;
endif;
endprocess;
genspks:
process(preclk,tone)
variablecount11:
std_logic_vector(10downto0);
begin
ifpreclk'eventandpreclk='1'then
ifcount11=16#7ff#thencount11:
=tone;fullspks<='1';
elsecount11:
=count11+1;fullspks<='0';
endif;
endif;
endprocess;
dealyspks:
process(fullspks)
variablecount2:
std_logic;
begin
iffullspks'eventandfullspks='1'thencount2:
=notcount2;
ifcount2='1'thenspks<='1';
elsespks<='0';
endif;
endif;
endprocess;
end;
3.2系统整体电路图
4系统仿真(SimulationWaveform)
功能仿真:
时序仿真:
5FPGA实现
数控分频模块的目的是对基准脉冲分频,得到1,2,3,4,5,6,7,七个音符对应频率。
该模块的VHDL描述中包括了三个模块,首先对12MHz的基准脉冲进行再次分频,得到的便是所需要的频率。
实验箱:
实验操作内容及步骤:
1、打开QuartusⅡ,创建工程
首先建立一个QuartusⅡ的工程,指定工作目录、工程名称、顶层设计实体名称、目标器件系列、工具设置等。
步骤如下:
(1)选择“开始”—>“程序”—>Altera—>QuartusⅡ
(2)选择File—>NewProjectWizard界面,单击Next按钮,进入工程名称的设定、工程目录的选择。
(3)在对话框中,指定工程存放的目录、工程名和顶层实体名,工程名和顶层实体名要求相同,工程目录可以随意设置,但必须是英文的目录,单击Next按钮。
(4)用户指定目标器件,根据开发板所使用的期间来选择,单击Next按钮。
(5)新建一个VHDL语言。
(6)把程序代码输入,编译、运行程序,单击processing—>startcomilation,运行程序。
2.引脚分配
(1)单击assignments—>timinganalysissetting进行引脚分配
(2)直接导入引脚分配,单击assignments—>importassignments
(3)引脚分配完成
3.产生波形图
(1)创建波形文件,单击File—>otherfiles—>vectorwaveformfile
(2)点击空白处,点开INSERT->insertnode,再点击—>nodefinder—>list,把元器件添加进去,得到其仿真波形图
系统整体组装图:
6总结(Closing)
通过两个周的学习,最后完成了我的设计任务——基于VHDL语言的简易电子琴的设计。
通过本次课程设计的学习,我对数据库软件EDA技术、VHDL、等系列知识都有了一定的了解。
使用EDA技术开发页面的能力也有了很大提高。
我深深的体会到设计课的重要性和目的性所在。
本次设计课不仅仅培养了我们实际操作能力,也培养了我们灵活运用课本知识,理论联系实际,独立自主的进行设计的能力。
它不仅仅是一个学习新知识新方法的好机会,同时也是对我所学知识的一次综合的检验和复习,使我明白了自己的缺陷所在,从而查漏补缺。
在设计中要求我们要有耐心和毅力,还要细心,稍有不慎一个小小的错误就会导致结果的不正确,而对错误的检查要求我要有足够的耐心,通过这次设计和设计中遇到的问题,也积累了一定的经验。
用VHDL硬件描述语言的形式来进行数字系统的设计方便灵活,利用EDA软件进行编译优化仿真极大地减少了电路设计时间和可能发生的错误,降低了开发成本,这种设计方法必将在未来的数字系统设计中发挥越来越重要的作用。
VHDL的设计关键是电路逻辑设计,而一个程序的关键是总体设计。
对于硬件设计接触不多的我们清楚这一点也许不无好处。
设计的工作此课程设计从构思到最后完成的这两个周内,周围的很多同学和朋友给予了我善意的帮助,还有老师同学们对我的不厌其烦的指导,使我对此类课程设计的设计流程以及脊髓有了很深的了解,通过你们的帮助,我把从计算机组成原理这门课上学到的理论第一次用到了实际设计上。
在此,我深深的表示感谢。
参考书目(Reference):
[1]张肃文,.EDA技术与VHDL语言.北京:
清华大学出版社
[2]张亦华,延明.数字电路EDA入门.北京:
北京邮电大学出版社
[3]《VHDL 程序设计》(第二版).曾繁泰等. 清华大学出版社
[4]《VHDL与数字电路设计》.卢毅, 赖杰. 科学出版社
[5]《EDA技术与实验》陈强
附录(Appendix):
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityspeakerais
port(clk:
instd_logic;--时钟输入
index:
instd_logic_vector(6downto0);--按键输入
spks:
outstd_logic);--扬声器输出
end;
architectureoneofspeakerais
signalpreclk,fullspks:
std_logic;
signaltone:
std_logic_vector(10downto0);
begin
search:
process(index)
begin
caseindexis
when"0000001"=>tone<="01100000101";
when"0000010"=>tone<="01110010000";
when"0000100"=>tone<="10000001100";
when"0001000"=>tone<="10000101101";
when"0010000"=>tone<="10010001010";
when"0100000"=>tone<="10011011100";
when"1000000"=>tone<="10100100010";
whenothers=>tone<="11111111111";
endcase;
endprocess;
divdeclk:
process(clk)
variablecount4:
std_logic_vector(3downto0);
begin
preclk<='0';
ifcount4>11thenpreclk<='1';count4:
="0000";
elsifclk'eventandclk='1'thencount4:
=count4+1;
endif;
endprocess;
genspks:
process(preclk,tone)
variablecount11:
std_logic_vector(10downto0);
begin
ifpreclk'eventandpreclk='1'then
ifcount11=16#7ff#thencount11:
=tone;fullspks<='1';
elsecount11:
=count11+1;fullspks<='0';
endif;
endif;
endprocess;
dealyspks:
process(fullspks)
variablecount2:
std_logic;
begin
iffullspks'eventandfullspks='1'thencount2:
=notcount2;
ifcount2='1'thenspks<='1';
elsespks<='0';
endif;
endif;
endprocess;
end;