EDA花样流水灯.docx
《EDA花样流水灯.docx》由会员分享,可在线阅读,更多相关《EDA花样流水灯.docx(15页珍藏版)》请在冰豆网上搜索。
![EDA花样流水灯.docx](https://file1.bdocx.com/fileroot1/2023-4/28/26123a28-e670-4cc0-ad64-e5af7ca1b25e/26123a28-e670-4cc0-ad64-e5af7ca1b25e1.gif)
EDA花样流水灯
教学单位电子电气工程系
学生学号
编号
综合课程设计
题 目 基于QuartusII6.0的
花样流水灯的设计
学生姓名
专业名称 ,
指导教师
2013年 6 月 24 日
基于QuartusII6.0的花样流水灯的设计
随着EDA技术发展和应用领域的扩大与深入,EDA技术在电子信息、通讯、自动控制及计算机应用等领域的重要性突出。
随着技术市场与人才市场对EDA的需求不断提高,产品的市场需求和技术市场的要求也必然会反映到教学领域和科研领域中来。
因此学好EDA技术对我们有很大的益处。
EDA是指以计算机为工具,在EDA软件平台上,根据设计社描述的源文件(原理图文件、硬件描述语言文件或波形图文件),自动完成系统的设计,包括编译、仿真、优化、综合、适配(或布局布线)以及下载。
流水灯是一串按一定的规律像流水一样连续闪亮,流水灯控制是可编程控制器的一个应用,其控制思想在工业控制技术领域也同样适用。
流水灯控制可用多种方法实现,但对现代可编程控制器而言,基于EDA技术的流水灯设计也是很普遍的。
1.设计目的
1.1学习使用EDA集成设计软件QuartusII,电路描述,综合,模拟过程
1.2了解基于EDA应用系统的设计方法
1.3掌握使用EDA工具设计流水灯的设计思路和设计方法
1.4熟练使用QuartusII对实验程序进行改错,调试以及演示现象
2.设计说明
此次实验要求我们通过学习的EDA课程,来编制VHDL程序,以及使用这些程序代码来显示我们所要求的结果。
流水灯设计是由八只LED显示灯来实现的,通过程序代码来控制这八只灯的亮灭,在实验初期,我们首先得编程序,通过我们上课所学的基础知识,再结合近段时间去图书馆查阅的有关参考书籍,以及网上所搜索的相关知识,我们小组共同完成了程序的编制,程序代码在下面有详细介绍。
其次,我们需要掌握QuartusII的用法,因为要求的现象是通过这个软件实现的,在EDA实验课程中老师有详细介绍QuartusII的使用方法,所以在这一阶段对我们来说也比较得心应手,安装,调试,然后将编好的程序输入,在此过程中我们遇到了点小困难,显示程序有错误,但是通过我们集体的努力,终于发现,是因为在操作时,我们应该先创建自己的文件夹,然后统一存放在一起,而我们存放的地方有误,所以显示不出我们所输入的代码。
当所有的这一切准备工作做完后就是该演示现象了,8只LED显示灯能被控制其亮灭,会显示想流水一样的灯光。
3程序设计
3.1
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYfirstIS
PORT(
clk:
INstd_logic;
rst:
INstd_logic;
c:
OUTstd_logic_vector(7DOWNTO0)
);
ENDfirst;
ARCHITECTUREarchOFfirstIS
CONSTANTstate0:
std_logic_vector(2DOWNTO0):
="000";
CONSTANTstate1:
std_logic_vector(2DOWNTO0):
="001";
CONSTANTstate2:
std_logic_vector(2DOWNTO0):
="010";
CONSTANTstate3:
std_logic_vector(2DOWNTO0):
="011";
CONSTANTstate4:
std_logic_vector(2DOWNTO0):
="100";
CONSTANTstate5:
std_logic_vector(2DOWNTO0):
="101";
CONSTANTstate6:
std_logic_vector(2DOWNTO0):
="110";
CONSTANTstate7:
std_logic_vector(2DOWNTO0):
="111";
SIGNALstate:
std_logic_vector(2DOWNTO0);
SIGNALcnt:
std_logic_vector(2DOWNTO0);
BEGIN
PROCESS(clk,rst)
BEGIN
IF(NOTrst='1')THEN
state<=state0;
cnt<="000";
ELSIF(clk'EVENTANDclk='1')THEN
cnt<=cnt+"001";
IF(cnt="111")THEN
CASEstateIS
WHENstate0=>
state<=state1;
WHENstate1=>
state<=state2;
WHENstate2=>
state<=state3;
WHENstate3=>
state<=state4;
WHENstate4=>
state<=state5;
WHENstate5=>
state<=state6;
WHENstate6=>
state<=state7;
WHENstate7=>
state<=state0;
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(state)
BEGIN
CASEstateIS
WHENstate0=>
c<="10101010";
WHENstate1=>
c<="01010101";
WHENstate2=>
c<="10101010";
WHENstate3=>
c<="01010101";
WHENstate4=>
c<="10101010";
WHENstate5=>
c<="01010101";
WHENstate6=>
c<="10101010";
WHENstate7=>
c<="01010101";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
ENDarch;
3.2
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYsecondIS
PORT(
clk:
INstd_logic;
rst:
INstd_logic;
c:
OUTstd_logic_vector(7DOWNTO0)
);
ENDsecond;
ARCHITECTUREarchOFsecondIS
CONSTANTstate0:
std_logic_vector(2DOWNTO0):
="000";
CONSTANTstate1:
std_logic_vector(2DOWNTO0):
="001";
CONSTANTstate2:
std_logic_vector(2DOWNTO0):
="010";
CONSTANTstate3:
std_logic_vector(2DOWNTO0):
="011";
CONSTANTstate4:
std_logic_vector(2DOWNTO0):
="100";
CONSTANTstate5:
std_logic_vector(2DOWNTO0):
="101";
CONSTANTstate6:
std_logic_vector(2DOWNTO0):
="110";
CONSTANTstate7:
std_logic_vector(2DOWNTO0):
="111";
SIGNALstate:
std_logic_vector(2DOWNTO0);
SIGNALcnt:
std_logic_vector(2DOWNTO0);
BEGIN
PROCESS(clk,rst)
BEGIN
IF(NOTrst='1')THEN
state<=state0;
cnt<="000";
ELSIF(clk'EVENTANDclk='1')THEN
cnt<=cnt+"001";
IF(cnt="111")THEN
CASEstateIS
WHENstate0=>
state<=state1;
WHENstate1=>
state<=state2;
WHENstate2=>
state<=state3;
WHENstate3=>
state<=state4;
WHENstate4=>
state<=state5;
WHENstate5=>
state<=state6;
WHENstate6=>
state<=state7;
WHENstate7=>
state<=state0;
WHENOTHERS=>NULL;
ENDCASE;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(state)
BEGIN
CASEstateIS
WHENstate0=>
c<="10000000";
WHENstate1=>
c<="01000000";
WHENstate2=>
c<="00100000";
WHENstate3=>
c<="00010000";
WHENstate4=>
c<="00001000";
WHENstate5=>
c<="00000100";
WHENstate6=>
c<="00000010";
WHENstate7=>
c<="00000001";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
ENDarch;
3.3
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYthirdIS
PORT(
clk:
INstd_logic;
rst:
INstd_logic;
c:
OUTstd_logic_vector(7DOWNTO0)
);
ENDthird;
ARCHITECTUREarchOFthirdIS
CONSTANTstate0:
std_logic_vector(2DOWNTO0):
="000";
CONSTANTstate1:
std_logic_vector(2DOWNTO0):
="001";
CONSTANTstate2:
std_logic_vector(2DOWNTO0):
="010";
CONSTANTstate3:
std_logic_vector(2DOWNTO0):
="011";
CONSTANTstate4:
std_logic_vector(2DOWNTO0):
="100";
CONSTANTstate5:
std_logic_vector(2DOWNTO0):
="101";
CONSTANTstate6:
std_logic_vector(2DOWNTO0):
="110";
CONSTANTstate7:
std_logic_vector(2DOWNTO0):
="111";
SIGNALstate:
std_logic_vector(2DOWNTO0);
SIGNALcnt:
std_logic_vector(2DOWNTO0);
BEGIN
PROCESS(clk,rst)
BEGIN
IF(NOTrst='1')THEN
state<=state0;
cnt<="000";
ELSIF(clk'EVENTANDclk='1')THEN
cnt<=cnt+"001";
IF(cnt="111")THEN
CASEstateIS
WHENstate0=>
state<=state1;
WHENstate1=>
state<=state2;
WHENstate2=>
state<=state3;
WHENstate3=>
state<=state4;
WHENstate4=>
state<=state5;
WHENstate5=>
state<=state6;
WHENstate6=>
state<=state7;
WHENstate7=>
state<=state0;
WHENOTHERS=>NULL
ENDCASE;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(state)
BEGIN
CASEstateIS
WHENstate0=>
c<="00000001";
WHENstate1=>
c<="00000010";
WHENstate2=>
c<="00000100";
WHENstate3=>
c<="00001000";
WHENstate4=>
c<="00010000";
WHENstate5=>
c<="00100000";
WHENstate6=>
c<="01000000";
WHENstate7=>
c<="10000000";
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESS;
ENDarch;
3.4
libraryieee;
useieee.std_logic_1164.all;
entitysanbais
port(a,b,c:
instd_logic;
y7,y6,y5,y4,y3,y2,y1,y0:
outstd_logic);
endentitysanba;
architecturebehavofsanbais
signalabc:
std_logic_vector(2downto0);
begin
abc<=a&b&c;
process(a,b,c)
begin
caseabcis
when"000"=>y0<='0';y1<='1';y2<='1';y3<='1';y4<='1';y5<='1';y6<='1';y7<='1';
when"001"=>y0<='1';y1<='0';y2<='1';y3<='1';y4<='1';y5<='1';y6<='1';y7<='1';
when"010"=>y0<='1';y1<='1';y2<='0';y3<='1';y4<='1';y5<='1';y6<='1';y7<='1';
when"011"=>y0<='1';y1<='1';y2<='1';y3<='0';y4<='1';y5<='1';y6<='1';y7<='1';
when"100"=>y0<='1';y1<='1';y2<='1';y3<='1';y4<='0';y5<='1';y6<='1';y7<='1';
when"101"=>y0<='1';y1<='1';y2<='1';y3<='1';y4<='1';y5<='0';y6<='1';y7<='1';
when"110"=>y0<='1';y1<='1';y2<='1';y3<='1';y4<='1';y5<='1';y6<='0';y7<='1';
when"111"=>y0<='1';y1<='1';y2<='1';y3<='1';y4<='1';y5<='1';y6<='1';y7<='0';
whenothers=>
endcase;
endprocess;
endarchitecturebehav;
4流水灯原理图
图1顶层原理图
5仿真波形图
图
(2)顶层仿真波形图
6设计心得体会
通过本次课程设计,我基本对FPGA的设计流程有了入门的了解和认识,在课堂之外进一步加深了对EDA课程各知识点的学习和以及quartusII软件开发平台的操作。
也深深地感受到,工科的学习是来不得半点虚伪的,一定要自己动手操作,不懂就是不懂。
对于程序的编写过程其实就是一个改错的过程,通过改错就会发现自己只是的不足。
课程设计与此同时也让我加深强了对课题的专业知识的认识和对专业文件检索能力。
在短短的一周左右的时间里,我们经过自己的努力编写了VHDL流水灯系统。
在程序编写的过程中,我们遇到很多困难,但是我们没有放弃,经过多次改进,本设计实现了流水灯的基本功能,流水灯的运行情况完全符合设想,灯变化合情合理。
本次流水灯的设计采用VHDL语言,源程序经Quartus软件仿真。
本设计代码具有良好的可读性和可移植性,运用了有限状态机的设计方法,使得它灵活、简单、运算速度快、可靠性高,并且此设计具有良好的扩展性。
我们总结,首先要学会使用图书馆等网络资源,当我们编写程序遇到一些无法理解得错误时,我们最终都可以从网络上找到前人的经验和教训。
因此不能闭门造车,要多学习别人的经验和教训。
其次是在编写程序之前要有一个清晰的框架,自己要实现哪些功能,以及要实现哪些功能得需要哪些方法来实现,只有在自己脑子里有一个很清晰的框架之后,然后再进行编写,编写一个完整的程序是需要一定的时间去思考调试的。
只要努力花时间,静下心来找出程序的错误,改进不足之处,最后一定能够编写出一个满意的程序
。
参考文献
[1]王金明.数学系统设计与VerilogHD[M].北京:
电子工业出版社,2006:
285—294。
[2]栾佳明、基于FPGA可调信号发生器的设计.ElectronicDesignEngineering,2010第5期。
[3]黄乡生.基于DDS和FPGA的数字函数发生器的设计和实现.东华理工大学学报(自然科学版)第4期。
[4]康华明.电子技术基础—数字部分[M].高等教育出版社,1998。
[5]雷伏容.HDL电路设计[M].清华大学出版社,2006。
谢辞
本设计顺利完成,是指导老师的细心教导和同学的热心帮助的结果。
在此,特别感谢我的指导老师王晓莉老师,她严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。
感谢在文中引用文献的作者们,是他们的辛勤劳动成果使得我在设计工作中的困难得以解决,从而使我完成这篇设计。
当然还要感谢其它老师,他们用心的上课、孜孜不倦的教导和平时的答疑让我学习了很多知识,对我的论文有了很大的帮助。
最后,也要感谢我的同学们。
他们四年来的关心和帮助,对我的学习和生活产生了深远的影响。