名称:亮度可调智能节能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
756