⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lamp.vhd

📁 一个汽车尾灯的控制电路。 用6个发光二极管模拟6个汽车尾灯(汽车尾部左、右各3个)
💻 VHD
字号:
----汽车控制器实体设计
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY lamp IS
PORT(reset :IN STD_LOGIC;
       clk :IN STD_LOGIC;
        lf :IN STD_LOGIC;      ----左开关
        rt :IN STD_LOGIC;      ----右开关
        wd :OUT STD_LOGIC_VECTOR(5 DOWNTO 0));   ----左右显示灯
END lamp;
----汽车尾灯控制器结构体设计程序;
ARCHITECTURE be_lamp OF lamp IS
----枚举控制器的所有状态,枚举数据类型为STATE_TYPE ;
TYPE STATE_TYPE IS (st0,st1,st2,st3,st4,st5,st6,st7);
-------- up: st0:000 000  
-------- left: st1:100 000   st2:010 000  st3:001 000;
--------right: st4:000 001   st5:000 010  st6:000 100;
--------others: st7:111 111 and st0:000000;
SIGNAL current_state,next_state:STATE_TYPE;
----定义两个数据类型为STATE_TYPE 的信号current_state,next_state;
BEGIN
PROCESS(reset,clk,lf,rt)
BEGIN
  IF(reset='0')  THEN
  wd<="000000";
  current_state<=st0;
  ELSIF(clk'EVENT AND clk='1')  THEN   ----当时钟上升沿出现时;
  current_state<=next_state;
  END IF;
CASE current_state IS    ----对控制器所处的状态进行判断
WHEN st0=>
   wd<="000000";         ----开关处于st0状态时;
   IF(lf='0' AND rt='0')  THEN         ----当左开关都未打开时;
   next_state<=st0;                    ----控制器进入st0状态;
   ELSIF(lf='1' AND rt='1')   THEN     ----当左右开关都打开时;
   next_state<=st7;                    ----控制器进入st7状态;
   ELSIF(lf='1' AND rt='0')  THEN      ----当左开关打开时;
   next_state<=st1;                    ----控制器进入st1状态;
   ELSIF(lf='0' AND rt='1')  THEN      ----当右开关打开时;
   next_state<=st4;                    ----控制器进入st4状态;
   END IF;
 
WHEN st1=>
   wd<="001000";        ----开关处于st1状态时;
   IF(lf='0' AND rt='0')  THEN         ----当左右开关都未打开时;
   next_state<=st0;                    ----控制器进入st0状态;
   ELSIF(lf='1' AND rt='1')  THEN      ----当左右开关都打开时;
   next_state<=st7;                    ----控制器进入st7状态;
   ELSIF(lf='1' AND rt='0')  THEN      ----当左开关打开时;
   next_state<=st2;                    ----控制器进入st2状态;
   ELSIF(lf='0' AND rt='1')  THEN      ----当右开关打开时;
   next_state<=st4;                    ----控制器进入st4状态;
   END IF;
 
WHEN st2=>
   wd<="010000";       ----开关处于st2状态时;       
   IF(lf='0' AND rt='0')  THEN        ----当左右开关都未打开时;
   next_state<=st0;                   ----控制器进入st0状态;
   ELSIF(lf='1' AND rt='1')  THEN     ----当左右开关都打开时;
   next_state<=st7;                   ----控制器进入st7状态;
   ELSIF(lf='1' AND rt='0')  THEN     ----当左开关打开时;
   next_state<=st3;                   ----控制器进入st3状态;
   ELSIF(lf='0' AND rt='1')  THEN     ----当右开关打开时;
   next_state<=st4;                   ----控制器进入st4状态;
   END IF;
 
WHEN st3=>
   wd<="100000";     ----开关处于st3状态时;
   IF(lf='0' AND rt='0')  THEN       ----当左右开关都未打开时;
   next_state<=st0;                  ----控制器进入st0状态;
   ELSIF(lf='1' AND rt='1')  THEN    ----当左右开关都打开时;
   next_state<=st7;                  -----控制器进入st7状态;
   ELSIF(lf='1' AND rt='0')  THEN    ----当左开关打开时;
   next_state<=st0;                  ----控制器进入st0状态;
   ELSIF(lf='0' AND rt='1')  THEN    ----当右开关打开时;
   next_state<=st4;                  ----控制器进入st4状态;
   END IF;
 
WHEN st4=>          ----开关处于st4状态时;
  wd<="000100";
  IF(lf='0' AND rt='0')  THEN        ----当左右开关都未打开时;
   next_state<=st0;                  ----控制器进入st0状态;
   ELSIF(lf='1' AND rt='1')  THEN    ----当左右开关都打开时;
   next_state<=st7;                  -----控制器进入st7状态;
   ELSIF(lf='1' AND rt='0')  THEN    ----当左开关打开时;
   next_state<=st1;                  ----控制器进入st2状态;
   ELSIF(lf='0' AND rt='1')  THEN    ----当右开关打开时;
   next_state<=st5;                  ----控制器进入st4状态;
   END IF;
 
WHEN st5=>         ----开关处于st5状态时;
  wd<="000010";
  IF(lf='0' AND rt='0')  THEN        ----当左右开关都未打开时;
   next_state<=st0;                  ----控制器进入st0状态;
   ELSIF(lf='1' AND rt='1')  THEN    ----当左右开关都打开时;
   next_state<=st7;                  ----控制器进入st7状态;
   ELSIF(lf='1' AND rt='0')  THEN    ----当左开关打开时;
   next_state<=st1;                  ----控制器进入st1状态;
   ELSIF(lf='0' AND rt='1')  THEN    ----当右开关打开时;
   next_state<=st6;                  ----控制器进入st6状态;
   END IF;
 
WHEN st6=>        ----开关处于st6状态时;
   wd<="000001";
   IF(lf='0' AND rt='0')  THEN       ----当左右开关都未打开时;
   next_state<=st0;                  ----控制器进入st0状态;
   ELSIF(lf='1' AND rt='1')  THEN    ----当左右开关都打开时;
   next_state<=st7;                  ----控制器进入st7状态;
   ELSIF(lf='1' AND rt='0')  THEN    ----当左开关打开时;
   next_state<=st1;                  ----控制器进入st1状态;
   ELSIF(lf='0' AND rt='1')  THEN    ----当右开关打开时;
   next_state<=st4;                  ----控制器进入st0状态;
   END IF;
 
WHEN st7=>       ----控制器进入st7状态;
   wd<="111111";                    
   IF(lf='0' AND rt='0')  THEN       ----当左右开关都未打开时;
   next_state<=st0;                  ----控制器进入st0状态;
   ELSIF(lf='1' AND rt='1')  THEN       ----当左右开关都打开时;  
   next_state<=st0;                  ----控制器进入st7状态;
   ELSIF(lf='1' AND rt='0')  THEN    ----当左开关打开时;
   next_state<=st1;                  ----控制器进入st1状态;
   ELSIF(lf='0' AND rt='1')  THEN    ----当右开关打开时;
   next_state<=st4;                  ----控制器进入st4状态;
   END IF;
  
 END CASE;
END PROCESS;
END be_lamp;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -