您好,欢迎来到华佗健康网。
搜索
您的当前位置:首页交通灯控制电路设计与仿真

交通灯控制电路设计与仿真

来源:华佗健康网


交通灯控制电路设计与仿真

一、 实验目的

1、 了解交通灯的燃灭规律。

2、 了解交通灯控制器的工作原理。

3、 熟悉 VHDL 语言编程,了解实际设计中的优化方案。

二、 实验原理

交通灯的显示有很多方式,如十字路口、丁字路口等,而对于同一个路口又有很多不同的显示要求,比如十字路口,车辆如果只要东西和南北方向通行就很简单,而如果车子可以左右转弯的通行就比较复杂,本实验仅针对最简单的南北和东西直行的情况。 要完成本实验,首先必须了解交通路灯的燃灭规律。本实验需要用到实验箱上交通灯模块中的发光二极管,即红、黄、绿各三个。依人们的交通常规, “红灯停, 绿灯行,黄灯提醒” 。 其交通的燃灭规律为: 初始态是两个路口的红灯全亮,之后,东西路口的绿灯亮,南北路口的红灯亮,东西方向通车,延时一段时间后,东西路口绿灯灭,黄灯开始闪烁。闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北方向开始通车,延时一段时间后,南北路口的绿灯灭,黄灯开始闪烁。闪烁若干次后,再切换到东西路口方向,重复上述过程。

在实验中使用 8 个七段码管中的任意两个数码管显示时间。东西路和南北路的通车时间均设定为 20s。数码管的时间总是显示为 19、18、17……2、1、0、19、18……。在显

示时间小于 3 秒的时候,通车方向的黄灯闪烁。

三、 实验内容

本实验要完成任务就是设计一个简单的交通灯控制器,交通灯显示用实验箱

的交通灯模块和七段码管中的任意两个来显示。系统时钟选择时钟模块的 1KHz

时钟,黄灯闪烁时钟要求为 2Hz,七段码管的时间显示为 1Hz脉冲,即每 1s 中递

减一次,在显示时间小于 3 秒的时候,通车方向的黄灯以 2Hz 的频率闪烁。系统

中用 S1 按键进行复位。

实验箱中用到的数字时钟模块、按键开关、数码管与 FPGA 的接口电路,以及

数字时钟源、按键开关、数码管与 FPGA 的管脚连接在以前的实验中都做了详细说

明,这里不在赘述。交通灯模块原理与 LED 灯模块的电路原理一致,当有高电平输

入时 LED 灯就会被点亮,反之不亮。只是 LED 发出的光有颜色之分。其与 FPGA 的

管脚连接如下表 19-1 所示:

四、 实验步骤

1、 打开 QUARTUSII 软件,新建一个工程。

2、 建完工程之后,再新建一个 VHDL File,打开 VHDL 编辑器对话框。

3、 按照实验原理和自己的想法,在 VHDL 编辑窗口编写 VHDL 程序,用户

可参照光盘中提供的示例程序。

4、 编写完 VHDL 程序后,保存起来。

(1)-jtdkz.vhd

library ieee;

use ieee.std_logic_11.all;

entity jtdkz is

port(clk,sm,sb:in std_logic;

mr,my0,mg0,br,by0,bg0:out std_logic);

end entity jtdkz;

architecture art of jtdkz is

type state_type is(A,B,C,D);

signal state:state_type;

begin

cnt:

process(clk) is

variable s:integer range 0 to 45;

variable clr,en:bit;

begin

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

if clr='0'then s:=0;

elsif en='0' then s:=s;

else s:=s+1;

end if;

case state is

when A=>mr<='0';my0<='0';mg0<='1';br<='1';by0<='0';bg0<='0';

if(sb and sm)='1' then

if s=45 then state<= B;clr:='0';en:='0';

else state<=A;clr:='1';en:='1';

end if;

elsif(sb and(not sm))='1'then state<=B;clr:='0';en:='0';

else state<=A;clr:='1';en:='1';

end if;

when B=>mr<='0';my0<='1';mg0<='0';br<='1';by0<='0';bg0<='0';

if s=5 then state<=C;clr:='0';en:='0';

else state<=B;clr:='1';en:='1';

end if;

when C=>mr<='1';my0<='0';mg0<='0';br<='0';by0<='0';bg0<='1';

if(sb and sm)='1' then

