基于VHDL的八路彩灯控制器.docx
- 文档编号:9810072
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:18
- 大小:159.64KB
基于VHDL的八路彩灯控制器.docx
《基于VHDL的八路彩灯控制器.docx》由会员分享,可在线阅读,更多相关《基于VHDL的八路彩灯控制器.docx(18页珍藏版)》请在冰豆网上搜索。
基于VHDL的八路彩灯控制器
1.任务需求
现今生活中,市场上未能吸取顾客的注意,高出各式各样的方法,其中彩灯的装饰便是其中非常普遍的一种。
使用彩灯即可起装饰宣传作用,又可以现场气氛,城市也因为众多的彩灯而变得灿烂辉煌。
VHDL语言作为可编程逻辑器件的标准语言描述能力强,覆盖面广,抽象能力强,在实际应用中越来越广泛。
在这个阶段,人们开场追求贯彻整个系统设计的自动化,可以从繁重的设计工作中彻底解脱出来,把精力集中在创造性的方案与概念构思上,从而可以提高设计效率,缩短产品的研制周期。
整个过程通过EDA工具自动完成,大大减轻了设计人员的工作强度,提高了设计质量,减少了出错的时机。
要求设计一个8路彩灯控制器,要求彩灯可以演示以下花型:
(1)从两边向中间亮,再从中间向两边亮;
(2)实现淡入淡出效果
(3)从左至右逐个亮,在从右到左逐个亮;
2.总体设计
2.1各个把戏的状态图
中选择把戏一时状态图如下:
S0=〞ZZZZZZZZ〞S1="10000001"S2="01000010"S3="00100100"S4="00011000"S5="00100100"S6="01000010"
CLR
中选择把戏二时状态图如下:
S0=〞ZZZZZZZZ〞S1="00000000"S2="10000000"S3="11000000"
S4="11100000"S5="11110000"S6="11111000"S7=〞11111100〞
S8=〞11111110〞S9="11111111"S10="01111111"S11="00111111"
S12="00011111"S13="00001111"S14="00000111"S15=〞00000011〞
S16=〞00000001〞
CLR
中选择把戏三时状态图如下:
S0=〞ZZZZZZZZ〞S1="10000000"S2="01000000"S3="00100000"
S4="00010000"S5="00001000"S6="00000100"S7=〞00000010〞
S8=〞00000001〞S9="00000010"S10="00000100"S11="00001000"
S12="0001000"S13="00100000"S14="01000000"
CLR
2.2总体框图
CLK
XUAN
3.模块设计
3.1分频器模块
--由于机器时钟周期太短,不能满足要求
--此模块实现分频,得到需要的时钟
LIBRARYIEEE;
USEIEEE.std_logic_1164.ALL;
USEIEEE.std_logic_unsigned.ALL;
ENTITYfenpinqiIS
PORT(
CLK:
INSTD_LOGIC;--原机器时钟
CLR:
INSTD_LOGIC;
CLK1:
OUTSTD_LOGIC);--分频后的时钟
ENDfenpinqi;
ARCHITECTUREARTOFfenpinqiIS
SIGNALCK:
STD_LOGIC;
BEGIN
PROCESS(CLK,CLR)IS
VARIABLETEMP:
STD_LOGIC_VECTOR(2DOWNTO0);
BEGIN
IFCLR='1'THEN
CK<='0';
TEMP:
="000";
ELSIF(CLK'EVENTANDCLK='1')THEN
IFTEMP="111"THEN
TEMP:
="000";
CK<=NOTCK;
ELSE
TEMP:
=TEMP+'1';
ENDIF;
ENDIF;
ENDPROCESS;
CLK1<=CK;
ENDART;
3.2把戏一模块
--用分频器分频后的时钟来显示把戏实现
--从两边向中间亮,再从中间向两边亮;
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYhy1IS
PORT(CLK1:
INSTD_LOGIC;
CLR:
INSTD_LOGIC;
XUAN:
INSTD_LOGIC_VECTOR(1DOWNTO0);
LED1:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDENTITYhy1;
ARCHITECTUREARTOFhy1IS
TYPESTATEIS(S0,S1,S2,S3,S4,S5,S6);--设计状态机,实现把戏转换
SIGNALCURRENT_STATE:
STATE;
SIGNALLIGHT:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
PROCESS(CLR,CLK1,XUAN)IS--定义把戏(1为灯亮,0为灯灭)
CONSTANTL1:
STD_LOGIC_VECTOR(7DOWNTO0):
="10000001";
CONSTANTL2:
STD_LOGIC_VECTOR(7DOWNTO0):
="01000010";
CONSTANTL3:
STD_LOGIC_VECTOR(7DOWNTO0):
="00100100";
CONSTANTL4:
STD_LOGIC_VECTOR(7DOWNTO0):
="00011000";
CONSTANTL5:
STD_LOGIC_VECTOR(7DOWNTO0):
="00100100";
CONSTANTL6:
STD_LOGIC_VECTOR(7DOWNTO0):
="01000010";
BEGIN
IFXUAN="01"THEN
IFCLR='1'THEN
CURRENT_STATE<=S0;
ELSIF(CLK1'EVENTANDCLK1='1')THEN
CASECURRENT_STATEIS--状态机转换
WHENS0=>LIGHT<="ZZZZZZZZ";CURRENT_STATE<=S1;
WHENS1=>LIGHT<=L1;CURRENT_STATE<=S2;
WHENS2=>LIGHT<=L2;CURRENT_STATE<=S3;
WHENS3=>LIGHT<=L3;CURRENT_STATE<=S4;
WHENS4=>LIGHT<=L4;CURRENT_STATE<=S5;
WHENS5=>LIGHT<=L5;CURRENT_STATE<=S6;
WHENS6=>LIGHT<=L6;CURRENT_STATE<=S1;
ENDCASE;
ENDIF;
ENDIF;
ENDPROCESS;
LED1<=LIGHT;
ENDART;
3.3把戏二模块
--用分频器分频后的时钟来显示把戏实现
--实现淡入淡出效果
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYhy2IS
PORT(CLK1:
INSTD_LOGIC;
CLR:
INSTD_LOGIC;
XUAN:
INSTD_LOGIC_VECTOR(1DOWNTO0);
LED2:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDENTITYhy2;
ARCHITECTUREARTOFhy2IS--设计状态机,实现把戏转换
TYPESTATEIS(S0,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15,S16);
SIGNALCURRENT_STATE:
STATE;
SIGNALLIGHT:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
PROCESS(CLR,CLK1,XUAN)IS--定义把戏(1为灯亮,0为灯灭)
CONSTANTL1:
STD_LOGIC_VECTOR(7DOWNTO0):
="00000000";
CONSTANTL2:
STD_LOGIC_VECTOR(7DOWNTO0):
="10000000";
CONSTANTL3:
STD_LOGIC_VECTOR(7DOWNTO0):
="11000000";
CONSTANTL4:
STD_LOGIC_VECTOR(7DOWNTO0):
="11100000";
CONSTANTL5:
STD_LOGIC_VECTOR(7DOWNTO0):
="11110000";
CONSTANTL6:
STD_LOGIC_VECTOR(7DOWNTO0):
="11111000";
CONSTANTL7:
STD_LOGIC_VECTOR(7DOWNTO0):
="11111100";
CONSTANTL8:
STD_LOGIC_VECTOR(7DOWNTO0):
="11111110";
CONSTANTL9:
STD_LOGIC_VECTOR(7DOWNTO0):
="11111111";
CONSTANTL10:
STD_LOGIC_VECTOR(7DOWNTO0):
="01111111";
CONSTANTL11:
STD_LOGIC_VECTOR(7DOWNTO0):
="00111111";
CONSTANTL12:
STD_LOGIC_VECTOR(7DOWNTO0):
="00011111";
CONSTANTL13:
STD_LOGIC_VECTOR(7DOWNTO0):
="00001111";
CONSTANTL14:
STD_LOGIC_VECTOR(7DOWNTO0):
="00000111";
CONSTANTL15:
STD_LOGIC_VECTOR(7DOWNTO0):
="00000011";
CONSTANTL16:
STD_LOGIC_VECTOR(7DOWNTO0):
="00000001";
BEGIN
IFXUAN="10"THEN
IFCLR='1'THEN
CURRENT_STATE<=S0;
ELSIF(CLK1'EVENTANDCLK1='1')THEN
CASECURRENT_STATEIS--状态机转换
WHENS0=>LIGHT<="ZZZZZZZZ";CURRENT_STATE<=S1;
WHENS1=>LIGHT<=L1;CURRENT_STATE<=S2;
WHENS2=>LIGHT<=L2;CURRENT_STATE<=S3;
WHENS3=>LIGHT<=L3;CURRENT_STATE<=S4;
WHENS4=>LIGHT<=L4;CURRENT_STATE<=S5;
WHENS5=>LIGHT<=L5;CURRENT_STATE<=S6;
WHENS6=>LIGHT<=L6;CURRENT_STATE<=S7;
WHENS7=>LIGHT<=L7;CURRENT_STATE<=S8;
WHENS8=>LIGHT<=L8;CURRENT_STATE<=S9;
WHENS9=>LIGHT<=L9;CURRENT_STATE<=S10;
WHENS10=>LIGHT<=L10;CURRENT_STATE<=S11;
WHENS11=>LIGHT<=L11;CURRENT_STATE<=S12;
WHENS12=>LIGHT<=L12;CURRENT_STATE<=S13;
WHENS13=>LIGHT<=L13;CURRENT_STATE<=S14;
WHENS14=>LIGHT<=L14;CURRENT_STATE<=S15;
WHENS15=>LIGHT<=L15;CURRENT_STATE<=S16;
WHENS16=>LIGHT<=L16;CURRENT_STATE<=S1;
ENDCASE;
ENDIF;
ENDIF;
ENDPROCESS;
LED2<=LIGHT;
ENDART;
3.4把戏三模块
--用分频器分频后的时钟来显示把戏实现
--从左至右逐个亮,在从右到左逐个亮
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYhy3IS
PORT(CLK1:
INSTD_LOGIC;
CLR:
INSTD_LOGIC;
XUAN:
INSTD_LOGIC_VECTOR(1DOWNTO0);
LED3:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDENTITYhy3;
ARCHITECTUREARTOFhy3IS--设计状态机,实现把戏转换
TYPESTATEIS(S0,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14);
SIGNALCURRENT_STATE:
STATE;
SIGNALLIGHT:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
PROCESS(CLR,CLK1,XUAN)IS--定义把戏(1为灯亮,0为灯灭)
CONSTANTL1:
STD_LOGIC_VECTOR(7DOWNTO0):
="10000000";
CONSTANTL2:
STD_LOGIC_VECTOR(7DOWNTO0):
="01000000";
CONSTANTL3:
STD_LOGIC_VECTOR(7DOWNTO0):
="00100000";
CONSTANTL4:
STD_LOGIC_VECTOR(7DOWNTO0):
="00010000";
CONSTANTL5:
STD_LOGIC_VECTOR(7DOWNTO0):
="00001000";
CONSTANTL6:
STD_LOGIC_VECTOR(7DOWNTO0):
="00000100";
CONSTANTL7:
STD_LOGIC_VECTOR(7DOWNTO0):
="00000010";
CONSTANTL8:
STD_LOGIC_VECTOR(7DOWNTO0):
="00000001";
CONSTANTL9:
STD_LOGIC_VECTOR(7DOWNTO0):
="00000010";
CONSTANTL10:
STD_LOGIC_VECTOR(7DOWNTO0):
="00000100";
CONSTANTL11:
STD_LOGIC_VECTOR(7DOWNTO0):
="00001000";
CONSTANTL12:
STD_LOGIC_VECTOR(7DOWNTO0):
="00010000";
CONSTANTL13:
STD_LOGIC_VECTOR(7DOWNTO0):
="00100000";
CONSTANTL14:
STD_LOGIC_VECTOR(7DOWNTO0):
="01000000";
BEGIN
IFXUAN="11"THEN
IFCLR='1'THEN
CURRENT_STATE<=S0;
ELSIF(CLK1'EVENTANDCLK1='1')THEN
CASECURRENT_STATEIS--状态机转换
WHENS0=>LIGHT<="ZZZZZZZZ";CURRENT_STATE<=S1;
WHENS1=>LIGHT<=L1;CURRENT_STATE<=S2;
WHENS2=>LIGHT<=L2;CURRENT_STATE<=S3;
WHENS3=>LIGHT<=L3;CURRENT_STATE<=S4;
WHENS4=>LIGHT<=L4;CURRENT_STATE<=S5;
WHENS5=>LIGHT<=L5;CURRENT_STATE<=S6;
WHENS6=>LIGHT<=L6;CURRENT_STATE<=S7;
WHENS7=>LIGHT<=L7;CURRENT_STATE<=S8;
WHENS8=>LIGHT<=L8;CURRENT_STATE<=S9;
WHENS9=>LIGHT<=L9;CURRENT_STATE<=S10;
WHENS10=>LIGHT<=L10;CURRENT_STATE<=S11;
WHENS11=>LIGHT<=L11;CURRENT_STATE<=S12;
WHENS12=>LIGHT<=L12;CURRENT_STATE<=S13;
WHENS13=>LIGHT<=L13;CURRENT_STATE<=S14;
WHENS14=>LIGHT<=L14;CURRENT_STATE<=S1;
ENDCASE;
ENDIF;
ENDIF;
ENDPROCESS;
LED3<=LIGHT;
ENDART;
3.5顶层设计
--将以上几个模块整合起来,实现八路彩灯的把戏控制
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYcaidengIS
PORT(CLK:
INSTD_LOGIC;
CLR:
INSTD_LOGIC;
XUAN:
INSTD_LOGIC_VECTOR(1DOWNTO0);
LED:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDENTITYcaideng;
ARCHITECTUREARTOFcaidengIS
PONENTfenpinqi--对分频器模块进展定义
PORT(
CLK:
INSTD_LOGIC;
CLR:
INSTD_LOGIC;
CLK1:
OUTSTD_LOGIC);
ENDPONENTfenpinqi;
PONENThy1--对把戏一模块进展定义
PORT(CLK1:
INSTD_LOGIC;
CLR:
INSTD_LOGIC;
XUAN:
INSTD_LOGIC_VECTOR(1DOWNTO0);
LED1:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDPONENThy1;
PONENThy2--对把戏二模块进展定义
PORT(CLK1:
INSTD_LOGIC;
CLR:
INSTD_LOGIC;
XUAN:
INSTD_LOGIC_VECTOR(1DOWNTO0);
LED2:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDPONENThy2;
PONENThy3--对把戏三模块进展定义
PORT(CLK1:
INSTD_LOGIC;
CLR:
INSTD_LOGIC;
XUAN:
INSTD_LOGIC_VECTOR(1DOWNTO0);
LED3:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDPONENThy3;
SIGNALS:
STD_LOGIC;--定义中间变量
SIGNALL1:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALL2:
STD_LOGIC_VECTOR(7DOWNTO0);
SIGNALL3:
STD_LOGIC_VECTOR(7DOWNTO0);
BEGIN
U1:
fenpinqiPORTMAP(CLK,CLR,S);--对分频器模块进展例化
U2:
hy1PORTMAP(S,CLR,XUAN,L1);--对把戏一模块进展定义
U3:
hy2PORTMAP(S,CLR,XUAN,L2);--对把戏二模块进展例化
U4:
hy3PORTMAP(S,CLR,XUAN,L3);--对把戏三模块进展例化
LED<=L1WHENXUAN="01"ELSE--让LED显示选定的把戏
L2WHENXUAN="10"ELSE
L3;
ENDART;
4.仿真图
4.1分频器仿真波形
CLK为输入,是机器时钟。
上升沿有效
CLR为输入,是异步复位端,当为高电平时有效,CLK1保持状态
CLK1为输出,是分频后得到的我们需要的时钟,周期是原时钟的十六倍
4.2把戏一仿真波形
CLK1为输入,是分频后得到的时钟
CLR为输入,是异步复位端,当为高电平时有效
XUAN是输入,进展选择把戏.此时选择的是把戏一
LED1是输出,用来显示把戏实现从两边向中间亮,再从中间向两边亮,运行结果正确
4.3把戏二仿真波形
CLK1为输入,是分频后得到的时钟
CLR为输入,是异步复位端,当为高电平时有效
XUAN是输入,进展选择把戏.此时选择的是把戏二
LED1是输出,用来显示把戏实现淡入淡出效果,运行结果正确
4.4把戏三仿真波形
CLK1为输入,是分频后得到的时钟
CLR为输入,是异步复位端,当为高电平时有效
XUAN是输入,进展选择把戏.此时选择的是把戏二
LED1是输出,用来显示把戏从左至右逐个亮,在从右到左逐个亮,运行结果正确
4.5总体仿真波形
CLK为输入,是原机器时钟
CLR为输入,是异步复位端,当为高电平时有效
XUAN是输入,进展选择把戏,依次选择把戏一,把戏二,把戏三
LED1是输出,用来显示把戏,运行结果正确
5.心得体会
本次设计的课题是彩灯控制器的设计,当拿到这个课题的时候经过分析就知道关键是状态机和分频器的使用,分频的方法有很多种,对于同一种功能的实现,用VHDL可以采用多种方式进展描述,每种方式之间各有优劣,本次设计只采用了其中较简单的一种,应尽量用最简洁的语言写出所需功能的程序。
通过这次课程设计对EDA技术有了更进一步的熟悉,VHDL语言和C语言等其他语言还是有很大的区别。
VHDL是EDA技术的重要组成局部,其具有与具体硬件电路无关和与设计平台无关的特性,并且具有良好的电路行为描述和系统描述的能力,并在语言易读性和层次化、构造化设计方面,表现了强大的生命力和应用潜力。
其主要的也是最大的优点就在于设计者可以专心致力于其功能的实现,而不需要对不影响功能的与工艺有关的因素花费过多的时间和精力。
在实际操作中发现设计和课本上的知识有很大联系,但又高于课本,一个简单的原理要把它应用以及和其他功能综合起来就有些困难。
通过设计也稳固了我们的书本知识以及通过借阅书籍和上网
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 VHDL 八路 彩灯 控制器