题目
(1)使用开发板上最左与最右两组指示灯作为汽车尾部左右灯组,使用按键开关作为操控汽车的控制信号。
(2)要求:汽车启动时尾灯全亮,持续约1-2秒钟后熄灭,汽车正常行驶时指示灯全灭,右转时最右一组指示灯(八个)向右依次反复循环点亮;左转时最左一组指示灯(八个)向左依次反复循环点亮;刹车时两组灯全亮,熄火时全灭。
分析
五个功能:启动、熄火、刹车、左转、右转。
代码
LIBRARY IEEE;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_arith.all;
USE ieee.std_logic_unsigned.all;
ENTITY pan is
port(clk,start,left,right,brake,stop:in std_logic;
LR:out std_logic_vector(15 downto 0));
END ENTITY pan;
ARCHITECTURE one of pan is
TYPE STATETP IS(S1,S2,S3,S4,S5,S6); --6个状态
SIGNAL regl,regr,regb,regs,regt:STD_LOGIC;
BEGIN
PROCESS(clk)
variable count:INTEGER RANGE 0 TO 8;
variable num:INTEGER RANGE 0 TO 200:=0;
variable S:STATETP;
variable TAP:std_logic_vector(15 downto 0);
BEGIN
if clk'EVENT AND clk='1' then
regl<=left;
regr<=right;
regt<=start;
regb<=brake; --上升沿来到检查并且选择状态
regs<=stop;
if regl='0' AND left='1' then --左转的键由关到开
S:=S1;
TAP:="1000000000000000";
elsif regr='0'AND right='1' then --右转的键由关到开
S:=S2;
TAP:="0000000000000001";
elsif regb='0' AND brake='1' then --刹车键由关到开
S:=S3;
TAP:="1111111111111111";
elsif regs='0' AND stop='1' then --熄火键由关到开
S:=S4;
TAP:="0000000000000000";
elsif regt='0' AND start='1' then --启动键由关到开
S:=S5;
TAP:="1111111111111111";
num:=0;
elsif regl='1' AND left='0' then --左转的键由开到关
S:=S6;
TAP:="0000000000000000";
elsif regr='1'AND right='0' then --右转的键由开到关
S:=S6;
TAP:="0000000000000000";
elsif regb='1' AND brake='0' then --刹车键由开到关
S:=S6;
TAP:="0000000000000000";
end if;
count:=count+1;
if count=8 THEN
count:=0;
if S=S1 THEN --通过拼接实现左转
TAP(15 DOWNTO 8):=TAP(14 DOWNTO 8)&TAP(15);
elsif S=S2 THEN --通过拼接实现右转
TAP(7 DOWNTO 0):=TAP(0)&TAP(7 DOWNTO 1);
elsif S=S3 THEN
TAP:="1111111111111111";
elsif S=S4 THEN
TAP:=TAP;
elsif S=S5 THEN --通过计数实现启动后1~2s由亮到灭
if num<40 then
num:=num+1;
TAP:="1111111111111111";
else
TAP:="0000000000000000";
end if;
elsif S=S6 THEN
TAP:=TAP;
end if;
end if;
end if;
LR<=TAP;
end PROCESS;
end one;
板载测试
编角
测试
左转、右转是循环显示,只能发视频才能观察到,所以就拍个全亮的吧,其他功能都已实现,并且符合题意与现实生活。