if s=25 then state<= D;clr:='0';en:='0';

else state<=C;clr:='1';en:='1';

end if;

elsif sb='0' then state<=D;clr:='0';en:='0';

else state<=C;clr:='1';en:='1';

end if;

when D=>mr<='1';my0<='0';mg0<='0';br<='0';by0<='1';bg0<='0';

if s=5 then state<=A;clr:='0';en:='0';

else state<=D;clr:='1';en:='1';

end if;

end case;

end if;

end process cnt;

end architecture art;

(2)cskz.vhd

library ieee;

use ieee.std_logic_11.all;

use ieee.std_logic_unsigned.all;

entity cskz is

port(ina:in std_logic;

outa:out std_logic);

end entity cskz;

architecture art of cskz is

begin

process(ina) is

begin

if ina='1' then outa<='1';

else outa<='0';

end if;

end process;

end architecture art;

(3)—cnt45s.vhd

library ieee;

use ieee.std_logic_11.all;

use ieee.std_logic_unsigned.all;

entity cnt45s is

port(sb,clk,en45:in std_logic;

dout45m,dout45b:out std_logic_vector(7 downto 0));

end entity cnt45s;

architecture art of cnt45s is

signal cnt6b:std_logic_vector(5 downto 0);

begin

process(sb,clk,en45)is

begin

if sb='0'then cnt6b<=cnt6b-cnt6b-1;

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

if en45='1'then cnt6b<=cnt6b+1;

elsif en45='0' then cnt6b<=cnt6b-cnt6b-1;

end if;

end if;

end process;

process(cnt6b)is

begin

case cnt6b is

when \"000000\"=>dout45m<=\"01000101\";dout45b<=\"01010000\";

when \"000001\"=>dout45m<=\"01000100\";dout45b<=\"01001001\";

when \"000010\"=>dout45m<=\"01000011\";dout45b<=\"01001000\";

when \"000011\"=>dout45m<=\"01000010\";dout45b<=\"01000111\";

when \"000100\"=>dout45m<=\"01000001\";dout45b<=\"01000110\";

when \"000101\"=>dout45m<=\"01000000\";dout45b<=\"01000101\";

when \"000110\"=>dout45m<=\"00111001\";dout45b<=\"01000100\";

when \"000111\"=>dout45m<=\"00111000\";dout45b<=\"01000011\";

when \"001000\"=>dout45m<=\"00110111\";dout45b<=\"01000010\";

when \"001001\"=>dout45m<=\"00110110\";dout45b<=\"01000001\";

when \"001010\"=>dout45m<=\"00110101\";dout45b<=\"01000000\";

when \"001011\"=>dout45m<=\"00110100\";dout45b<=\"01101001\";

when \"001100\"=>dout45m<=\"00110011\";dout45b<=\"00111000\";

when \"001101\"=>dout45m<=\"00110010\";dout45b<=\"00110111\";

when \"001110\"=>dout45m<=\"00110001\";dout45b<=\"00110110\";

when \"001111\"=>dout45m<=\"00110000\";dout45b<=\"00110101\";

when \"010000\"=>dout45m<=\"00101001\";dout45b<=\"00110100\";

when \"010001\"=>dout45m<=\"00101000\";dout45b<=\"00110011\";

when \"010010\"=>dout45m<=\"00100111\";dout45b<=\"00110010\";

when \"010011\"=>dout45m<=\"00100110\";dout45b<=\"00110001\";

when \"010100\"=>dout45m<=\"00100101\";dout45b<=\"00110000\";

when \"010101\"=>dout45m<=\"00100100\";dout45b<=\"00101001\";

when \"010110\"=>dout45m<=\"00100011\";dout45b<=\"00101000\";

when \"010111\"=>dout45m<=\"00100010\";dout45b<=\"00100111\";

when \"011000\"=>dout45m<=\"00100001\";dout45b<=\"00100110\";

when \"011001\"=>dout45m<=\"00100000\";dout45b<=\"00100101\";

when \"011010\"=>dout45m<=\"00011001\";dout45b<=\"00100100\";

when \"011011\"=>dout45m<=\"00011000\";dout45b<=\"00100011\";

when \"011100\"=>dout45m<=\"00010111\";dout45b<=\"00100010\";

when \"011101\"=>dout45m<=\"00010110\";dout45b<=\"00100001\";

