汽车尾灯控制系统
设计任务:汽车尾灯控制系统
(一)顶层系统方案构思
图9-21表示汽车尾灯控制系统的顶层符号图。汽车尾灯控制器命名为QWK。
输入信号:左转弯传感器LH,右转弯传感器RH和紧急制动或慢行传感器JMH,另外,汽车尾灯主要是给后面行使汽车的司机注意。为了使尾灯的光信号更明显,采用亮灭交替的闪烁信号,其闪烁周期为2秒,即尾灯亮1秒,灭1秒,再亮1秒…。在图9-21中设置了一个1秒时钟的输入信号CP。
输出信号:输出共设两个,左面一个尾灯,右面一个尾灯,既左转弯时指示灯LD和右转弯时指示灯RD。
(二)控制器设计
从上至下的设计方法首先是从系统级分析,然后进行模块划分,分为受控部分和控制器部分。此尾灯控制系统的受控部分是传感器和指示灯,仅用几个二进制信号就可以完成,所以我们把精力放在设计控制器模块上。
汽车尾灯控制系统设置为四个状态,它们有以下定义:
A状态:传感器LH、RH、JMH信号无效,皆为0,表示汽车保持一定速度的直行或静止不动,左尾灯LD和右尾灯RD不闪烁发光。
B状态:传感器LH有效,RH、JMH无效,此时LH、RH、JMH状态为100,表示汽车向左转,左尾灯交替闪烁,右尾灯灭。
C状态:传感器RH有效,LH、JMH无效,此时LH、RH、JMH状态为010,表示汽车向右转,右尾灯交替闪烁,左尾灯灭。
D状态:传感器JMH有效,LH、RH无效,此时LH、RH、JMH状态为001,表示汽车慢行或紧急情况发生采取紧急制动,左右尾灯同时交替闪烁。
根据上述情况可以初步画出汽车尾灯控制系统的MDS图,如图9-22所示。
但是,图9-22的MDS图还存在以下几个问题。
1. 汽车在左转弯或右转弯时,相对应的左侧灯或右侧灯闪烁,但汽车同时有可能要放慢速度,JMH传感器有效;或者汽车已经放慢速度,JMH传感器生效,使左侧灯和右侧灯闪烁,同时又要左转弯或右转弯,使得LH或RH有效。此时LH、RH、JMH状态为101或011,尾灯控制器同时进入B和D状态或C和D状态,这是不可能的,因为对于LH和JMH(或RH和JMH)同时为1,即LH·JMH(RH·JMH)=1这样的转换条件,只能有一个状态,使上述两个状态的次态规定为D状态。
2. 图9-22的MDS图不满足全包含性,如LH、RH、JMH的组合状态为111和110。当然,一般不会发生这种情况,除非传感器失灵。不过我们也可以把这种情况的次态定义为D态。后面行驶汽车的司机看到前面汽车不断闪烁的左右尾灯信号,认为前面汽车要减速,故为了安全也要减速,就不会撞上前面传感器失灵的汽车了。故把A至D状态的转换条件改写成JMH+LH·RH;把状态A至状态B的转换条件改写成
综合上述考虑,转换条件的逻辑和为:
由转换条件重新画出图9-22汽车尾灯控制器的全状态MDS图,如图9-23所示。图9-23满足了全包含性的要求。图9-24画出了汽车尾灯控制器的MDS图。
(三)汽车尾灯控制器的VHDL程序实现
1. 汽车尾灯控制器实体设计程序
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY QWK IS
PORT(LH, RH,JMH,CP:IN std_logic;
LD,RD:OUT std_logic);
END QWK;
2. 汽车尾灯控制器结构体设计程序
ARCHITECTURE QWK_arc OF QWK IS
type state_TYPE is (QA,QB,QC,QD);
SIGNAL current_state:state_TYPE:=QA;
BEGIN
PROCESS(LH,RH,JMH)
BEGIN
WAIT UNTIL CP'EVENT AND CP=‘1';
CASE current_state IS
WHEN QA=>
IF LH='1' AND RH='0' AND JMH='0' THEN
current_state<=QB;
ELSIF LH='0' AND RH='1' AND JMH='0' THEN
current_state<=QC;
ELSIF LH='0' AND RH='0' AND JMH='0' THEN
current_state<=QA; RD<='1'; LD<='1';
ELSE current_state<=QD;
END IF ;
WHEN QB=>
IF LH='1' AND RH='0' AND JMH='0' THEN
current_state<=QB; RD<='1'; LD<=CP;
ELSE
current_state<=QA;
END IF ;
WHEN QC=>
IF LH='0' AND RH='1' AND JMH='0' THEN
current_state<=QC; RD<=CP; LD<='1';
ELSE
current_state<=QA;
END IF ;
WHEN QD=>
IF JMH='1' OR ((LH='1') AND (RH='1')) THEN
current_state<=QD; LD<=CP; RD<=CP;
ELSE
current_state<=QA;
END IF ;
END CASE;
END PROCESS ;
END QWK_arc;