您现在正在浏览:首页 > 职教文章 > 职教论文 > 交通灯控制器

交通灯控制器

日期: 2010/5/2 浏览: 144 来源: 学海网收集整理 作者: 佚名

交通灯控制器

功能说明:

1、A、B方向各设红、黄、绿、左拐四盏灯。假设A方向为主干道,通行时间比B方向长一些。

2、控制器状态转换表如下:

从状态表得知四种灯按绿灯 黄灯 左拐灯 红灯顺序点亮并循环。

设计时假定A方向红、绿、黄、左拐灯亮的时间分别为50秒、35秒、5秒和15秒,

B方向红、绿、黄、左拐灯亮的时间分别为60秒、25秒、5秒和15秒。如果要改变这些时间只须改变计数器的预置即可。

A、B方向的红绿灯旁有一个数显时钟。例如:当A方向红灯亮时,A方向时钟从50

开始作减法计时,绿灯亮时从40开始作减法计时。左拐灯亮时从15开始作减法计时。

数码管选用共阳极。

工作原理:

利用实验板上的的红、黄、绿led发光二极管模拟十字路口的交通信号灯,led七段数码管显示交通信号灯在某一状态所剩的时间,利用实验板上的10Mhz的时钟信号,分别作为交通信号灯控制器的计时信号和led七段数码管的扫描信号。

该程序由六个模块组成:

1)fp将10MHz的主时钟分频为倒计时用的1Hz。

2)scanfp将10MHz的主时钟分频为供数码管扫描用的1000Hz。

3)KZ为二选一扫描电路模块。

4)decode为led七段数码管显示驱动模块。

5)jsq为一个具有预置数功能的减法计数器。

6)state为状态机,产生进程减法计数器所需要的预置数输入信号和控制8个红、黄、绿信号等的输出信号。根据当前的状态产生状态机的下一个状态。状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详解如下:

①现态:是指当前所处的状态。

②条件:又称为“事件”。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。

③动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。

④次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

设计原理图和框图

四、设计输入:

原理图:

Vhdl:

计数分频:

entity fp is

Port ( clk : in STD_LOGIC;

cp : out STD_LOGIC);

end fp;

architecture Behavioral of fp is

signal a:integer range 0 to 9999999;

begin

process(clk)

begin

if (clk'event and clk='1') then

if a=9999999 then

a<=0;

cp<='1';

else

a<=a+1;

cp<='0';

end if;

end if;

end process;

end Behavioral;

2)扫描分频:

entity scanfp is

Port ( clk : in STD_LOGIC;

cp : out STD_LOGIC);

end scanfp;

architecture Behavioral of scanfp is

signal a:integer range 0 to 9999;

begin

process(CLK)

begin