when \"011110\"=>dout45m<=\"00010101\";dout45b<=\"00100000\";

when \"011111\"=>dout45m<=\"00010100\";dout45b<=\"00011001\";

when \"100000\"=>dout45m<=\"00010011\";dout45b<=\"00011000\";

when \"100001\"=>dout45m<=\"00010010\";dout45b<=\"00010111\";

when \"100010\"=>dout45m<=\"00010001\";dout45b<=\"00010110\";

when \"100011\"=>dout45m<=\"00010000\";dout45b<=\"00010101\";

when \"100100\"=>dout45m<=\"00001001\";dout45b<=\"00010100\";

when \"100101\"=>dout45m<=\"00001000\";dout45b<=\"00010011\";

when \"100110\"=>dout45m<=\"00000111\";dout45b<=\"00010010\";

when \"100111\"=>dout45m<=\"00000110\";dout45b<=\"00010001\";

when \"101000\"=>dout45m<=\"00000101\";dout45b<=\"00010000\";

when \"101001\"=>dout45m<=\"00000100\";dout45b<=\"00001001\";

when \"101010\"=>dout45m<=\"00000011\";dout45b<=\"00001000\";

when \"101011\"=>dout45m<=\"00000010\";dout45b<=\"00000111\";

when \"101100\"=>dout45m<=\"00000001\";dout45b<=\"00000110\";

when others=>dout45m<=\"00000000\";dout45b<=\"00000000\";

end case;

end process;

end architecture art;

(4)cnt05s.vhd

library ieee;

use ieee.std_logic_11.all;

use ieee.std_logic_unsigned.all;

entity cnt05s is

port(clk,en05m,en05b:in std_logic;

dout5:out std_logic_vector(7 downto 0));

end entity cnt05s;

architecture art of cnt05s is

signal cnt3b:std_logic_vector(2 downto 0);

begin

process(clk,en05m,en05b)is

begin

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

if en05m='1'then cnt3b<=cnt3b+1;

elsif en05b='1'then cnt3b<=cnt3b+1;

elsif en05b='0'then cnt3b<=cnt3b-cnt3b-1;

end if;

end if;

end process;

process(cnt3b)is

begin

case cnt3b is

when \"000\"=>dout5<=\"00000101\";

when \"001\"=>dout5<=\"00000100\";

when \"010\"=>dout5<=\"00000011\";

when \"011\"=>dout5<=\"00000010\";

when \"100\"=>dout5<=\"00000001\";

when others=>dout5<=\"00000000\";

end case;

end process;

end architecture art;

(5)—cnt25s.vhd

library ieee;

use ieee.std_logic_11.all;

use ieee.std_logic_unsigned.all;

entity cnt25s is

port(sb,sm,clk,en25:in std_logic;

dout25m,dout25b:out std_logic_vector(7 downto 0));

end entity cnt25s;

architecture art of cnt25s is

signal cnt5b:std_logic_vector(4 downto 0);

begin

process(sb,sm,clk,en25)is

begin

if sb='0'then cnt5b<=cnt5b-cnt5b-1;

elsif sm='0' then cnt5b<=cnt5b-cnt5b-1;

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

if en25='1' then cnt5b<=cnt5b+1;

elsif en25='0' then cnt5b<=cnt5b-cnt5b-1;

end if;

end if;

end process;

process(cnt5b)is

begin

case cnt5b is

when \"00000\"=>dout25b<=\"00100101\";dout25m<=\"00110000\";

when \"00001\"=>dout25b<=\"00100100\";dout25m<=\"00101001\";

when \"00010\"=>dout25b<=\"00100011\";dout25m<=\"00101000\";

when \"00011\"=>dout25b<=\"00100010\";dout25m<=\"00100111\";

when \"00100\"=>dout25b<=\"00100001\";dout25m<=\"00100110\";

when \"00101\"=>dout25b<=\"00100000\";dout25m<=\"00100101\";

when \"00110\"=>dout25b<=\"00011001\";dout25m<=\"00100100\";

when \"00111\"=>dout25b<=\"00011000\";dout25m<=\"00100011\";

when \"01000\"=>dout25b<=\"00010111\";dout25m<=\"00100010\";

when \"01001\"=>dout25b<=\"00010110\";dout25m<=\"00100001\";

when \"01010\"=>dout25b<=\"00010101\";dout25m<=\"00100000\";

