数字电子技术课程设计——交通灯控制器设计报告

数字电子技术课程设计——交通灯控制器设计报告

 封面自行设计,仅供参考! 

                          交通灯控制器设计报告                                                                         

一.设计目的.

(1)    初步学习,运用VHDL(Verilog)语言编写模块程序。

(2)    巩固课堂所学的组合逻辑电路,时序逻辑电路及其有关的应用,如计数器,分频器等。

(3)    提高实践及运用意识。

二.设计任务及要求.

利用EDA/SOPC实验开发平台提供的八位七段管码显示模块以及EP2C35核心板,实现交通灯信号控制器。

设交通灯信号控制器用于主干道公路的交叉路口,要求是优先保证主干道的畅通,因此,平时处于“主干道绿灯,支道红灯”状态。

(1)当处于“主干道绿灯,支道红灯”状态:

① 主干道有车要求通行,支道也有车要求通行时,若主干道通行时间大于等于30秒则切换到“主黄,支红”,4秒后自动切换到“主红,支绿”。

② 主干道无车要求通行,支道有车要求通行时,立即切换到“主黄,支红”,4秒后自动切换到“主红,支绿”。

其它情况保持“主绿,支红”状态。

(2)当处于“主干道红灯,支道绿灯”状态:

① 支道有车要求通行时,保持“主红,支绿”状态,但最多保持30秒然后自动切换到“主红,支黄”状态,4秒后自动切换到“主绿,支红”状态。

② 支道无车要求通行时,立即切换到“主红,支黄”状态,4秒后自动切换到“主绿,支红”状态。

(3)利用八位七段管码显示模块其中的2位实现时间显示。

(4)扩展要求:自主设计(如改变时间显示方式,丰富控制逻辑等)

三.设计原理及方案.

1.总体设计框图

 

2.原理概述:

(1)由于主干道,支干道的交通灯均在绿,黄,红三种状态之间有顺序的转换,组合共有四种。所以,利用状态机按照设定的条件实现“主绿,支红” 、“主黄,支红” 、“主红,支绿”、“主红,支黄”4种状态之间的切换。

(2)因为红黄绿灯之间转换有时间限制,所以要有计数器,可用七段数码管显示模块,由于时间是两位数,所以只需要八位七段管码显示模块其中的2位实现时间显示。

(3)由于实验室提供的基准频率为50MHZ,所以得用分频器得到所需要的频率。

 

四.电路设计及实现.

(1)各模块设计程序及模块图:

1.1计数器:

LIBRARY   IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY counter IS

PORT (clk:IN STD_LOGIC;                                                                    

      reset:in std_logic;

      countNum:BuFFeR INTEGER RANGE 0 TO 64);

END;

ARCHITECTURE behavior OF counter IS

BEGIN

process(reset,Clk)

BEGIN

IF Reset='1' THEN 

   countNum<=0;

ELSIF rising_edge(Clk) THEN

       IF countNum=64 THEN

          countNum<=0;

       ELSE

       countNum<=countNum+1;

       END IF;

END IF;

END PROCESS;

END;

(2)七段显示器程序

 LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY bcd_data IS

PORT

(bcd_data:in STD_LOGIC_VECTOR(3 downto 0);

 segout: out STD_LOGIC_VECTOR(6 downto 0));

END;

ARCHITECTURE behavior OF bcd_data IS

BEGIN

process(bcd_data)

BEGIN

case bcd_data is

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

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

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

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

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

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

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

  when "0111"=>segout<="0000111" ;

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

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

  when others =>null;

END CASE;

END PROCESS;

END;

LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_unsigned.ALL;

ENTITY dtsm IS

PORT(clk:in STD_LOGIC;

 NumA,NumB: in STD_LOGIC_VECTOR(3 downto 0);

 segout1:out STD_LOGIC_VECTOR(6 downto 0);

 led_sel:out STD_LOGIC_VECTOR(2 downto 0));

END dtsm;

architecture bhv of dtsm is

component bcd_data is

port (bcd_data:in STD_LOGIC_VECTOR(3 downto 0);

      segout:out STD_LOGIC_VECTOR(6 downto 0));

end component;

 signal x:STD_LOGIC_VECTOR(3 downto 0);

 signal Q:STD_LOGIC;

begin

p1:process(clk)

begin

if clk'event and clk ='1' then

 if Q='1' THEN Q<='0';

    ELSE Q<='1';

 END IF;

end if;

end process;

 

p2:process(Q)

 begin

 case Q is

when'0'=>led_sel<="010";x<=NumB;

when'1'=>led_sel<="001";x<=NumA;

when others=>null;

end case;

end process;

u1:bcd_data PORT map(bcd_data=>x,segout=>segout1);

end ;

3. 分频到512Hz程序:

 library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;   

entity fenpin123 is

port (clk: in std_logic;

      clkfen: out std_logic);  

end fenpin123;

 

architecture fenpin of fenpin123 is

signal clk_mid: std_logic;

begin

  process(clk)

   variable data:integer range 0 to 48828;---将基准信号分频到512Hz

   begin

    if clk'event and clk='1' then

      if data=48828 then

         data:=0;

         clk_mid<=not clk_mid;

      else

         data:=data+1;

      end if;

     end if;

     clkfen<=clk_mid;

end process;

end fenpin;

4. 分频到1Hz程序:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity fenpin is

port( clk:in std_logic;

   finout:out std_logic);

end fenpin;

architecture bhv of fenpin is

signal tmp:INTEGER RANGE 0 TO 49999999;

begin

process(clk)

begin

