基于FPGA的彩灯控制器设计.docx
《基于FPGA的彩灯控制器设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的彩灯控制器设计.docx(14页珍藏版)》请在冰豆网上搜索。
基于FPGA的彩灯控制器设计
XX轻工业学院
可编程数字系统设计
题目基于FPGA的彩灯控制器设计
学生XXX焕焕
专业班级电子信息工程10-2班
学号541001030249
院〔系〕电气信息工程学院
指导教师胡智宏石军
完成时间2021年6月21日
XX轻工业学院
课程设计任务书
题目基于FPGA的彩灯控制器设计
专业、班级电信10-02班学号541001030249XXX焕焕
主要内容、根本要求、主要参考资料等:
主要内容:
要求学生使用硬件描述语言设计彩灯控制器的FPGA源程序,实现如下功能:
设计一个彩灯控制器,使彩灯〔LED管〕可以实现四种把戏循环变化及两种不同频率的闪烁,有复位开关。
整个系统有七个输入信号CLK,CLR,A,B,C,D,OPT,六个输出信号控制六个彩灯。
OPT的上下电平控制彩灯闪烁的快慢,A,B,C,D控制各种不同把戏彩灯的变换。
此彩灯控制系统设定有四种把戏变化。
四种把戏分别为:
a.彩灯从左到右逐次亮起,再逐次从右到左熄灭;b.彩灯两边同时亮两个,再逐次向中间亮;c.彩灯从左到右两个两个的亮,再从右到左两个两个逐次的亮;d.彩灯中间两个亮,再同时向两边散开。
根本要求:
1、掌握FPGA的程序设计方法。
2、掌握硬件描述语言语法。
3、程序设计完成后要求在软件中实现功能仿真。
主要参考资料:
1、周润景.基于QuartusⅡ的FPGA/CPLD数字系统设计实例[M].电子工业.2007,8
2、潘松黄继业.EDA技术实用教程〔第二版〕.:
科学,2006.9
完成期限:
2021.6.21—2021.6.25
指导教师签名:
课程负责人签名:
基于FPGA的彩灯控制器设计
摘要
中文摘要
随着科技的开展,在现代生活中,彩灯作为一种景观应用越来越多。
而在电子电路设计领域中,电子设计自动化(EDA)工具已成为主要的设计手段,VHDL语言那么是EDA的关键技术之一,它采用自顶向下的设计方法,即从系统总体要求出发,自上至下地将设计任务分解为不同的功能模块,最后将各功能模块连接形成顶层模块,完成系统硬件的整体设计。
本文介绍了基于EDA技的多路彩灯控制器的设计与分析。
在MAX+PLUSII环境下采用VHDL语言实现,论述了基于VHDL语言和FPGA芯片的数字系统设计思想和实现过程。
电子设计自动化技术EDA的开展给电子系统的设计带来了革命性的变化,EDA软件设计工具,硬件描述语言,可编程逻辑器件使得EDA技术的应用走向普及。
FPGA是新型的可编程逻辑器件,采用FPGA进展产品开发可以灵活地进展模块配置,大大缩短了产品开发周期,也有利于产品向小型化,集成化的方向开展。
关键词:
VHDL彩灯仿真控制
英文摘要
LanterncontrollerdesignbasedonFPGA
Withthedevelopmentofscienceandtechnology,inmodernlife,colorfullightsasalandscapemoreandmoreapplications.However,intheelectroniccircuitdesigndomain,theelectronicdesignautomation(EDA)toolshavebeethemaindesignmethod,VHDLlanguageisoneofthekeytechnologiesofEDA,itusesfromthetopdesignmethod,namelyfromtheoverallsystemrequirements,fromtoptobottomofthedesigntaskdepositionintothedifferentfunctionmodule,finallyeachfunctionmoduleisconnectedtoformthetopmodule,theoveralldesignofsystemhardware.Therefore,thispaperintroducesthedesignandanalysisofmultiplelightscontrollerbasedontheEDAtechnique.IntheMAX+PLUSIIenvironmentusingVHDLlanguage,discussesthedigitalsystemdesignideaofVHDLlanguageandtheFPGAchipandtheimplementationprocessbasedon.ThedevelopmentofelectronicdesignautomationtechnologyofEDAhasbroughtrevolutionarychangestothedesignofelectronicsystems,theEDAsoftwaredesigntool,thehardwaredescriptionlanguage,programmablelogicdevicemakestheapplicationofEDAtechnologytospread.TheFPGAisprogrammablelogicdevicemodel,usingFPGAcanflexiblymoduleconfigurationofproductdevelopment,shortentheproductdevelopmentcycle,alsoisadvantageoustotheproducttotheminiaturization,theintegrateddirection.
Keywords:
VHDLlanternsimulationcontrol
1、概述
1.1、设计目的
设计一个彩灯控制器,使彩灯〔LED管〕可以实现四种把戏循环变化及两种不同频率的闪烁,有复位开关。
整个系统有七个输入信号CLK,CLR,A,B,C,D,OPT,六个输出信号控制六个彩灯。
OPT的上下电平控制彩灯闪烁的快慢,A,B,C,D控制各种不同把戏彩灯的变换。
此彩灯控制系统设定有四种把戏变化。
四种把戏分别为:
a.彩灯从左到右逐次亮起,再逐次从右到左熄灭;b.彩灯两边同时亮两个,再逐次向中间亮;c.彩灯从左到右两个两个的亮,再从右到左两个两个逐次的亮;d.彩灯中间两个亮,再同时向两边散开。
1.2、设计要求
◆掌握FPGA的程序设计方法。
◆掌握硬件描述语言语法。
◆程序设计完成后要求在软件中实现功能仿真。
2、系统设计
2.1、设计原理
整个系统共有七个输入信号:
基准时钟信号CLK,系统清零信号(复位信号)CLR,彩灯节奏快慢选择开关OPT;共有4个输出信号Q[3..0],分别用于控制四路彩灯。
据此,我们可将整个彩灯控制器CDKZQ分为四大局部:
彩灯把戏控制局部、分频局部、定时局部和计数局部。
当各个模块均完成上述操作之后,形成最后的四路彩灯显示系统,并且进展仿真。
仿真通过,即可下载到指定的FPGA芯片里面,并进展实际连线,进展最后的硬件测试。
把分频局部的不同频率的时钟信号CP输送到计数局部,从而控制彩灯闪烁速度的快慢,定时局部控制每种速度维持的时间长短。
2.1.1系统原理设计图
图表1
2.2、设计方案
在电路中以1代表灯亮,以0代表灯灭,由0、1按不同的规律组合代表不同的灯光图案,同时使其选择不同的频率,从而实现多种图案多种频率的把戏功能显示。
在该电路中只需简单的修改程序就可以灵活地调整彩灯图案和变化方式。
下面就以一个四路彩灯控制系统的实现为例进展简单说明。
此四路彩灯控制系统设定有四种把戏变化。
彩灯图案状态变换的速度有快、慢两种。
3、程序仿真过程
startpilation先编译
generatefunctionalsimulationnetlist然后生成功能仿真网络表
assignments–setting—simulationsetting设置成功能仿真
然后新建一个vectorwaveformfile
通过view—utilitywindows--nodefinder把输入输出管脚添加进波形仿真图里点击startsimulation
3.1仿真图
图表2
由图可见:
正常情况下灯按照把戏abcd的顺序循环d在80NS---120NS的高电平使得把戏变为D把戏,D高电平完毕,灯顺序进展A把戏。
OPT在80NS---170NS高电平使得灯变换速度提高2倍但是001100和100000这两种灯的状态任然占用了两个时钟周期,这是因为把戏d和把戏a状态转换之间没有立即衔接,导致220NS处CLR高电平使得灯全部清0,不再变化DIV2是二分频输出,由图可见是输入时钟CLK的二分频。
4、实验结果分析
实验说明,此设计方法能够满足多种不同把戏彩灯的变化要求,并且该方法便于扩展不同变化模式的彩灯把戏,同时又实现了彩灯的两种不同频率的闪烁。
如果不按任何按键时候,灯就按四种把戏顺序循环跑,如果按下某个键再松开,比方按下C键然后松开,那么不管之前灯跑到哪个把戏,按键后灯就会从C代表的把戏处开场跑,然后是D把戏,然后是A把戏,依次循环。
但是A,B,C,D认为是按下会弹起的按键,因为这个程序里,如果一直按着按键不松手,会导致灯只是反复跑一个把戏。
比方按着B键不松手,那么就会反复跑B把戏。
还有不能允许同时按下两个键,三个键,4个键,也就是说,同一时刻ABCD只能有一个是高电平,否那么会出错,因为这个程序并没有防错机制。
5、心得体会
本次设计的课题是彩灯控制器的设计,当拿到这个课题的时候经过分析就知道关键是计数器和分频器的使用,分频的方法有很多种,对于同一种功能的实现,用VHDL可以采用多种方式进展描述,每种方式之间各有优劣,本次设计只采用了其中较简单的一种,应尽量用最简洁的语言写出所需功能的程序。
通过这次课程设计对EDA技术有了更进一步的熟悉,VHDL 语言和C语言等其他语言还是有很大的区别。
VHDL是EDA技术的重要组成局部,其具有与具体硬件电路无关和与设计平台无关的特性,并且具有良好的电路行为描述和系统描述的能力,并在语言易读性和层次化、构造化设计方面,表现了强大的生命力和应用潜力。
其主要的也是最大的优点就在于设计者可以专心致力于其功能的实现,而不需要对不影响功能的与工艺有关的因素花费过多的时间和精力。
在实际操作中发现设计和课本上的知识有很大联系,但又高于课本,一个简单的原理要把它应用以及和其他功能综合起来就有些困难。
通过设计也稳固了我们的书本知识以及通过借阅书籍和上网查找资料,也丰富了自己对EDA的了解。
6、致谢
本设计过程中得到教师的悉心指导,设计过程中教师屡次帮我分析思路,开拓视角,在我遇到困难想要放弃的时候给予我最大的支持和鼓励。
教师那严谨XX的治学态度、踏实坚韧的工作精神,将使我终身受益;另外同学和朋友的热心帮助也使我学到了不少的知识。
再多华美的语言也显得苍白,在此,谨向教师和同学们致以诚挚的谢意和崇高的敬意。
因为他们我对这次课程设计有了深刻的印象,虽然只有短暂的一周,但在这期间,却让我受益匪浅,我深刻地认识到了“理论联系实际〞这句话的重要性与真实性。
7、参考文献
[1]周润景.基于QuartusⅡ的FPGA/CPLD数字系统设计实例[M].XX:
电子工业,2007,8
[2]潘松黄继业.EDA技术实用教程〔第二版〕[M].:
科学,2006.9
[3]林明权马维旻.VHDL数字控制系统设计范例[M].XX:
电子
工业,2003.1
[4]褚振勇.FPGA设计及应用〔第三版〕[M].XX:
电子科技大学,2021.4
[5]X毅刚彭喜元彭宇.单片机原理及应用〔第二版〕[M].:
高等教育,2021.11
8、附录
彩灯控制器的源程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityhorseracelampis
port(clk:
instd_logic;
clr:
instd_logic;
a:
instd_logic;
b:
instd_logic;
c:
instd_logic;
d:
instd_logic;
opt:
instd_logic;
q:
outstd_logic_vector(5downto0);
div2:
outstd_logic
);
end;
architectureoneofhorseracelampis
typestatesis(s0,s1,s2,s3);
signalpresent:
states;
signalq1:
std_logic_vector(5downto0);
signalcount:
std_logic_vector(3downto0);
signalhalfclk:
std_logic_vector(1downto0);
signalclkin:
std_logic_vector(1downto0);
begin
process(clk)
begin
ifclk'eventandclk='1'then
halfclk<=halfclk+1;
endif;
endprocess;
process(opt)
begin
ifopt='0'
then
clkin(0)<=halfclk(0);
else
clkin(0)<=clk;
endif;
endprocess;
process(clk,clr,a,b,c,d)
begin
ifclr='1'then
present<=s0;
q1<=(others=>'0');
elsifclkin(0)'eventandclkin(0)='1'then
casepresentis
whens0=>ifq1="000000"then
q1<="100000";
else
ifcount="1100"then
count<=(others=>'0');
q1<="100001";
present<=s1;
elsifb='1'then
count<=(others=>'0');
q1<="100001";
present<=s1;
elsifc='1'then
count<=(others=>'0');
q1<="110000";
present<=s2;
elsifd='1'then
count<=(others=>'0');
q1<="001100";
present<=s3;
else
casecountis
when"0000"=>q1<="100000";
when"0001"=>q1<="110000";
when"0010"=>q1<="111000";
when"0011"=>q1<="111100";
when"0100"=>q1<="111110";
when"0101"=>q1<="111111";
when"0110"=>q1<="111110";
when"0111"=>q1<="111100";
when"1000"=>q1<="111000";
when"1001"=>q1<="110000";
when"1010"=>q1<="100000";
when"1011"=>q1<="000000";
whenothers=>null;
endcase;
count<=count+1;
present<=s0;
endif;
endif;
whens1=>ifcount="0011"then
count<=(others=>'0');
q1<="110000";
present<=s2;
elsifa='1'then
count<=(others=>'0');
q1<="100000";
present<=s0;
elsifc='1'then
count<=(others=>'0');
q1<="110000";
present<=s2;
elsifd='1'then
count<=(others=>'0');
q1<="001100";
present<=s3;
else
casecountis
when"0000"=>q1<="100001";
when"0001"=>q1<="110011";
when"0010"=>q1<="111111";
whenothers=>null;
endcase;
count<=count+1;
present<=s1;
endif;
whens2=>ifcount="0110"then
count<=(others=>'0');
q1<="001100";
present<=s3;
elsifa='1'then
count<=(others=>'0');
q1<="100000";
present<=s0;
elsifb='1'then
count<=(others=>'0');
q1<="100001";
present<=s1;
elsifd='1'then
count<=(others=>'0');
q1<="001100";
present<=s3;
else
casecountis
when"0000"=>q1<="110000";
when"0001"=>q1<="111100";
when"0010"=>q1<="111111";
when"0011"=>q1<="000011";
when"0100"=>q1<="001100";
when"0101"=>q1<="110000";
whenothers=>null;
endcase;
count<=count+1;
present<=s2;
endif;
whens3=>ifcount="0011"then
count<=(others=>'0');
q1<="100000";
present<=s0;
elsifa='1'then
count<=(others=>'0');
q1<="100000";
present<=s0;
elsifb='1'then
count<=(others=>'0');
q1<="100001";
present<=s1;
elsifc='1'then
count<=(others=>'0');
q1<="110000";
present<=s2;
else
casecountis
when"0000"=>q1<="001100";
when"0001"=>q1<="010010";
when"0010"=>q1<="100001";
whenothers=>null;
endcase;
count<=count+1;
present<=s3;
endif;
endcase;
endif;
endprocess;
div2<=halfclk(0);
q<=q1;
end;