• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

亮度可调智能节能led灯VHDL代码Quartus仿真

07/07 15:30
756
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

2-240122143G1514.doc

共1个文件

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

  • 2-240122143G1514.doc
    下载

相关推荐