if clk'event and clk='1' then

  if tmp=49999999 then tmp<=00000000;

     else tmp<=tmp+1;

  end if;

  if tmp<25000000 then finout<='0';

     else finout<='1';

  end if;

end if;

end process;

end bhv;

(5)分位程序

LIBRARY   IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

USE IEEE.STD_LOGIC_ARITH;

ENTITY FENWEI IS

PORT

(Numin:IN integer RANGE 0 TO 31;

NumA,NumB:OUT Integer RANGE 0 to 9

);

END;

ARCHITECTURE behavior OF FENWEI IS

BEGIN

process(Numin)

BEGIN

IF Numin>=30 THEN

NumA<=3;

NumB<=Numin-30;

ELSIF Numin>=20 THEN            

NumA<=2;

NumB<=Numin-20;

ELSIF Numin>=10 THEN

NumA<=1;

NumB<=Numin-10;

ELSE

NumA<=0;

NumB<=Numin;

END IF;

END PROCESS;

END;

(6)交通灯控制程序

 LIBRARY IEEE;

USE IEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_UNSIGNED.ALL;

USE IEEE.STD_LOGIC_ARITH;

ENTITY traffic IS

 PORT(

   CLK , SM , SB : IN BIT;

   MR,MY,MG,BR,BY,BG : OUT BIT;

   reset:OUT std_logic;

   CountNum:in INTEGER RANGE 0 TO 64;

   Num:out INTEGER RANGE 0 TO 31

    );

END traffic;

ARCHITECTURE BEHAV OF traffic IS

 TYPE STATE_TYPE IS (A,B,C,D);

 SIGNAL STATE : STATE_TYPE ;

 

BEGIN

 CNT:PROCESS(CLK,SM,SB,CountNum)

  BEGIN

   IF CLK'EVENT AND CLK='1' THEN

    CASE STATE IS

      WHEN A => MR<='0';MY<='0';MG<='1';--主绿支红

                BR<='1';BY<='0';BG<='0';

                RESET<='0';

        IF (SB AND SM)='1' THEN

           IF CountNum<=29 THEN

              Num<=30-CountNum;

           ELSE

              STATE<=B;RESET<='1';

           END IF;

        END IF;

        IF (SB AND(NOT SM))='1' THEN

            STATE<=B;RESET<='1';

        END IF;

      WHEN B => MR<='0';MY<='1';MG<='0';--主黄支红

                BR<='1';BY<='0';BG<='0';

                RESET<='0';

         IF CountNum<=3 THEN

            Num<=4-CountNum;

         ELSE

            STATE<=C;RESET<='1';

         END IF;

      WHEN C => MR<='1';MY<='0';MG<='0';--主红支绿

                BR<='0';BY<='0';BG<='1';

                 RESET<='0';

        IF (SB AND SM)='1' THEN 

          IF CountNum<=29 THEN

             Num<=30-CountNum;

          ELSE

            STATE<=D;RESET<='1';

          END IF;

        END IF;

        IF SB='0' THEN

           STATE<=D;RESET<='1';

        END IF;

      WHEN D => MR<='1';MY<='0';MG<='0';--主红支黄

                BR<='0';BY<='1';BG<='0';

                RESET<='0';

        IF CountNum<=3 THEN

           Num<=4-CountNum;

         ELSE                            

            STATE<=A;RESET<='1';

        END IF;

      WHEN OTHERS=>STATE<=A;

   END CASE;

  END IF;

  END PROCESS CNT;

END BEHAV;

(2)总体原理图:

 

(3)管脚对应表

信号名称

对应FPGA管脚名

说明

50MHz

L1

基准时钟

A

G6

七段数码管a

B

G7

七段数码管b

C

H3

七段数码管c

D

H4

七段数码管d

E

H5

七段数码管e

F

H6

七段数码管f

G

J4

七段数码管g

SEL0

G5

数码管选择控制端0

SEL1

G3

数码管选择控制端1

SEL2

F4

数码管选择控制端2

R1

D3

主干道红灯

Y1

D4

主干道黄灯

G1

D5

主干道绿灯

R2

E3

支道红灯

Y2

E4

支道黄灯

G2

F3

支道绿灯

K1

E15

主干道通车请求开关

K2

B14

支道通车请求开关

  

五.分析与讨论.

在实验室先后下载三次,{dy}次时灯亮但数码管显示有问题,经陈老师建议,重新检查管脚,发现有一个未设置,导致出错。第二次调试还是失败,显示器数字显示不对,我就把程序检查了一遍,重新根据管脚,结合数码管为共阴极写数码管程序。第三次成功了。

成功后的设计电路达到了要求,灯管按照车辆请求和时间有规律的变化,显示管显示出时间。在设计有很强的实践意义,可以安装到乡间公路和城市公路的十字路口,稍加改进就可以是主干道通车时间长,符合实际,可以更有效的指导交通,保证交通秩序和安全。

六.设计总结. 

       通过为期一周的课程设计,我应用所学数字电子技术和自学的VHDL语言顺利得完成了交通灯控制器的设计。期间,我查阅里很多相关书籍,学习了VHDL语言,并利用它设计了符合设计要求的计数器,分频器,状态机等。不仅巩固了课堂知识,而且有效的和实际结合在了一起,扩展了所学知识和见识。

      在设计过程中遇到不少问题,如编程能力不够,相关元件运用条件不熟等问题。总体感觉就是:学得不够,知识真的和有用。同时,也感觉到书本知识与实际问题及需要结合的难处,但也激发了我这方面的兴趣,提高了理论结合实际的意识。

     这是一次有意义的尝试!

郑重声明:资讯 【数字电子技术课程设计——交通灯控制器设计报告】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——