if (CLK'event and CLK='1') then

if a=9999 then

a<=0;

cp<='1';

else

a<=a+1;

cp<='0';

end if;

end if;

end process;

end Behavioral;

减法计数器:

entity jsq is

Port ( clk : in STD_LOGIC;

en: in std_logic;

load : in STD_LOGIC;

din0 : in STD_LOGIC_VECTOR (3 downto 0);

din1 : in STD_LOGIC_VECTOR (3 downto 0);

q0 : buffer STD_LOGIC_VECTOR (3 downto 0);

q1 : buffer STD_LOGIC_VECTOR (3 downto 0));

end jsq;

architecture Behavioral of jsq is

begin

process(clk,load)

begin

if (clk'event and clk='1') then

if (en='0') then

q0<="0000"; q1<="0000";

elsif load='1' then

q0<=din0; q1<=din1;

else

if q0<="0000" then

q0<="1001";

else q0<=q0-'1';

end if;

if q0="0000" then q1<=q1-'1';

end if;

end if;

end if;

end process;

end Behavioral;

状态机:

entity state is

Port ( clk : in STD_LOGIC;

en: in std_logic;

led_com : inout STD_LOGIC;

cin0 : in STD_LOGIC_VECTOR (3 downto 0);

cin1 : in STD_LOGIC_VECTOR (3 downto 0);

cin2 : in STD_LOGIC_VECTOR (3 downto 0);

cin3 : in STD_LOGIC_VECTOR (3 downto 0);

load0 : out STD_LOGIC;

load1 : out STD_LOGIC;

dout0 : out STD_LOGIC_VECTOR (3 downto 0);

dout1 : out STD_LOGIC_VECTOR (3 downto 0);

dout2 : out STD_LOGIC_VECTOR (3 downto 0);

dout3 : out STD_LOGIC_VECTOR (3 downto 0);

data : out STD_LOGIC_VECTOR (7 downto 0));

end state;

architecture Behavioral of state is

type state_type is(s0,s1,s2,s3,s4,s5,s6,s7);

signal present_state,next_state: state_type;

begin

led_com<='1';

process(clk)

begin

if (clk 'event and clk='0') then

if (en='1') then

load0<='0';

load1<='0';

if ((cin0="0000") and (cin1="0000")) then

load0<='1';

present_state<=next_state;

else

load0<='0';

end if;

if ((cin2="0000") and (cin3="0000") ) then

load1<='1';

present_state<=next_state;

else

load1<='0';

end if;

else

present_state<=s0;

load0<='1';

load1<='1';

end if;

end if;

end process;

process(present_state)

begin

case present_state is

when s0 => data<="10000001"; next_state<=s1; dout0<="1001";dout1<="0101";dout2<="0100";dout3<="0011";

when s1 => data<="01000001"; next_state<=s2; dout2<="0100"; dout3<="0000";

when s2 => data<="00100001"; next_state<=s3; dout2<="0100"; dout3<="0001";

when s3 => data<="01000001"; next_state<=s4; dout2<="0100"; dout3<="0000";

when s4 => data<="00011000"; next_state<=s5; dout0<="0100";dout1<="0010";dout2<="1001";dout3<="0100";

when s5 => data<="00010100"; next_state<=s6; dout0<="0100"; dout1<="0000";

when s6 => data<="00010010"; next_state<=s7; dout0<="0100"; dout1<="0001";

when s7 => data<="00010100"; next_state<=s0; dout0<="0100"; dout1<="0000";

end case;

end process;

end Behavioral;

二选一扫描电路

entity KZ is

Port ( clk : in STD_LOGIC;

en : in STD_LOGIC;

A4 : in STD_LOGIC_VECTOR (3 downto 0);

A3 : in STD_LOGIC_VECTOR (3 downto 0);

A2 : in STD_LOGIC_VECTOR (3 downto 0);

A1 : in STD_LOGIC_VECTOR (3 downto 0);

Q : out STD_LOGIC_VECTOR (3 downto 0);

D : out STD_LOGIC_VECTOR (2 downto 0));

end KZ;

architecture Behavioral of KZ is

begin

process(clk,en,A1,A2,A3,A4)

variable sel:integer range 0 to 3;

begin

if(clk'event and clk='1') then

if sel=3 then

sel:=0;

else

sel:=sel+1;

end if;

end if;

if(en='1') then

case sel is

when 0 =>Q<=A4;D<="010";

when 1 =>Q<=A3;D<="011";

when 2 =>Q<=A2;D<="100";

when 3 =>Q<=A1;D<="101";

end case;

end if;

end process;

end Behavioral;

数码管显示电路:

entity decode is

Port ( A : in STD_LOGIC_VECTOR (3 downto 0);

Q : out STD_LOGIC_VECTOR (6 downto 0));

end decode;

architecture Behavioral of decode is

begin

process(A)

begin

case A is

when"0000"=>Q<="0111111";

when"0001"=>Q<="0000110";

when"0010"=>Q<="1011011";

when"0011"=>Q<="1001111";

when"0100"=>Q<="1100110";

when"0101"=>Q<="1101101";

when"0110"=>Q<="1111101";

when"0111"=>Q<="0100111";

when"1000"=>Q<="1111111";

when"1001"=>Q<="1101111";

when others=>null;

end case;

end process;

end Behavioral;











仿真波形图

五、设计总结

VHDL的设计关键是电路逻辑设计,而这个程序的关键是总体设计,绕了挺多的弯路后才发现总体设计其实最后取决于一点——数据的显示,也就是如何控制七段显示器进行显示。没有发现这一点导致了弯路不停的走。一个设计的关键在何处,对于硬件设计接触不多的我们清楚这一点也许不无好处。

资料的查阅能力在这次设计中得到了很大的提高,学会了从不同的渠道,用不同的方法去查找,包括网络上,图书馆,书店等。

在系统设计阶段,老师给予的意见给了我很大的帮助。使我不仅学到了知识,而且也开阔了视野。提高了我自身解决问题的能力,更为重要的是指导老师严谨的治学态度深深的影响着我,在此,我对我对指导老师的精心培养表示深深的谢意!并且感谢在课程设计期间帮助我、鼓励我的同学们!可以说这次设计的顺利完成与老师和大家是分不开的,在老师与同学的耐心讲解和帮助下,使我拥有了那种克服困难、勇往直前的决心,这种潜移默化的影响并非只局限于这次课程设计,而是会使我收益终生的。再次衷心的向所有指导、关心、照顾和帮助我的老师、同学们表示最衷心的感谢!谢谢您们!


交通灯控制器.doc

相关文章
  1. 交通灯控制器
返回顶部