基于VHDL的八路彩灯控制器.docx

上传人:b****7 文档编号:9552688 上传时间:2023-02-05 格式:DOCX 页数:19 大小:156.76KB
下载 相关 举报
基于VHDL的八路彩灯控制器.docx_第1页
第1页 / 共19页
基于VHDL的八路彩灯控制器.docx_第2页
第2页 / 共19页
基于VHDL的八路彩灯控制器.docx_第3页
第3页 / 共19页
基于VHDL的八路彩灯控制器.docx_第4页
第4页 / 共19页
基于VHDL的八路彩灯控制器.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

基于VHDL的八路彩灯控制器.docx

《基于VHDL的八路彩灯控制器.docx》由会员分享,可在线阅读,更多相关《基于VHDL的八路彩灯控制器.docx(19页珍藏版)》请在冰豆网上搜索。

基于VHDL的八路彩灯控制器.docx

基于VHDL的八路彩灯控制器

1.任务需求2

2.总体设计2

2.1各个花样的状态图2

2.2总体框图4

3.模块设计4

3.1分频器模块4

3.2花样一模块5

3.3花样二模块6

3.4花样三模块8

3.5顶层设计10

4.仿真图11

4.1分频器仿真波形11

4.2花样一仿真波形11

4.3花样二仿真波形12

4.4花样三仿真波形13

4.5总体仿真波形13

5.心得体会14

6.参考文献15

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

COMPONENTfenpinqi--对分频器模块进行定义

PORT(

CLK:

INSTD_LOGIC;

CLR:

INSTD_LOGIC;

CLK1:

OUTSTD_LOGIC);

ENDCOMPONENTfenpinqi;

COMPONENThy1--对花样一模块进行定义

PORT(CLK1:

INSTD_LOGIC;

CLR:

INSTD_LOGIC;

XUAN:

INSTD_LOGIC_VECTOR(1DOWNTO0);

LED1:

OUTSTD_LOGIC_VECTOR(7DOWNTO0));

ENDCOMPONENThy1;

COMPONENThy2--对花样二模块进行定义

PORT(CLK1:

INSTD_LOGIC;

CLR:

INSTD_LOGIC;

XUAN:

INSTD_LOGIC_VECTOR(1DOWNTO0);

LED2:

OUTSTD_LOGIC_VECTOR(7DOWNTO0));

ENDCOMPONENThy2;

COMPONENThy3--对花样三模块进行定义

PORT(CLK1:

INSTD_LOGIC;

CLR:

INSTD_LOGIC;

XUAN:

INSTD_LOGIC_VECTOR(1DOWNTO0);

LED3:

OUTSTD_LOGIC_VECTOR(7DOWNTO0));

ENDCOMPONENThy3;

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可以采用多种方式进行描述,每种方式之间各有优劣,本次设计只采用了其中较简单的一种,应尽量用最简洁的语

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1