• 领导讲话
  • 自我介绍
  • 党会党课
  • 文秘知识
  • 转正申请
  • 问题清单
  • 动员大会
  • 年终总结
  • 工作总结
  • 思想汇报
  • 实践报告
  • 工作汇报
  • 心得体会
  • 研讨交流
  • 述职报告
  • 工作方案
  • 政府报告
  • 调研报告
  • 自查报告
  • 实验报告
  • 计划规划
  • 申报材料
  • 当前位置: 勤学考试网 > 公文文档 > 心得体会 > 正文

    交通信号灯控制器代码及说明

    时间:2020-09-03 16:19:40 来源:勤学考试网 本文已影响 勤学考试网手机站

    PAGE

    PAGE 3

    课程设计报告

    课程名称: FPGA现代数字系统设计

    设计名称: 交通信号灯控制器

    姓 名: * * *

    学 号: 2010000379

    专 业: 通 信

    指导教师: * * *

    起止日期: 2010.12.25 - 2011.1.9

    课 程 设 计 任 务 书

    设计名称:

    设计要求:

    (1) 设计一个交通信号灯控制器,由一条主干道和一条支干道汇合成十字路口,在每个入口处设置红、绿、黄三色信号灯,红灯亮禁止通行,绿灯亮允许通行,黄灯亮则给行驶中的车辆有时间停在禁行线外。

    (2) 红、绿、黄发光二极管作信号灯,用传感器或逻辑开关作检测车辆是否到来的信号。

    (3) 主干道处于常允许通行的状态,支干道有车来时才允许通行。主干道亮绿灯时,支干道亮红灯;支干道亮绿灯时,主干道亮红灯。

    (4) 主、支干道均有车时,两者交替允许通行,主干道每次放行45s,支干道每次放行25s,设立45s、25s计时、显示电路。

    (5) 在每次由绿灯亮到红灯亮的转换过程中,要亮5s黄灯作为过渡,使行驶中的车辆有时间停到禁行线外,设立5s计时、显示电路。

    (6)发生紧急事件,如救护车、警车、抢险车通过,可以手动控制四个方向的红灯全亮。

    设计目的和意义

    通过应用Verilog语言在QuartusⅡ软件平台上设计交通信号灯控制器,并借助硬件来测试仿真效果。通过课程设计,熟悉硬件编程语言的应用,特别是有限状态机的灵活使用,为以后进一步的学习实践打下良好的基础。

    设计原理

    (1) 主、支干道用传感器检测车辆到来情况,实验电路用逻辑开关代替。

    (2) 选择1HZ时钟脉冲作为系统时钟。

    (3) 45s、25s、5s定时信号可用顺计时,也可用倒计时,计时起始信号由主控电路给出,每当计满所需时间,启、闭三色信号灯,并启动另一计时电路。

    (4) 交通灯状态变化如表1及图1所示:

    表1:交通灯状态图

    图1:交通灯状态图

    (5) 交通灯设计输入信号4个:CLK(时钟),EN(使能),EMERGENCY(紧急),BCHECK(检测);输出信号4个:LAMPA(主干道信号灯),LAMPB(支干道信号灯),ACOUNT(主干道计数器),BCOUNT(支干道计数器)。交通灯控制原理如图2所示。

    图2:交通灯原理图

    详细设计步骤

    (1) 确定4个输入信号与4个输出信号,具体见图2;

    (2) 将50MHZ时钟分频为1MHZ;

    (3) 设计红黄绿3中信号灯切换的时间及顺序;

    (4) 设计支路检测状态下的信号灯切换;

    (5) 设计紧急(EMERGENCY)状态下信号灯的切换;

    (6) 程序使用3always块[1],详细代码如下:

    module traffic_control(CLK,EN,EMERGENCY,BCHECK,LAMPA,LAMPB,ACOUNT,BCOUNT);

    output[2:0] ACOUNT,BCOUNT;

    output[2:0] LAMPA,LAMPB;

    reg clk1;

    input CLK,EN,EMERGENCY,BCHECK;

    reg[2:0] numa,numb;

    reg tempa,tempb;

    reg[25:0]count;

    reg[2:0] counta,countb;

    reg[2:0] ared,ayellow,agreen,aleft,bred,byellow,bgreen,bleft;

    reg[2:0] LAMPA,LAMPB;

    /* 信号定义与说明:

    CLK: 为同步时钟;

    EN: 使能信号,为1 的话,则控制器开始工作;

    LAMPA: 控制A 方向四盏灯的亮灭;其中,LAMPA0~LAMPA2,分别控制A 方向的绿灯、黄灯和红灯;

    LAMPB: 控制B 方向四盏灯的亮灭;其中,LAMPB0 ~ LAMPB2,分别控制B 方向的绿灯、黄灯和红灯;

    ACOUNT: 用于A 方向灯的时间显示,8 位

    BCOUNT: 用于B 方向灯的时间显示,8 位*/

    always @(posedge CLK ) //将50MHZ时钟分频为1MHZ

    begin

    if(count=

    begin

    count<=0;

    clk1<=~clk1;

    end

    else

    count<=count+1;

    end

    assign ACOUNT=numa;

    assign BCOUNT=numb;

    always @(EN )

    if(!EN)

    begin

    ared <=6;

    ayellow <=2;

    agreen <=4;

    bred <=6;

    byellow <=2;

    bgreen <=4;

    end

    always @(posedge clk1)//该进程控制A 方向

    begin

    if(EMERGENCY) //EMERGENCY高电平有效,手动控制

    begin

    numa<=0;LAMPA<=4;counta<=0;tempa<=0;

    end

    else if(EN)

    begin

    if(!tempa)//亮灯

    begin

    tempa<=1;

    case(counta)//控制亮灯的顺序

    0: begin numa<=agreen; LAMPA<=1; counta<=1; end

    1: begin numa<=ayellow; LAMPA<=2; counta<=2; end

    2: begin numa<=ared; LAMPA<=4; counta<=0; end

    default: LAMPA<=4;

    endcase

    end

    else //倒计时

    begin

    if(numa>2) numa<=numa-1;

    if(numa==2) begin numa<=1;tempa<=0;

    if ((BCHECK) &&(counta==2)) counta<=0;

    end

    /*if(numa>1)

    if(numa[3:0]==0)

    begin

    numa[3:0]<=4'b1001;

    numa[7:4]<=numa[7:4]-1;

    end

    else numa[3:0]<=numa[3:0]-1;

    if (numa==2)

    begin tempa=0;

    if ((!BCHECK )&& (counta==1)) counta<=0;

    end*/

    end

    end

    else

    begin

    LAMPA<=3'b100;

    counta<=0; tempa<=0;

    end

    end

    always @(posedge clk1)//该进程控制B 方向的四种灯

    begin

    if(EMERGENCY) //EMERGENCY高电平有效,手动控制

    begin

    numb<=0;LAMPB<=4;countb<=0;tempb<=0;

    end

    else if (EN)

    begin

    if(!tempb)

    begin

    tempb<=1;

    case (countb)

    0: begin numb<=bred; LAMPB<=4; countb<=1; end

    1: begin numb<=bgreen; LAMPB<=1; countb<=2; end

    2: begin numb<=byellow; LAMPB<=2; countb<=0; end

    default: LAMPB<=4;

    endcase

    end

    else

    begin

    if(numb>2) numb<=numb-1;

    if(numb==2) begin numb<=1;tempb<=0;

    if ((BCHECK )&& (countb==1)) countb<=0;

    end

    /*if(numb>1)

    if(!numb[3:0])

    begin

    numb[3:0]<=9;

    numb[7:4]<=numb[7:4]-1;

    end

    else numb[3:0]<=numb[3:0]-1;

    if(numb==2)

    begin tempb=0;

    if ((!BCHECK) && (countb==1)) countb<=0;

    end*/

    end

    end

    else

    begin

    LAMPB<=3'b100;

    tempb<=0; countb<=0;

    end

    end

    endmodulemodule

    结果分析

    程序仿真效果如图3和图4所示:为观察方便,将红黄绿灯显示时间分别缩短,图中[4]表示红灯亮,[2]表示黄灯亮,[1]表示绿灯亮,BCHECK信号代表支干道检测状况,低电平表示检测到有车辆正常通过,EMERGENCY代表紧急状态信号,低电平表示紧急信号无效。

    从图3中可以看出,在支干道检测到有车辆正常通过并且紧急信号无效时,主干道和支干道的信号灯有条不紊的正确变换;

    图3:BCHECK低电平EMERGENCY低电平时,主干道和支干道的信号灯的显示状态

    从图4中可以看出,在支干道检测到无车辆通过或者紧急信号发生时,主干道和支干道的信号灯能够按照预先设计正确变换。

    图4:BCHECK EMERGENCY低电平或高电平时,主干道和支干道的信号灯的显示状态

    总结

    仿真结果符合设计要求,交通灯有规律的变化,显示倒计时;在检测支路无车辆和紧急情况下,交通灯可以做出相应调整。设计中使用FSM(三段式),此方式描述方法虽然代码结构复杂了一些,但是使FSM 做到了同步寄存器输出,有利于实现交通灯控制[2]。

    体会

    通过课程设计,更加体会到硬件编程语言的特点,与以前所学C语言有一些相似之处,但更重要的是硬件语言编程需要特别中重视与实际器件功能的结合,以保证最后能够正确实现设计的功能。在设计过程中遇到不少问题,如编程能力不够,相关知识运用不熟等问题,还需要进一步学习。

    参考文献

    [1] 马建国 孟宪元,等. FPGA现代数字系统设计[M].北京:清华大学出版社.2010:190-220.

    [2] 华清远见嵌入式培训中心,等. FPGA应用开发入门与典型实例[M].北京:人民邮电出版社.2008:118-124.

    相关热词搜索: 交通 信号灯 控制器 代码

    • 考试时间
    • 范文大全
    • 作文大全
    • 课程
    • 试题
    • 招聘
    • 文档大全

    推荐访问