when \"01011\"=>dout25b<=\"00010100\";dout25m<=\"00011001\";

when \"01100\"=>dout25b<=\"00010011\";dout25m<=\"00011000\";

when \"01101\"=>dout25b<=\"00010010\";dout25m<=\"00010111\";

when \"01110\"=>dout25b<=\"00010001\";dout25m<=\"00010110\";

when \"01111\"=>dout25b<=\"00010000\";dout25m<=\"00010101\";

when \"10000\"=>dout25b<=\"00001001\";dout25m<=\"00010100\";

when \"10001\"=>dout25b<=\"00001000\";dout25m<=\"00010011\";

when \"10010\"=>dout25b<=\"00000111\";dout25m<=\"00010010\";

when \"10011\"=>dout25b<=\"00000110\";dout25m<=\"00010001\";

when \"10100\"=>dout25b<=\"00000101\";dout25m<=\"00010000\";

when \"10101\"=>dout25b<=\"00000100\";dout25m<=\"00010001\";

when \"10110\"=>dout25b<=\"00000011\";dout25m<=\"00001000\";

when \"10111\"=>dout25b<=\"00000010\";dout25m<=\"00000111\";

when \"11000\"=>dout25b<=\"00000001\";dout25m<=\"00000110\";

when others=>dout25b<=\"00000000\";dout25m<=\"00000000\";

end case;

end process;

end architecture art;

(6)—xskz.vhd

library ieee;

use ieee.std_logic_11.all;

use ieee.std_logic_unsigned.all;

entity xskz is

port(en45,en25,en05m,en05b:in std_logic;

ain45m,ain45b,ain25m,ain25b,ain05:in std_logic_vector(7 downto 0);

doutm,doutb:out std_logic_vector(7 downto 0));

end entity xskz;

architecture art of xskz is

begin

process(en45,en25,en05m,en05b,ain45m,ain45b,ain25m,ain25b,ain05)is

begin

if en45='1'then doutm<=ain45m(7 downto 0);doutb<=ain45b(7 downto 0);

elsif en05m='1'then doutm<=ain05(7 downto 0);doutb<=ain05(7 downto 0);

elsif en25='1'then doutm<=ain25m(7 downto 0);doutb<=ain25b(7 downto 0);

elsif en05b='1'then doutm<=ain05(7 downto 0);doutb<=ain05(7 downto 0);

end if;

end process;

end architecture art;

(7)—ymq.vhd

library ieee;

use ieee.std_logic_11.all;

use ieee.std_logic_unsigned.all;

entity ymq is

port(clk:in std_logic;

ain41,ain42,ain43,ain44:in std_logic_vector(3 downto 0);

del:out std_logic_vector(2 downto 0);

dout7:out std_logic_vector(6 downto 0));

end entity ymq;

architecture art of ymq is

signal ain4: std_logic_vector(3 downto 0);

signal cnt: std_logic_vector(2 downto 0);

begin

process(clk)

begin

if clk'event and clk='1' then

if cnt=\"011\" then

cnt<=\"000\";

else

cnt<=cnt+1;

end if;

end if;

end process;

process(cnt,ain41,ain42,ain43,ain44)

begin

case cnt is

when \"000\" => ain4<=ain41; del<=\"111\";

when \"001\" => ain4<=ain42; del<=\"110\";

when \"010\" => ain4<=ain43; del<=\"101\";

when \"011\" => ain4<=ain44; del<=\"100\";

when \"100\" => ain4<=ain41; del<=\"000\";

when \"101\" => ain4<=ain41; del<=\"000\";

when \"110\" => ain4<=ain41; del<=\"000\";

when \"111\" => ain4<=ain41; del<=\"000\";

end case;

end process;

process(ain4)is

begin

case ain4 is

when \"0000\"=>dout7<=\"0111111\";

when \"0001\"=>dout7<=\"0000110\";

when \"0010\"=>dout7<=\"1011011\";

when \"0011\"=>dout7<=\"1001111\";

when \"0100\"=>dout7<=\"1100110\";

when \"0101\"=>dout7<=\"1101101\";

when \"0110\"=>dout7<=\"1111101\";

when \"0111\"=>dout7<=\"0000111\";

when \"1000\"=>dout7<=\"1111111\";

when \"1001\"=>dout7<=\"1101111\";

when others=>dout7<=\"0000000\";

end case;

