《EDA课程设计:基于CPLD的汽车尾灯控制系统(共9页).docx》由会员分享,可在线阅读,更多相关《EDA课程设计:基于CPLD的汽车尾灯控制系统(共9页).docx(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上1 设计要求及其分析1.1 设计要求汽车尾灯左、右各有3个,从中间开始编号,分别用L1、L2、L3,R1、R2、R3表示。当汽车转向时,按L1L1L2L1L2L3全灭L1(或R1R1R2R1R2R3全灭R1)次序循环亮,亮持续为2秒;当汽车刹车时,所有尾灯同时以2Hz的频率闪烁;正常行驶时,所有尾灯灭。输入信号有左、右转向和刹车。1.2 功能分析从以上设计要求,将本系统分成四个功能设计模块:汽车状态模块:该模块接收左转、右转、刹车和正常行驶的控制信号,根据所接受的信号控制左尾灯控制模块和右尾灯控制模块。左尾灯控制模块:接受汽车状态模块的控制信号对左边三个尾灯的亮与灭进
2、行控制。右尾灯控制模块:接受汽车状态模块的控制信号对右边三个尾灯的亮与灭进行控制。时钟模块:由于当汽车转弯时尾灯按照一定顺序循环亮灭,亮持续时间为2s,而刹车时尾灯又以2Hz的频率闪烁,故该模块提供周期为2s和500ms的时钟信号供左尾灯控制模块和右尾灯控制模块控制尾灯的亮灭。2 功能模块的设计与实现2.1 汽车状态模块设计的汽车状态模块如图2.1.1所示,源程序见附录:汽车状态模块PRECONTROL。图2.1.1 汽车状态模块PRECONTROL其中LEFT、RIGHT、STOP分别表示左转、右转和刹车信号,对应的输出引脚LFT、RIT、LR分别表示左有效、右有效和刹车有效。真值表如表2.
3、1.1所示:信号LEFTRIGHTSTOPLFTRITLR意义逻辑状态000000正常行驶100100左转弯010010右转弯001001刹车表2.1.1 汽车状态控制信号与输出信号真值表2.2 左尾灯控制模块与右尾灯控制模块设计的左尾灯控制模块如图2.2.1所示,源程序见附录:左尾灯控制模块LEFTCONTROL。图2.2.1 左尾灯控制模块LEFTCONTROL对各输入与输出引脚的说明如下:CLK:接受时钟信号,用于尾灯的顺序循环亮灭。CLK将接收两种不同频率的时钟信号即周期为2s和500ms中的一种,具体接收哪一种由该模块的时钟使能输出信号CLK2SEN和CLK500MSEN决定。EN:
4、与汽车状态模块PRECONTROL的LFT引脚连接,用于使能该左尾灯控制模块。LR:汽车刹车输入信号,与汽车状态控制模块PRECONTROL的LR引脚相连。由于当汽车右转弯、正常行驶和刹车时,该模块EN引脚都将接收到低电平,故而需要通过判断LR和EN的引脚电平才能判断汽车当前是处于刹车状态还是右转弯或正常行驶状态。L2、L1、L0:汽车左边的三个尾灯控制信号。CLK2SEN、CLK500MSEN:时钟的选择信号。这两个引脚将根据汽车当前所处的状态使能相应的时钟。当汽车出处于左转弯时,CLK2SEN输出高电平,CLK500MSEN输出低电平,此时CLK将接收到周期为2s的时钟信号以满足按L1L1
5、L2L1L2L3全灭L1次序循环亮,亮持续为2s对时钟的需要;当汽车处于刹车状态时,CLK2SEN输出低电平,CLK500MSEN输出高电平,此时CLK将接收到周期为500ms的时钟信号以满足汽车刹车是所有尾灯以2Hz的频率闪烁的设计要求。设计的右尾灯控制模块如图2.2.2所示,源程序见附录:左尾灯控制模块RIGHTCONTROL。 图2.2.2 右尾灯控制模块RIGHTCONTROL右尾灯控制模块RIGHTCONTROL各引脚功能与左尾灯控制模块LEFTCONTROL各引脚功能相似,这里不再详述。2.3 时钟模块2s时钟模块和500ms时钟模块分别如图2.3.1和图2.3.2所示: 图2.3
6、.1 2s时钟模TIMER2S 图2.3.2 500ms时钟模块TIMER500MS左尾灯控制模块LEFT通过CLK2SEN和CLK500MSEN来控制该模块CLK接收到的时钟信号的实现原理如下图2.3.3所示:图2.3.3 时钟选择实现原理图当汽车左转弯时,左尾灯控制模块LEFTCONTROL使能,此时该模块CLK2SEN输出高电平,CLK500MSEN输出低电平,并分别与TIMER2S和TIMER500MS相与,则TIMER500MS相当于被禁止,后经或门连接至该LEFTCONTROL模块的CLK引脚,故而CLK将接收到TIMER2S发出的周期为2s的时钟信号。当汽车刹车时,左尾灯控制模块
7、LEFTCONTROL也使能,此时该模块CLK2SEN输出低电平,CLK500MSEN输出高电平,并分别与TIMER2S和TIMER500MS相与,则TIMER2S相当于被禁止,后经或门连接至该LEFTCONTROL模块的CLK引脚,故而CLK将接收到TIMER500MS发出的周期为500ms的时钟信号。当汽车正常行驶时尾灯均灭,此时不需要时钟参与,左尾灯控制模块LEFTCONTROL的CLK2SEN和CLK500MSEN处于任意状态。同样,右尾灯控制模块RIGHTCONTROL的CLK时钟信号的接收与左尾灯控制模块LEFTCONTROL的实现原理一样,它们共用TIMER2S和TIMER500
8、MS这两个时钟模块,这里不再详述其实现原理。3 顶层文件设计与软件流程图3.1 顶层文件的设计顶层文件如图3.1.1所示:图3.1.1 顶层文件设计图由上图,顶层文件中包含了左尾灯控制模块LEFTCONTROL和右尾灯控制模块RIGHTCONTROL的时钟选择逻辑图,另外由于LEFTCONTROL和RIGHTCONTROL的软件设计所限,两模块均不能控制在汽车正常行驶时所有尾灯的熄灭,在汽车正常行驶时所有尾灯均熄灭是通过如图3.1.1所示的由或门和与门组成的外围逻辑电路实现的。下面来说明该设计的可行性:如图3.1.1所示,当汽车正常行驶时,汽车状态控制模块PRECONTROL的LFT、RIT、
9、LR均输出低电平。针对于左尾灯来说,LR与LFT相或后结果为低电平再与LEFTCONTROL的L2、L1、L0相与后(不论L2、L1、L0原先为何种电平)结果均为低电平故而左边三个尾灯全部熄灭,右尾灯亦是如此;当汽车左转时,RIT、LR输出低电平,LFT输出高电平。这时,左尾灯控制模块LEFTCONTROL使能并按照其软件设计功能工作,LFT与LR相或时为高电平再与L2、L1、L0相与后结果与L2、L1、L0原先电平一致即相当于左边三尾灯的亮灭只受LEFTCONTROL的控制。而右尾灯应该处于全部熄灭状态,它的实现思路为:LR与RIT相或后为低电平再与R2、R1、R0相与后仍为低电平故而三个右
10、尾灯均熄灭。当汽车右转弯的工作原理与左转弯时相同这里不再详述;当汽车刹车时,LFT、RIT输出低电平,LR输出高电平。LFT与LR,RIT与LR相或均为高电平再与L2、L1、L0、R2、R1、R0相与时其结果为原先L2、L1、L0、R2、R1、R0各自的电平故而此时尾灯的亮灭只受左尾灯控制模块LEFTCONTROL和右尾灯控制模块RIGHTCONTROL的控制。汽车状态信号输入左转弯右转弯刹车正常行驶3.2 软件流程图汽车状态模块PRECONTROL状态判断正常行驶刹车右转弯左转弯外围或门和与门逻辑电路左尾灯与右尾灯控制模块均使能左尾灯控制模块LEFTCONTROL使能右尾灯控制模块RIGHT
11、CONTROL使能尾灯全部熄灭周期为500ms时钟使能,左右尾灯均以2Hz频率闪烁周期为2s时钟使能,右尾灯每2s亮一盏灯周期为2s时钟使能,左尾灯每2s亮一盏灯4 附录:4.1 汽车状态模块PRECONTROL源码:library ieee;use ieee.std_logic_1164.all;entity precontrol isport(left:in std_logic;right:in std_logic;stop:in std_logic;lft:out std_logic;rit:out std_logic;lr:out std_logic);end precontrol;a
12、rchitecture one of precontrol isbeginprocess(left,right,stop)variable condition:std_logic_vector(2 downto 0);begincondition:=left&right&stop;case condition iswhen 000=lft=0;rit=0;lrlft=1;rit=0;lrlft=0;rit=1;lrlft=0;rit=0;lrnull;end case;end process;end one;4.2 左尾灯控制模块LEFTCONTROL源码:library ieee;use i
13、eee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity leftcontrol isport(clk:in std_logic;en:in std_logic;-汽车左转弯模块使能信号输入lr:in std_logic;-汽车刹车信号输入,高有效l2,l1,l0:out std_logic;-三个左尾灯控制信号输出clk2sen,clk500msen:out std_logic);-2s和500ms时钟使能信号输出end entity leftcontrol;architecture one of leftcontrol is
14、signal clkop:std_logic;beginclkop=clk;com1:process(en,clk,lr)variable tmp:std_logic_vector(2 downto 0);variable clken:std_logic_vector(1 downto 0);beginif lr=1 then tmp:=clkop&clkop&clkop;clken:=01;-汽车刹车,周期为500ms的时钟使能elsif clkevent and clk=1 then if en=1 then -汽车左转弯if tmp=000 then tmp:=001;clken:=10
15、;-周期为2s的时钟使能elsif tmp=111 then tmp:=000;-在左转弯时灯全亮后再全息灭else tmp:=tmp(1 downto 0)&1;-灯每隔2s亮一个end if; end if; end if;l2=tmp(2);l1=tmp(1);l0=tmp(0);clk2sen=clken(1);clk500msen=clken(0);end process;end one;4.3右尾灯控制模块RIGHTCONTROL源码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;e
16、ntity rightcontrol isport(clk:in std_logic;en:in std_logic; -汽车右转弯模块使能信号输入lr:in std_logic; -汽车刹车信号输入,高有效r2,r1,r0:out std_logic; -三个右尾灯控制信号输出clk2sen,clk500msen:out std_logic); -2s和500ms时钟使能信号输出end entity rightcontrol;architecture one of rightcontrol issignal clkop:std_logic;beginclkop=clk;com1:proces
17、s(en,clk,lr)variable tmp:std_logic_vector(2 downto 0);variable clken:std_logic_vector(1 downto 0);beginif lr=1 then tmp:=clkop&clkop&clkop;clken:=01;-汽车刹车,周期为500ms的时钟使能elsif clkevent and clk=1 then if en=1 then -汽车右转弯if tmp=000 then tmp:=001;clken:=10;-周期为2s的时钟使能elsif tmp=111 then tmp:=000;-在右转弯时灯全亮
18、后再全息灭else tmp:=tmp(1 downto 0)&1; -灯每隔2s亮一个end if; end if; end if;r2=tmp(2);r1=tmp(1);r0=tmp(0);clk2sen=clken(1);clk500msen=clken(0);end process;end one;4.4 周期为2s的时钟模块TIMER2S源码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity timer2s isport(clk:in std_logic;clkout:out
19、std_logic);end entity timer2s;architecture one of timer2s isbeginprocess(clk)variable counter:std_logic_vector(7 downto 0);variable qclkout:std_logic;begin if clkevent and clk=1 then -以128Hz为基本时钟源,对其上升沿计数if counter= then -计数个数为256个即256128Hz2sqclkout:=not qclkout;clkout=qclkout;counter:=;-计数器满则输出反相计数
20、器清零else counter:=counter+1;-每捕捉到一个基本时钟源上升沿计数器加一 end if; end if; end process;end architecture one;4.5 周期为500ms的时钟模块TIMER500MS源码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity timer500ms isport(clk:in std_logic;clkout:out std_logic);end entity timer500ms;architecture o
21、ne of timer500ms isbeginprocess(clk)variable counter:std_logic_vector(7 downto 0);variable qclkout:std_logic;begin if clkevent and clk=1 then -以128Hz为基本时钟源,对其上升沿计数if counter= then-计数个数为64个即64128Hz0.5sqclkout:=not qclkout;clkout=qclkout;counter:=;-计数器满则输出反相计数器清零else counter:=counter+1; -每捕捉到一个基本时钟源上升沿计数器加一 end if; end if; end process;end architecture one;专心-专注-专业