名称:亮度可调智能节能led灯VHDL代码Quartus仿真
软件:Quartus
语言:VHDL
代码功能:
LED灯具有发光效率高、可控性好、响应速度快、寿命长等特点,由于LED灯照明所应用的场合、位置和时间段的不同,对LED灯的实际光照度也有有着不同的需求。这时就需要实现对LED灯的光照度进行方便的调节,使其不仅可提高光照的舒适度,还可以进一步节省能源的消耗,并且符合目前智能化控制的发展趋势。
设计一款室内LED灯节能优化控制系统,要求:
1、节能
当房间亮度足够亮的时候,LED灯熄灭;睡眠模式时,灯亮度会随着倒计时逐渐变暗。
2、控制
LED灯可能由用户通过按键Key1和按键Key2控制LED灯以两种模式照明手动模式和睡眠模式用户按下“Key1"键时即选择了手动模式,按键按一下是一档,按两下是二档,依此类推。
四个档位分别对应20%、50%、75%和100%亮度,当按键按第五下档位归零,LED灯关闭;用户按下“Key2”键时即选择了睡眠模式。
共四个档,按键操作与手动模式相同,四个档位分别对应5分钟、10分钟、15分钟和20分钟倒计时,倒计时结束或者用户按Key2键五下档位归零,LED灯关闭。
按键"Key1”和按键Key2是两种模式的选择,且在其中一种模式激活的状态下,用户无法切换到另一个模式,只有在两种模式都关闭的状态下,用户才能切换模式。
采用50MHZ时钟源的FPGA芯片,使用VHDL语言编程。完成该系统的软件和硬件的设计,并制作出实物装置,调试好后并能实际运用。
最后提交一篇毕业设计说明书,包括设计指标、设计原理、计算结果、使用说明书、参考文献、设计总结等。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. 仿真图
整体仿真
分频模块
将输入的50MHz分频输出1Hz信号,用于秒计时(控制模块的分钟倒计时使用)
按键检测模块
LED控制模块
部分代码展示:
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; ???USE?ieee.std_logic_unsigned.all; --LED控制模块 ENTITY?LED_ctrl?IS ???PORT?( ??????clk_in??????:?IN?STD_LOGIC;--时钟 ??????rst_n???????:?IN?STD_LOGIC;--复位 ??????clk_1hz?????:?IN?STD_LOGIC;--时钟1Hz ??????light_high??:?IN?STD_LOGIC;--白天亮度 ??????key1_p??????:?IN?STD_LOGIC;--按键1 ??????key2_p??????:?IN?STD_LOGIC;--按键2 ??????LED?????????:?OUT?STD_LOGIC--led输出 ???); END?LED_ctrl; ARCHITECTURE?trans?OF?LED_ctrl?IS ???SIGNAL?LED_light?:?STD_LOGIC?:=?'0'; ???--状态定义 ???type?state_type?is?(?????? ??????s_idle??????, ??????s_hand_1????, ??????s_hand_2????, ??????s_hand_3????, ??????s_hand_4????, ??????s_sleep_1???, ??????s_sleep_2???, ??????s_sleep_3???, ??????s_sleep_4???); SIGNAL?state:state_type; ???SIGNAL?min_5?????:?STD_LOGIC_VECTOR(11?DOWNTO?0); ???SIGNAL?min_10????:?STD_LOGIC_VECTOR(11?DOWNTO?0); ???SIGNAL?min_15????:?STD_LOGIC_VECTOR(11?DOWNTO?0); ???SIGNAL?min_20????:?STD_LOGIC_VECTOR(11?DOWNTO?0); ??? ???SIGNAL?count?????:?STD_LOGIC_VECTOR(7?DOWNTO?0)?:=?"00000000"; ??? ???SIGNAL?pwm_20????:?STD_LOGIC; ???SIGNAL?pwm_50????:?STD_LOGIC; ???SIGNAL?pwm_75????:?STD_LOGIC; ???SIGNAL?pwm_100???:?STD_LOGIC; BEGIN --状态机控制 ???PROCESS?(clk_in,?rst_n) ???BEGIN ??????IF?((NOT(rst_n))?=?'1')?THEN ?????????state?<=?s_idle; ??????ELSIF?(clk_in'EVENT?AND?clk_in?=?'1')?THEN ?????????CASE?state?IS ????????????WHEN?s_idle?=>--空闲状态 ???????????????IF?(key1_p?=?'1')?THEN ??????????????????state?<=?s_hand_1; ???????????????ELSIF?(key2_p?=?'1')?THEN ??????????????????state?<=?s_sleep_1; ???????????????END?IF; ????????????WHEN?s_hand_1?=>--手动1状态 ???????????????IF?(key1_p?=?'1')?THEN ??????????????????state?<=?s_hand_2; ???????????????END?IF; ????????????WHEN?s_hand_2?=>--手动2状态 ???????????????IF?(key1_p?=?'1')?THEN ??????????????????state?<=?s_hand_3; ???????????????END?IF; ????????????WHEN?s_hand_3?=>--手动3状态 ???????????????IF?(key1_p?=?'1')?THEN ??????????????????state?<=?s_hand_4; ???????????????END?IF; ????????????WHEN?s_hand_4?=>--手动4状态 ???????????????IF?(key1_p?=?'1')?THEN ??????????????????state?<=?s_idle; ???????????????END?IF; ????????????WHEN?s_sleep_1?=>--睡眠1状态 ???????????????IF?(key2_p?=?'1')?THEN ??????????????????state?<=?s_sleep_2; ???????????????ELSIF?(min_5?=?"000000000000")?THEN ??????????????????state?<=?s_idle; ???????????????END?IF; ????????????WHEN?s_sleep_2?=>--睡眠2状态 ???????????????IF?(key2_p?=?'1')?THEN ??????????????????state?<=?s_sleep_3; ???????????????ELSIF?(min_10?=?"000000000000")?THEN ??????????????????state?<=?s_idle; ???????????????END?IF; ????????????WHEN?s_sleep_3?=>--睡眠3状态 ???????????????IF?(key2_p?=?'1')?THEN ??????????????????state?<=?s_sleep_4; ???????????????ELSIF?(min_15?=?"000000000000")?THEN ??????????????????state?<=?s_idle; ???????????????END?IF; ????????????WHEN?s_sleep_4?=>--睡眠4状态 ???????????????IF?(key2_p?=?'1')?THEN ??????????????????state?<=?s_idle; ???????????????ELSIF?(min_20?=?"000000000000")?THEN ??????????????????state?<=?s_idle; ???????????????END?IF; ????????????WHEN?OTHERS?=> ???????????????state?<=?s_idle; ?????????END?CASE; ??????END?IF; ???END?PROCESS; ??? ???--控制pwm波,不同占空比对应不同亮度 ???PROCESS?(clk_in,?rst_n) ???BEGIN ??????IF?((NOT(rst_n))?=?'1')?THEN ?????????count?<=?"00000000"; ??????ELSIF?(clk_in'EVENT?AND?clk_in?=?'1')?THEN ?????????IF?(count?>=?"00110010")?THEN--计数100 ????????????count?<=?"00000000"; ?????????ELSE ????????????count?<=?count?+?"00000001";--计数 ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ???pwm_20?<=?'1'?WHEN?(count?<?"00001010")?ELSE--20%占空比 ?????????????'0'; ???pwm_50?<=?'1'?WHEN?(count?<?"00011001")?ELSE--50%占空比 ?????????????'0'; ???pwm_75?<=?'1'?WHEN?(count?<?"00100101")?ELSE--75%占空比 ?????????????'0'; ???pwm_100?<=?'1';--100%占空比 ??? ???--倒计时5分钟 ???PROCESS?(clk_1hz,?rst_n) ???BEGIN ??????IF?((NOT(rst_n))?=?'1')?THEN ?????????min_5?<=?"000100101100"; ??????ELSIF?(clk_1hz'EVENT?AND?clk_1hz?=?'1')?THEN ?????????IF?(state?=?s_idle)?THEN ????????????min_5?<=?"000100101100"; ?????????ELSIF?(state?=?s_sleep_1)?THEN ????????????min_5?<=?min_5?-?"000000000001"; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ????--倒计时10分钟 ???PROCESS?(clk_1hz,?rst_n) ???BEGIN ??????IF?((NOT(rst_n))?=?'1')?THEN ?????????min_10?<=?"001001011000"; ??????ELSIF?(clk_1hz'EVENT?AND?clk_1hz?=?'1')?THEN ?????????IF?(state?=?s_idle)?THEN ????????????min_10?<=?"001001011000"; ?????????ELSIF?(state?=?s_sleep_2)?THEN ????????????min_10?<=?min_10?-?"000000000001"; ?????????END?IF; ??????END?IF;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=607
546