📄 lamp.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 + -