end process;

end architecture art;

(8)—jtkzq.vhd

library ieee;

use ieee.std_logic_11.all;

entity jtkzq is

port(

clk,sm,sb:in std_logic;

mr,mg,my,by,br,bg:out std_logic;

del1:out std_logic_vector(2 downto 0);

dout:out std_logic_vector(6 downto 0));

end entity jtkzq;

architecture art of jtkzq is

component div_clk is

port(clk : in std_logic;

clk1:out std_logic);

end component div_clk;

component jtdkz is

port(clk,sm,sb:in std_logic;

mr,my0,mg0,br,by0,bg0:out std_logic);

end component jtdkz;

component cskz is

port(

ina:in std_logic;

outa:out std_logic);

end component cskz;

component cnt45s is

port(sb,clk,en45:in std_logic;

dout45m,dout45b:out std_logic_vector(7 downto 0));

end component cnt45s;

component cnt05s is

port(clk,en05m,en05b:in std_logic;

dout5:out std_logic_vector(7 downto 0));

end component cnt05s;

component cnt25s is

port(sb,sm,clk,en25:in std_logic;

dout25m,dout25b:out std_logic_vector(7 downto 0));

end component cnt25s;

component xskz is

port(en45,en25,en05m,en05b:in std_logic;

ain45m,ain45b,ain25m,ain25b,ain05:in std_logic_vector(7 downto 0);

doutm,doutb:out std_logic_vector(7 downto 0));

end component xskz;

component ymq is

port(clk:in std_logic;

ain41,ain42,ain43,ain44:in std_logic_vector(3 downto 0);

del:out std_logic_vector(2 downto 0);

dout7:out std_logic_vector(6 downto 0));

end component ymq;

signal clk11:std_logic;

signal en1,en2,en3,en4:std_logic;

signal s45m,s45b,s05,s25m,s25b:std_logic_vector(7 downto 0);

signal ym1,ym2,ym3,ym4:std_logic_vector(3 downto 0);

begin

u1:div_clk port map(clk=>clk,clk1=>clk11);

u2:jtdkz port

map(clk=>clk11,sm=>sm,sb=>sb,mr=>mr,my0=>en2,mg0=>en1,br=>br,by0=>en4,bg0=>en3);

u3:cskz port map(ina=>en1,outa=>mg);

u4:cskz port map(ina=>en2,outa=>my);

u5:cskz port map(ina=>en3,outa=>bg);

u6:cskz port map(ina=>en4,outa=>by);

u7:cnt45s port

map(clk=>clk11,sb=>sb,en45=>en1,dout45m=>s45m,dout45b=>s45b);

u8:cnt05s port map(clk=>clk11,en05m=>en2,dout5=>s05,en05b=>en4);

u9:cnt25s port

map(clk=>clk11,sm=>sm,sb=>sb,en25=>en3,dout25m=>s25m,dout25b=>s25b);

u10:xskz port

map(en45=>en1,en05m=>en2,en25=>en3,en05b=>en4,ain45m=>s45m,ain45b=>s45b,ain25m=>s25m,ain25b=>s25b,ain05=>s05,doutm(3 downto

0)=>ym1,doutm(7 downto 4)=>ym2,doutb(3 downto 0)=>ym3,doutb(7 downto 4)=>ym4);

u11:ymq port

map(clk=>clk,ain41=>ym1,ain42=>ym2,ain43=>ym3,ain44=>ym4,del=>del1,dout7=>dout);

end architecture art;

(9)—div_clk.vhd

library ieee;

use ieee.std_logic_11.all;

use ieee.std_logic_unsigned.all;

entity div_clk is

port(clk : in std_logic;

clk1:out std_logic);

end div_clk;

architecture behav of div_clk is

signal cnt:integer range 1000 downto 0;

begin

process(clk)

begin

if clk'event and clk='1' then

if cnt=999 then

cnt<=0;

else

cnt<=cnt+1;

end if;

if cnt<500 then

clk1<='0';

else

clk1<='1';

end if;

end if;

end process;

end behav;

5 引脚分配

6 实验现象

当主、支道均有车时,两者交替允许通行,主干道每次放行45s,支干道每次放行25s,在每次由亮绿灯变成亮红灯的转换过程中,要亮5s的黄灯作为过度,并进行减计时显示。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.com 版权所有 湘ICP备2023021991号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务