交通灯控制器
交通灯控制器
功能说明:
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