精华内容
下载资源
问答
  • 交通信号灯控制系统原理
    万次阅读 多人点赞
    2018-09-10 00:07:21

    前言

    此次综合设计为模拟交通灯控制系统,是采用计算机通过编写汇编语言程序控制实验箱上的硬件资源实现的。红灯停,绿灯行的交通规则,广泛用于十字路口,车站, 码头等公共场所,成为人们出行生活中不可少的必需品,由于计算机技术的成熟与广泛应用,使得交通灯的功能多样化,远远超过老式交通灯, 交通灯的数字化给人们生产生活带来了极大的方便,而且大大地扩展了交通灯的功能。诸如闪烁警示、鸣笛警示,时间程序自动控制、倒计时显示,所有这些,都是以计算机为基础的;还可以根据主、次干道的交通状况的不同任意设置各自的不同的通行时间。
    因此,在本设计中将采用Intel 8086系列CPU交通控制系统来实现。 整个交通灯控制系统由8086CPU、交通灯显示、键盘扫描、紧急处理、时间模式手动设置等模块组成。系统除基本交通灯功能外还具有通行时间手动设置、可倒计时显示、急车强行通过等相关功能。

    1 交通灯控制系统设计方案

    1.1、总体设计:

    1、东西方向和南北方向交替准行控制:
    东西方向准行时,东西方向上的绿灯亮,南北方向红灯亮,经过一段时间后,南北方向准行,南北方向上的绿灯亮,东西方向红灯亮,如此交替。各方向信号灯顺序为:红→绿→黄→红→绿→黄……,某一方向红灯亮的时间等于另一方向绿灯和黄灯亮的时间之和。
    2、各方向红、绿灯亮的时间为11~ 99秒(可灵活的任意设定),以满足不同交通路口的需要。
    3、当准行时间倒计时到最后10秒时,准行方向上绿灯灭,同时该方向的黄灯变为闪烁。
    4、各方向要有两位数码管分别显示准行时间或禁行时间,并以秒倒计时。
    5、设置功能按键:
    1)在发生交通事故时,东西方向和南北方向同时禁行。
    2)强制东西方向通行。
    3)强制南北方向通行。
    4)恢复正常交替通行。

    1.2 设计原理:

    综合利用实验箱上的资源,利用8254单元输入1MHz的时钟信号,连接MIR7定时向控制系统发出中断信号,实现倒计时的功能,通过8255单元控制的键盘及数码管显示单元,动态扫描通行时间的变化以及功能键模式下的显示,实时扫描键盘的输入,通过软件处理的方式,实现各个键盘的处理,开关及LED显示单元则来用显示交通灯的变化,B口输出数码管段码,A口与C口共同控制数码管的位选、键盘扫描以及LED灯的亮灭。
    如图1,是实现整个交通灯控制系统的接线图:
    实验接线图
    图1 实验接线图

    2 交通灯控制系统硬件原理

    2.1 8086CPU
    2.2 可编程并行接口芯片——8255A
    2.3 可编程计数/定时器芯片——8254
    2.4 可编程中断控制器——8259A

    3 交通灯控制系统软件设计:

    3.1设计总流程图:
    这里写图片描述
    3.2初始化流程图:
    3.3按键处理流程图:
    3.4显示流程图:
    3.5 按键扫描流程图:
    3.6 中断流程图

    4 实验内容

    根据接线图,将系统总线与8255单元、键盘及数码管显示单元、开关及LED显示单元连接,编写程序,扫描键盘输入,并将扫描结果进行处理后送数码管显示。
    实验具体内容如下:将键盘进行编号,记作0~F,当按下其中一个按键时:
    ①数字键“0~9”: 仅在设置通行时间时按键有效(设置键:“D”),实现通行时间设置的组合,数码管实时显示“XX——XX”(XX表示预设的时间)
    ②功能键“A”: 东西方向和南北方向同时禁行,数码管显示“888888”,东西方向和南北方向都亮红灯。
    ③功能键“B”: 强制东西方向通行,数码管显示“888888”,东西方向亮绿灯,南北方向亮红灯。
    ④功能键“C”: 强制南北方向通行,数码管显示“888888”,南北方向亮绿灯,东西方向亮红灯。
    ⑤设置键“D”:按一下可以对东西方向进入通行时间设置,再按一下对南北方向进入通行时间设置
    ⑤确定键“E”:将时间预设值修改,不符要求的方向不更改,按下后进入正常状态。
    ⑥取消键“F”:退出时间设置模式和功能键模式

    5 实验设备

    PC机一台,TD-PITE实验装置一套

    6 实验结果分析和讨论

    按要求接好线并下载程序后,能够正常实现交通灯的显示与功能键的启用,但在通行时间的设置上仍有一些问题:
    ①本应显示交通灯状态“-”“_”“¯”的数码管不按预想中的显示;
    ②数码管显示的顺序与预想中的相反
    解决办法:
    ①经过检查,是在存数码管段码的数组中,将A~F的也写了进去,对应“-”“_”“¯”的段码无法对应上去,把A~F的段码删去后正常显示。
    ②经过检查,是数码管的扫描与取段码的顺序不一致,所以只需要把动态扫描的顺序更换一下就可以,修改后正常显示。

    7 设计体会与小结

    此次综合设计可以说是获益匪浅。通过在图书馆和互联网上查阅了很多相关资料,了解到了许多汇编程序的思想,扩展了自己的视野,不再仅仅局限于书本中几条简短的程序,而且更重要的是明白写程序的态度:仔细谨慎,精益求精。
    在明白整个系统的工作流程后,我就开始一个代码一个代码地敲,从基本程序开始逐步添加功能,在没有实验环境的情况下,仔细地推敲自己的程序,把一个个例程打印出来做好笔记,用纸演算,综合处理较多的是按键处理和数码管模块,以及利用有限的I/O实现交通灯LED的开关模块显示。在按键处理中,运用合理的公式将数字键组成(11~99)的数字,利用计数器原理实现不同按键功能的切换;在数码管模块中,要根据不同的时间状态显示不同的字符,在实现动态扫描的同时,保留开关模块的LED交通灯状态,学会了让某一位置数或复位的技巧。
    现实是骨感的,再好的程序也需要去检验,在实验室调试过程中,首先就要排除语法错误等的错误,一些小的细节自己也无法即时检查出来,在系统加电调试中,针对一些问题,将错误之处缩小在最小范围内,通过后期一次次的排查终于将整个系统完善好。
    这次设计,我把学过的计算机编译原理的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。以前对微机原理与系统的认识是模糊的,概念上的,现在通过自己动手做实验,从实践上认识了微机系统是如何处理命令的,如何协调各个部件运行,对微机编译原理的认识更加深刻。
    最后,综合所学微机原理与接口技术相关软件、硬件知识,并应用基础实验所获得的实验设计技能,独立设计解决实际应用问题的系统。

    前面部分源程序:详见完整报告文件

    /***********************************************************
     * 文件名: Traffic_Light.c
     * 功能描述: 使用8255、8253及8259完成交通灯综合设计实验
     **********************************************************
     *  8255的B口为数码管的段驱动
     *  A口  PA0~PA5    为数码管位驱动
     *  A口  PA0~PA3    为列扫描
     *  C口  PC0~PC3    为行扫描
     *  A口  PA6~PA7                        PC口为黄灯,方便置数/复位  
     *  C口  PC4     为东西方向指示灯    PA7-红,PA6-绿,PC4-黄
     *  C口  PC5~PC7    为南北方向指示灯    PC7-红,PC6-绿,PC5-黄
     *  按下按键,对应功能会被执行。
     ********************************************************/
    
    #include <stdlib.h>
    #include <conio.h>
    #define uchar unsigned char 
    
    //8254端口地址IOY3      接1MHz的CLK
    #define M8254_A     0x6c0
    #define M8254_B     0x6c2
    #define M8254_C     0x6c4
    #define M8254_CON   0x6c6
    
    //8255端口地址IOY0
    #define MY8255_A     0x0600
    #define MY8255_B     0x0602
    #define MY8255_C     0x0604
    #define MY8255_MODE  0x0606
    
    #define Rdata(port)     inportb(port)
    #define Wdata(port, x)  outportb(port, x)
    
    //晶振:12MHz
    void dis(void);
    void clear(void);           //清屏
    void ccscan(void);          //按键扫描
    void getkey(void);          //获取键值key_num
    void delay(int time);
    
    void Initial(void);
    void Ini_Interrupt(void);
    void Ini_Timer(void);
    void Button_Pro(void);
    
    void EW1_update(void);      //东西绿南北红
    void EW2_update(void);      //东西黄南北红
    void SN1_update(void);      //东西红南北绿
    void SN2_update(void);      //东西红南北黄
    void set_update(void);      //更新设置时应显示的值
    
    /******************************
    变量、控制位定义
    ******************************/
    uchar EW=12,SN=15;          //初始化交通灯通行时间
    
    /*  交通灯端口定义
    #define EW_red      PA7:X0000000b   
    #define EW_green    PA6:0X000000b   
    #define EW_yellow   PC4:000X0000b   
                    X=1,亮   X=0,灭
    #define SN_red      PC7:X0000000b   
    #define SN_green    PC6:0X000000b   
    #define SN_yellow   PC5:00X00000b   */
    
    uchar EW_SN;                //功能键标志
    uchar EW_EN;
    uchar SN_EN;
    uchar TIME_SET;             //设置键标志
    uchar EW_TEMP;
    uchar SN_TEMP;
    
    char Time_EW;               //东西方向计时变量
    char Time_SN;               //南北方向计时变量
    
    // 数码管显示对应值代码
    char a[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 
                0x6d, 0x7d, 0x07, 0x7f, 0x6f, 
                0x01, 0x40, 0x08};
    //最后3位是用数码管表示的东西南北方向红绿灯状态,分别是红"ˉ"、黄"-"、绿"_"
    
    //每0.5s进入一次中断,表示1Hz的方波时钟信号的电平,用给黄灯当闪烁频率
    uchar count=0;
    
    //设置模式下存放要显示的值,与a[]配合使用
    char SET_NUM [6];
    //char SET_NUM  = {EW_TEMP/10,EW_TEMP%10,'-','-',SN_TEMP/10,SN_TEMP%10};
    
    //正常模式下存放要显示的值,与a[]配合使用
    char TIME_NUM [6];
    //char TIME_NUM = {EW/10,EW%10,EW_STATE,SN_STATE,SN/10,SN%10};
    
    int  cc;
    //按键值0~f
    int  key_num;
    

    完整文档下载:
    https://download.csdn.net/download/u012579502/10655911

    更多相关内容
  • 因此,作为交通监管系统的重要组成部分,交通信号灯在协调人、车、路的关系时发挥着巨大的作用。EDA(Electronic Design Automaon,电子设计自动化)是依靠功能强大的计算机,对以硬件描述语言HDL(Hardware Descripon ...
  • 并利用8253可编程定时/计数器产生方波,同时利用8055可编程并行口芯片实现对交通灯的控制,其中A口进交通信号灯控制,B口输出交通信号灯的时间(秒数)。 本项目中预定设置红灯和绿灯时间都为9秒,绿灯过后,黄灯...
  • (1)设计一个用于十字路口的交通灯灯控制台,能...(3)只考虑直行和左转车辆控制信号灯,右转车辆不受信号灯控制, 南北向车辆与东西向车辆交替方向,同方向等待车辆应先方向直行车辆而后放行左转车辆 详细描述请看博客
  • 研究目的: 模拟交通灯控制器就是使用单片机来控制一些LED和数码管,...利用所学知识设计一款基于单片机的交通信号灯控制系统。主要功能如下:东西向与南北向信号灯定时20秒交换一次、每次交换时点亮黄灯5s提醒行人。
  • 汽车数量越来越多,而传统的交通信号灯控制模式采用的是定时控制,由于车流量是随时变化的,当此时没有车通过,而相对的车要等到此方向的绿灯结束显示红灯才能通过,在时间和空间方面的应变性能较差,这样不仅浪费了...
  • 在如今这个经济飞速发展的世界,交通已...西门子可编程控制器指令丰富,可以接各种输出、输入扩充设备,有丰富的特殊扩展设备,其中的模拟输入设备和通信设备更是符合交通灯控制系统的要求与特点,能够方便地联网通信。
  • 太阳能LED交通信号灯由光伏极板、充放电控制器、蓄电池、LED交通信号灯系统构成。系统框图如图1所示。 图1 系统框图 其中,光伏极板是用来将太阳能转换成电能,为系统供电。 充放电控制器是将太阳能产生的电...
  • 2.2 十字路口交通信号灯控制系统电路图………………………………………10 2.3 十字路口交通信号灯PLC硬件控制电路设计 …………………………… 10 2.4 十字路口交通信号灯PLC控制程序设计………………………………...
  • 资料包:数电课程设计报告+原理图+仿真文件(仿真图)+电路各模块原理分析
  • 交通信号灯控制系统

    2012-09-14 10:57:05
    主要介绍了微机原理与接口技术的应用之一——交通信号灯控制系统的设计与实现,主要是模拟十字路口的红绿灯,还介绍了交通灯控制器的原理以及电路接线,其中主要用到的芯片有可编程并行通信接口芯片8255A。...
  • 微机原理与接口技术课程设计-交通信号灯,1.1题目要求: 1.能实现每30秒红绿灯交替点亮; 2.通过LED数码管显示点亮时间,在绿灯要灭的前3秒钟变成黄灯闪烁;
  • 十字路口交通信号灯控制系统

    万次阅读 多人点赞 2020-07-28 22:33:02
    十字路口交通信号灯控制系统主要任务开发平台设计思路 主要任务 设计一个用于十字路口的交通灯控制器,能显示十字路口东西、南北两个方向的红、黄、绿的指示状态; 具有倒计时的功能,用两组数码管作为东西和南北...

    主要任务

    • 设计一个用于十字路口的交通灯控制器,能显示十字路口东西、南北两个方向的红、黄、绿的指示状态;
    • 具有倒计时的功能,用两组数码管作为东西和南北方向的倒计时显示,主干道直行(绿灯)60秒后,左转(绿灯)40秒;支干道直行(绿灯)45秒后,左转(绿灯)30秒,在每次绿灯变成红灯的转换过程中,要亮黄灯5秒作为过渡。黄灯每秒闪亮一次。
    • 只考虑直行和左转车辆控制信号灯,右转车辆不受信号灯控制, 南北向车辆与东西向车辆交替方向,同方向等待车辆应先方向直行车辆而后放行左转车辆。

    开发平台

    系统开发工具Vivado
    系统开发语言Verilog
    仿真平台杰创EDA远程二代网页版

    时序分析

    首先弄清楚主干路和支干路在一个周期内的变化状况,如图所示:
    在这里插入图片描述
    在这里插入图片描述

    电路原理图

    此电路原理图是在杰创EDA远程二代网页版上进行绘制的,如图所示在这里插入图片描述

    设计思路

    交通信号灯系统控制的原理框图如图所示,将系统分成4个模块:

    1. 主控制器模块
    2. 定时计数器模块
    3. 分频计数器模块
    4. 译码模块

    在这里插入图片描述

    主控制器模块

    主控制器模块原理上是一个状态机,依据要求设计,设计出信号灯点亮规律的状态转换表,如表所示,其中0表示灭,1表示亮,状态表显示了信号灯在运行过程中每个状态应该持续的时间,以及状态之间的转换顺序。依据分频计数器,当分频计数器的时钟达到了对应时间则切换为下一个状态,就可以实现控制信号灯的亮灭。
    在这里插入图片描述

    图中有八个状态,实际编程的时候还应该符加四个状态,用于表示黄灯的闪烁,这四个状态对应黄灯为0,表示黄灯熄灭,1s切换一次状态就可以达到黄灯每秒闪烁一次的效果,符加状态如下表所示:在这里插入图片描述

    分频计数器模块

    整个系统采用的时钟是1khz,原因是为了显示四位数码管上多位数字,而信号灯的状态切换是以秒为单位进行的,因此需要将1khz的时钟信号转化成1hz的,设计分频计数器,每500个周期,分频时钟信号反转一次。

    定时器模块

    状态机上共有8个状态,以这8个状态为周期进行循环,系统执行一个周期共计需要195秒,因此设计定时计数器进行计数,定时到195秒时就归零重新计时。

    译码模块

    在讲译码模块之前,先讲一讲四位数码管如何使用,七段数码管是电子开发过程中常用的输出显示设备,本项目使用的是一个四八位一体,共阴极型七段数码管。右图是本实验用到的四八位一体,共阴极型,左图为单个静态数码管。

    在这里插入图片描述在这里插入图片描述
    由于此设计七段数码管公共端连接到GND(共阴极型),当数码管的中的那一个段(a,b,c,d,e,f,g)被输入高电平,则相应的这一段被点亮。反之则不亮。四位一体的七段数码管在单个静态数码管的基础上加入了用于选择哪一位数码管的位选信号(1,2,3,4)端口。四个数码管的a,b,c,d,e,f,g,h,dp都连接在了一起,4个数码管分别由各自的 位选信号来控制,当位选信号为低电平时该位数码管被选择。同一时刻只有一位数码管被选中并点亮,下一时刻则切换到相邻位数码管,但因为切换速度很快,在视觉暂留效应的帮助下,我们看到的就是四位数码管被整体点亮

    为此可以设计出每个数字的译码表,如表所示

    数字十六进制下编码
    07’h7e
    17’h30
    27’h6d
    37’h79
    47‘h33
    57’h5b
    67’h5f
    77’h70
    87’h7f
    97’h7b

    输出数据的时候,在管脚上输出相应的编码,控制时钟以快速频率切换就可以实现显示两位数字效果。默认使用两位数字来显示倒计时,有红灯倒计时大于99秒的情况,也就是超出两位数字所表示的范围,规定超过99秒则不显示

    源码免费下载链接

    实现

    主控制模块

    module traffic_light (
        clk,
    	rst_n,
    	count,
    	ew,
    	sn
    );
    input clk,rst_n;
    input [7:0] count;
    output [5:0] ew,sn; 
    reg [5:0] ew,sn;
    reg [3:0] pre_state,next_state;
    reg [12:0] counter=13'b0;
    reg clk_5hz=1'b0;
    
    parameter 
    S0=4'b0000,   //主干路四个状态
    S1=4'b0001,
    S2=4'b0010,
    S3=4'b0011,
    
    S4=4'b0100,   //支干路四个状态
    S5=4'b0101,
    S6=4'b0110,
    S7=4'b0111,
    
    S8=4'b1000,   //主干路直行黄灯
    S9=4'b1001,   //主干路左转黄灯
    S10=4'b1010,  //支干路直行黄灯
    S11=4'b1011;  //支干路左转黄灯
    
    always @ (negedge clk or negedge rst_n) 
    begin
        if(!rst_n)
            pre_state<=S0;
        else
        	pre_state<=next_state;
    end
    
    always @ (negedge clk) begin          //这段代码是用来实现黄灯的闪烁功能
       if(count>=60&&count<65)
            begin
            counter <=counter+1'b1;      
            if (counter == 'd499)begin     //计数,形成0.5秒的时钟
            clk_5hz <= !clk_5hz;
            counter <= 'd0;
            end   
        end 
    
        else if(count>=105&&count<110)
            begin
            counter <=counter+1'b1;
            if (counter == 'd499)begin
            clk_5hz <= !clk_5hz;
            counter <= 'd0;
            end
        end  
    
        else if(count>=155&&count<160)
            begin
            counter <=counter+1'b1;
            if (counter == 'd499)begin
            clk_5hz <= !clk_5hz;
            counter <= 'd0;
            end
        end
    
        else if(count>=190&&count<195)
            begin
            counter <=counter+1'b1;
            if (counter == 'd499)begin
            clk_5hz <= !clk_5hz;
            counter <= 'd0;
            end
        end        
        else     
           counter <='d0;                        
    end
    
    always @ (clk or pre_state) 
    begin
        next_state<=3'bxxx;    
        if(count>=60 && count<65) begin               //主干路直行黄灯
            if(clk_5hz) next_state<=S8;
            else
                next_state <=S1; end              
        else if(count==8'd65)                        //主干路左转绿灯
            next_state<=S2;   
        else if(count>=8'd105 && count<8'd110)begin    //主干路左转黄灯
            if(clk_5hz) next_state <=S9;
            else
                next_state<=S3;end
        else if (count==8'd110)                        //支干路直行绿灯
            next_state<=S4;    
        else if (count>=8'd155 && count<8'd160)begin   //支干路直行黄灯
            if(clk_5hz) next_state <=S10;
            else
                next_state<=S5;end
        else if (count==8'd160)                        //支干路左转绿灯
            next_state<=S6;
        else if (count>=8'd190 && count<8'd195)begin   //支干路左转黄的
            if(clk_5hz) next_state <=S11;   
            else
                next_state<=S7;end 
        else if (count == 0)                      //主干路直行绿灯
            next_state<=S0;                 
        else    next_state <=pre_state; 
    end
    
    always @ (pre_state) 
    begin
        case (pre_state)                            //状态编码
                    
            S0:begin ew<=6'b001100;sn<=6'b001001;end
            
            S1:begin ew<=6'b001010;sn<=6'b001001;end
    
            S2:begin ew<=6'b100001;sn<=6'b001001;end
    
            S3:begin ew<=6'b010001;sn<=6'b001001;end
    
            S4:begin ew<=6'b001001;sn<=6'b001100;end
    
            S5:begin ew<=6'b001001;sn<=6'b001010;end
    
            S6:begin ew<=6'b001001;sn<=6'b100001;end
    
            S7:begin ew<=6'b001001;sn<=6'b010001;end
    
            S8:begin ew<=6'b001000;sn<=6'b001001;end       
    
            S9:begin ew<=6'b000001;sn<=6'b001001;end
    
            S10:begin ew<=6'b001001;sn<=6'b001000;end
    
            S11:begin ew<=6'b001001;sn<=6'b000001;end
    
            default:begin ew<=6'b001100;sn<=6'b001001;end
        endcase
            
    end
    
    endmodule
    

    分频计数器

    module countdiv (
    	clk,
    	rst_n,
    	clk_1hz
    );
    
    input clk,rst_n;
    output clk_1hz;
    reg clk_1hz=1'b0;
    reg [12:0] count_clk=13'b0;
    always @ (negedge clk) begin       //监听时钟下降沿
         count_clk <= count_clk + 1'b1; 
         if(count_clk == 'd499)begin      //当计数器为449时,进行信号翻转   
         clk_1hz <= !clk_1hz;
         count_clk <= 'd0;                //计数器归零
         end
    end
    endmodule
    

    定时计数器

    module counter (
    	clk,
    	rst_n,
    	out,
    	en
    );
    
    input clk,rst_n,en;
    output [7:0] out;
    reg [7:0] out;
    
    always @ (negedge clk or negedge rst_n)   //监听1hz的时钟信号
    begin
        if (!rst_n)                           //初始化为0
            out<=8'd0;
        else if(!en)
            out<=out;
        else if(out==8'd194)                  //当值为194时,下一个                                          
        	out<=8'd0;                        //时钟下降沿到来置为0
        else
        	out<=out+1'b1; 			          //增1计数
    end
        
    endmodule
    

    译码模块

    module tubeControl (
    	clk,          //1khz时钟
        clk_1hz,      //1hz时钟
    	rst_n,        //复位
    	count,        //计数时间
    	out_main,     //主干路a、b、c、d、e、f、g输出
        out_minor,    //支干路a、b、c、d、e、f、g输出
    	sel_main,     //主干路片选信号
        sel_minor    //支干路片选信号
    );
    
    
    input clk,rst_n;
    input clk_1hz;
    input [7:0] count;
    
    output [6:0] out_main;
    output [6:0] out_minor;
    
    output [1:0] sel_main;
    output [1:0] sel_minor;
    
    reg [1:0] sel_main;
    reg [1:0] sel_minor;
    
    reg [6:0] out_main;
    reg [6:0] out_minor;
    
    reg [6:0] num_main;
    reg [6:0] num_minor;
    
    reg [3:0] main_second=4'd10;
    reg [3:0] main_minute=4'd10;
    
    reg [3:0] minor_second=4'd10;
    reg [3:0] minor_minute=4'd10;
    
    reg [3:0] cnt_main;
    reg [3:0] cnt_minor;  
    
    //译码表
    parameter   NUM_0=7'h7e;
    parameter   NUM_1=7'h30;
    parameter   NUM_2=7'h6d;
    parameter   NUM_3=7'h79;
    parameter   NUM_4=7'h33;
    parameter   NUM_5=7'h5b;
    parameter   NUM_6=7'h5f;
    parameter   NUM_7=7'h70;
    parameter   NUM_8=7'h7f ;
    parameter   NUM_9=7'h7b;
    parameter   NUM_10=7'h00;          //这里表示不显示的译码
    
    always @ (negedge clk) 
    begin
        if(!rst_n)
            num_main<='d0;
        else if(count <= 8'd59)     //主干路直行绿灯倒计时
            num_main<=60-count;     
        else if(count<=8'd64)       //主干路直行黄灯倒计时
            num_main<=65-count;
        else if(count<=8'd 104)      //主干路左转绿灯倒计时
            num_main<=105-count;
        else if (count<=8'd109)      //主干路左转黄灯倒计时 	   
            num_main<=110-count; 
        else if(count<=8'd194)       //其他情况下红灯倒计时
            num_main<=195-count;
                            
    end
    
    always @ (negedge clk) 
    begin
        if(!rst_n)
            num_minor<='d0;
        else if(count<=8'd109)        //其他情况下红灯倒计时
            num_minor<=110-count;
        else if(count<=8'd154)        //支干路直行绿灯倒计时
            num_minor<=155-count;    
        else if(count<=8'd159)        //支干路直行黄灯倒计时
            num_minor<=160-count;
        else if(count<=8'd189)       //支干路左转绿灯倒计时
            num_minor<=190-count;
        else if(count<=8'd194)       //支干路左转黄灯倒计时
            num_minor<=195-count;
    end
    
    always @ (num_minor) 
    begin
        if(num_minor==0)begin        //初始化
            minor_second<=10;
            minor_minute<=10;end
        else if(num_minor>99)begin   //倒计时值大于99时,不显示
            minor_second<=10;
            minor_minute<=10;end
        else
            begin
            minor_second<=num_minor%10;     //计算倒计时时间
            minor_minute<=num_minor/10;
            end     
    end
    
    always @ (num_main) begin
        if(num_main==0)begin        //初始化
            main_second<=10;
            main_minute<=10;end
        else if(num_main>99)begin   //倒计时值大于99时,不显示
            main_minute<=10;
            main_second<=10;end
        else
            begin
            main_minute<=num_main/10;
            main_second<=num_main%10;
            end       
    end
    
    
    
    always @ (*) begin
        case(sel_main)        //主干路片选控制
            2'b10:cnt_main <= main_second;
            2'b01:cnt_main <= main_minute; 
       endcase
    end
    
    always @ (*) begin
        case(sel_minor)       //支干路片选控制
            2'b10:cnt_minor <= minor_second;
            2'b01:cnt_minor <= minor_minute; 
       endcase
    end
    
    always @ (*)                //译码
        case (cnt_main) 
            0: out_main=NUM_0;
            1: out_main=NUM_1;
            2: out_main=NUM_2;
            3: out_main=NUM_3;
            4: out_main=NUM_4;
            5: out_main=NUM_5;
            6: out_main=NUM_6;
            7: out_main=NUM_7;
            8: out_main=NUM_8;
            9: out_main=NUM_9;
            10:out_main=NUM_10;    
        endcase      
    
    always @ (*)
        case (cnt_minor) 
            0: out_minor=NUM_0;
            1: out_minor=NUM_1;
            2: out_minor=NUM_2;
            3: out_minor=NUM_3;
            4: out_minor=NUM_4;
            5: out_minor=NUM_5;
            6: out_minor=NUM_6;
            7: out_minor=NUM_7;
            8: out_minor=NUM_8;
            9: out_minor=NUM_9;
            10:out_minor=NUM_10;
        endcase  
    
    always @ (posedge clk,negedge rst_n)    //高频率切换片选管脚
    begin                                   //达到显示两位数效果
        if(!rst_n)  
            sel_main<=2'b10;
        else
            sel_main<={sel_main[0],sel_main[1]};
    end 
    
    always @ (posedge clk,negedge rst_n) 
    begin      
        if(!rst_n)  
            sel_minor<=2'b10;
        else
            sel_minor<={sel_minor[0],sel_minor[1]};
    end
    
    endmodule
    
    
    

    TOP模块

    module top (
    	clk,
    	rst_n,
    	en,
    	ew,
    	sn,
    	out_main,
    	out_minor,
    	sel_main,
    	sel_minor
    );
    input clk,rst_n,en;
    output [5:0] ew,sn;
    wire [7:0] count;
    wire [5:0] ew,sn;
    output out_main;
    output out_minor;
    output [1:0] sel_main;
    output [1:0] sel_minor;
    wire [6:0] out_main;
    wire [6:0] out_minor;
    wire clk_1hz;
    
    countdiv U0(         //分频计数器模块
        .clk(clk),
        .rst_n(rst_n),
        .clk_1hz(clk_1hz));
    
    
    counter U1(          //时钟计数器模块
    	.clk(clk_1hz),
    	.rst_n(rst_n),
    	.out(count),
    	.en(en));
    
    traffic_light U2(    //主控制器模块
    	.clk(clk),
    	.rst_n(rst_n),
    	.count(count),
    	.ew(ew),
    	.sn(sn));
    tubeControl U3(      //数码管译码模块
    	.clk(clk),
        .clk_1hz(clk_1hz),
        .rst_n(rst_n),
        .count(count),
       .out_main(out_main),
        .out_minor(out_minor),
        .sel_main(sel_main),
        .sel_minor(sel_minor));   	
    endmodule
    

    仿真测试文件

    module top_tb;
    reg clk,rst_n,en;
    wire [5:0] ew,sn;
    wire [6:0] out_main;
    wire [6:0] out_minor;
    wire [1:0] sel_main;
    wire [1:0] sel_minor;
    top U1(
    	.clk(clk),
    	.rst_n(rst_n),
    	.en(en),
    	.ew(ew),
    	.sn(sn),
    	.out_main(out_main),
    	.out_minor(out_minor),
    	.sel_main(sel_main),
    	.sel_minor(sel_minor));
    
    initial
    begin
        clk<=1'd0;
        forever #500 clk=~clk;        //仿真一个1khz的时钟信号
    end
    
    initial
    begin
        rst_n=1'b1;                    //初始化参数
        en=1'b0;
        #1 rst_n=1'b0;
        #1 rst_n=1'b1;en=1'b1;
    
    end
    
    endmodule
    

    设计约束文件

    set_property PACKAGE_PIN E3 [get_ports clk]
    set_property PACKAGE_PIN K5 [get_ports rst_n]
    set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
    set_property IOSTANDARD LVCMOS33 [get_ports clk]
    set_property IOSTANDARD LVCMOS33 [get_ports {sn[2]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {sn[1]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {sn[0]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {ew[2]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {ew[1]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {ew[0]}]
    
    set_property PACKAGE_PIN B9 [get_ports en]
    set_property IOSTANDARD LVCMOS33 [get_ports en]
    
    t_property IOSTANDARD LVCMOS33 [get_ports {out_main[6]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {out_main[5]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {out_main[4]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {out_main[3]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {out_main[2]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {out_main[1]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {out_main[0]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {out_minor[6]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {out_minor[5]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {out_minor[4]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {out_minor[3]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {out_minor[2]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {out_minor[1]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {out_minor[0]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {sel_main[1]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {sel_main[0]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {sel_minor[1]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {sel_minor[0]}]
    
    set_property IOSTANDARD LVCMOS33 [get_ports {ew[5]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {ew[4]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {ew[3]}]
    set_property PACKAGE_PIN M14 [get_ports {ew[4]}]
    set_property PACKAGE_PIN L14 [get_ports {ew[5]}]
    set_property PACKAGE_PIN K13 [get_ports {ew[1]}]
    set_property PACKAGE_PIN M15 [get_ports {ew[2]}]
    set_property PACKAGE_PIN T9 [get_ports {sn[4]}]
    set_property PACKAGE_PIN L12 [get_ports {sn[5]}]
    set_property PACKAGE_PIN D5 [get_ports {sn[1]}]
    set_property PACKAGE_PIN D6 [get_ports {sn[2]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {sn[5]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {sn[4]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {sn[3]}]
    set_property PACKAGE_PIN D3 [get_ports {out_main[6]}]
    set_property PACKAGE_PIN C4 [get_ports {out_main[5]}]
    set_property PACKAGE_PIN D16 [get_ports {out_main[4]}]
    set_property PACKAGE_PIN C7 [get_ports {out_main[3]}]
    set_property PACKAGE_PIN D8 [get_ports {out_main[2]}]
    set_property PACKAGE_PIN A12 [get_ports {out_main[1]}]
    set_property PACKAGE_PIN D9 [get_ports {out_main[0]}]
    set_property PACKAGE_PIN E12 [get_ports {sel_main[1]}]
    set_property PACKAGE_PIN E13 [get_ports {sel_main[0]}]
    set_property PACKAGE_PIN E11 [get_ports {out_minor[6]}]
    set_property PACKAGE_PIN T10 [get_ports {out_minor[5]}]
    set_property PACKAGE_PIN R5 [get_ports {out_minor[4]}]
    set_property PACKAGE_PIN T5 [get_ports {out_minor[3]}]
    set_property PACKAGE_PIN R6 [get_ports {out_minor[2]}]
    set_property PACKAGE_PIN R7 [get_ports {out_minor[1]}]
    set_property PACKAGE_PIN D14 [get_ports {out_minor[0]}]
    set_property PACKAGE_PIN D15 [get_ports {sel_minor[1]}]
    set_property PACKAGE_PIN F12 [get_ports {sel_minor[0]}]
    
    set_property PACKAGE_PIN L15 [get_ports {ew[3]}]
    set_property PACKAGE_PIN L13 [get_ports {ew[0]}]
    set_property PACKAGE_PIN C6 [get_ports {sn[3]}]
    set_property PACKAGE_PIN A2 [get_ports {sn[0]}]
    
    
    

    测试结果

    仿真测试结果

    此测试很重要,如果没有云平台进行测试只能进行仿真,仿真文件如上所示,时间单位为1us,每500us进行时钟信号反转就形成了1khz的时钟信号。
    仿真结果如图所示,宏观上看首先测试信号灯是否显示正确,观察ew(表示主干路方向),sn(表示支干路方向)两个值
    在这里插入图片描述再观察微观测试结果,截取了一个有代表意义的片段60秒至65秒,这段时间主干路直行黄灯正在闪烁,对应ew的值在0a和08之间变换,由状态表知是在S1状态和S8状态之间切换,每1秒切换一次,一次持续0.5秒,实现了黄灯的闪烁。
    在这里插入图片描述

    再来观察数码管的仿真结果,截取了一个有意义的片段60秒到65秒,60秒是状态S0和S1的交界处,容易出错。系统采用的共阴极4位数码管,片选信号0表示有效,1表示无效,所以片选信号1表示十位,片选2表示个位根据译码表知,60秒前是7e 30代表01秒,是直行绿灯最后一秒倒计时;60秒后倒计时是7e 5b代表05秒,表示黄灯5秒倒计时的开始。
    在这里插入图片描述
    195秒时仿真结果,195秒后重新开始循环。
    在这里插入图片描述

    云平台运行结果

    通常情况仿真结果正确就已经完成了,这里提供云平台的运行结果,仅用来观察系统运行结果,

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    观看效果

    视频展示效果
    观看效果

    如果有不清楚的地方欢迎留言评论
    第一次写文章,欢迎大家交流,批评。

    展开全文
  • 交通信号灯控制方式很多。本系统采用MSC-51系列单片机ATSC51和可编程并行I/O接口芯片8255A为中心器件来设计交通灯控制器,实现了能根据实际车流量通过8051芯片的P1口设置红、绿灯燃亮时间的功能;红绿灯循环点亮,倒...
  • 交通信号灯状态监测技术是道路交通信号控制关键技术之一,直接关系到道路交通的安全与通畅。文中介绍了一种新型的多路交通信号灯状态监测方法。该方法基于互感检测原理,根据互感器次级输出电流,经信号调理电路处理...
  • 《嵌入式系统原理与应用》综合设计课程设计-交通信号灯控制器设计
  • 见http://blog.csdn.net/czjxy881/article/details/21228881
  • 微机原理考试用 内含全部资源 相信学习微机原理的同学应该用的着 特此分享
  • 利用发光二极管模拟交通灯的变化。 (2)十字路口交通灯的变化规律如下: ① 南北路口的绿灯、东西路口的红灯同时亮30秒; ② 南北路口的黄灯闪烁若干次,同时东西路口的红灯继续亮; ③ 南北路口的红灯、东西路口...
  • 交通信号灯控制系统的Verilog实现

    千次阅读 多人点赞 2020-07-17 11:29:44
    交通信号灯控制系统的Verilog实现 作为数字系统设计入门案例,下面简单介绍最简单的交通控制系统,说明设计思路。 首先给出要求:设计一个主干道和支干道十字路口的交通信号灯控制电路 (1)一般情况下保持主干道...

    交通信号灯控制系统的Verilog实现
    作为数字系统设计入门案例,下面简单介绍最简单的交通控制系统,说明设计思路。
    首先给出要求:设计一个主干道和支干道十字路口的交通信号灯控制电路
    (1)一般情况下保持主干道通畅,主干道绿灯亮、支干道红灯亮,并且主干道绿灯亮时间不少于60秒。
    (2)主干道绿灯亮超过60秒,且支干道有车时,主干道红灯亮,支干道绿灯亮,但支干道亮灯时间不超过30秒。
    (3)每次主干道或支干道绿灯变红灯时,黄灯先亮5秒。
    1.逻辑抽象,明确输入输出。
    主干道和支干道的十字路口交通灯系统求优先保证主干道的畅通。平时处于主干道绿灯、支干道红灯的状态。当支干道有车时,传感器发出信号S=1,主干道绿灯先转换成黄灯、再变成红灯,支干道由红灯变成绿灯。如果支干道继续有车通过时,则传感器继续有信号,使支干道保持绿灯亮,但支干道绿灯持续亮的时间不得超过30s,否则支干道绿灯先转换成黄灯再变成红灯,同时主干道由红灯变成绿灯。主干道每次通行时间不得短于60s,在此期间,即使支干道S有信号,也不能中止主干道的绿灯亮。
    输入信号有时钟、复位、传感器信号;输出有主干道红黄绿灯和支干道红黄绿灯。
    2.确定系统框图
    首先用状态机作为主控制,状态机转换条件根据计时器信息判断转换条件,译码电路中根据所在状态输出对应干道信号灯状态。
    控制单元根据时钟和传感信号向计数器发出信号,计时器向控制单元发出60s(t1)、30s(t2)、5s(t3)计时信号。主干道红黄绿用h_r,h_y,h_g表示,支干道红黄绿用f_r,f_y,f_g表示。
    在这里插入图片描述
    因此,用计时分别产生三个持续的时间段后,向控制单元发出时间已到信号,控制单元根据计时器及传感器的信号,决定是否进行状态转换。如果肯定,则控制单元发出状态转换信号St,计时器开始清零,准备重新计时。

    交通灯控制单元的控制过程分为四个阶段,对应的输出有四种状态,分别用S0、S1、S2和S3表示:
    S0状态 主干道绿灯亮支干道红灯亮,此时若支干道有车等待通过,而且主干道绿灯已亮足规定的时间t1,控制器发出状态转换信号St,输出从状态S0转换到S1 (转换条件:绿灯亮够60s且检测到支干道有车即 t1&&s=1

    S1状态 主干道黄灯亮,支干道红灯亮,进人此状态,黄灯亮足规定的时间t3时,控制器发出状态转换信号St,输出从状态S1转换到S2。 (转换条件:黄灯亮够5s就转换状态即 t3=1

    S2状态 支干道绿灯亮,主干道红灯亮,若此时支干道继续有车,则继续保持此状态,但支干道绿灯亮的时间不得超过t2,否则控制单元发出状态转换信号St,使输出转换到S3状态。若此时支干道没有车,则控制单元立即发出状态转换信号St,使输出转换到S3状态。
    (转换条件:支干道绿灯亮够30s或者检测到支干道没车即 t2+(~s)=1

    S3状态 支干道黄灯亮,主干道红灯亮,此时状态与S1状态持续的时间相同均为t3,时间到时,控制器发出St信号,输出从状态S3回到S0状态。对上述S0、S1、S2和S3四种状态按照格雷码进行编码分别为00,01,11和10。
    /控制状态机/
    always@(posedge clk or negedge rst)
    begin
    if(!rst)
    current_state<=2’d0;
    else
    current_state<=next_state;
    end

    always@(s,current_state,t1,t2,t3)
    begin
    	case(current_state)
    		s0:	begin
    			next_state=(t1&&s)?s1:s0;
    			ST=(t1&&s)?1'b1:1'b0;			
    			end
    		s1:	begin
    			next_state=(t3)?s2:s1;
    			ST=(t3)?1'b1:1'b0;			
    			end
    		s2:	begin
    			next_state=(t2||~s)?s3:s2;
    			ST=(t2||~s)?1'b1:1'b0;			
    			end
    		s3:	begin
    			next_state=(t3)?s0:s3;
    			ST=(t3)?1'b1:1'b0;
    			end
    		endcase
    end
    

    在这里插入图片描述
    在这里插入图片描述

    计时部分采用2个寄存器代表十位(t_h)和个位(t_l)计数,同时每次检测到转换信号都要清零重新计时

    always@(posedge clk or negedge rst)   //计时模块
    	begin
    		if(!rst)
    			{t_h,t_l}<=8'd0;
    		else if(ST)             //控制信号有效说明灯的颜色改变重新计数
    			{t_h,t_l}<=8'd0;
    		else if((t_h==4'd5)&(t_l==4'd9))   //判断是否计数到60
    			begin
    			{t_h,t_l}<={t_h,t_l};						
    			end
    		else if(t_l==4'd9)   //判断个位是否计数满,是则十位加一
    			begin
    			t_h<=t_h+1'b1;
    			t_l<=4'd0;			
    			end
    		else begin
    			t_h<=t_h;
    			t_l<=t_l+1'b1;		
    		end
    	end
        assign t3=(t_h==4'd0)&(t_l==4'd4);   //主干道绿灯计数时间
    	assign t2=(t_h==4'd2)&(t_l==4'd9);	 //	支干道绿灯计数时间
    	assign t1=(t_h==4'd5)&(t_l==4'd9);   //黄灯计数时间
    

    译码部分根据状态机所在状态输出对应信号灯状态

    always@(current_state)
    	begin
    		case(current_state)
    			s0:	begin
    				{hg,hy,hr}=3'b100;  //主干道绿灯
    				{fg,fy,fr}=3'b001;  //支干道红灯			
    				end
    			s1:	begin
    				{hg,hy,hr}=3'b010;  //主干道黄灯
    				{fg,fy,fr}=3'b001;  //支干道红灯			
    				end
    			s2:	begin
    				{hg,hy,hr}=3'b001;  //主干道红灯
    				{fg,fy,fr}=3'b100;  //支干道绿灯			
    				end		
    			s3:	begin
    				{hg,hy,hr}=3'b001;  //主干道红灯
    				{fg,fy,fr}=3'b010;  //支干道黄灯			
    				end	
    			endcase
    	end
    

    在这里插入图片描述
    仿真结果图
    总结:本文设计较简单,对于复杂交通还需改善,但是能够从中慢慢建立对系统架构的认知和联系,从中理清各模块间关系。后续还需多查资料研究,如有错误不合理之处,请告知。

    展开全文
  • 每个路口均有红、黄、绿三个,初始状态为四个路口的红灯亮,2(3)秒之后,1、3路口的绿灯亮,2、4路口的红灯亮,1、3路口通车;延时50(45)秒后,1、3路口绿灯闪烁5(3)秒,后绿灯灭,黄灯亮,5(3)秒后,1、3...
  • 目录 TOC \o "1-3" \h \z \u 一 设计背景 2 二任务和要求 2 三总体设计方案 3 1....交通灯显示电路 5 4.数码管显示 6 5.置数变换电路 6 6.流量控制电路 7 五总电路原理图 8 六总电路图 9 七原件清单
  • 交通信号灯控制系统设计

    千次阅读 2016-06-30 16:00:00
    交通信号灯控制系统设计 作为一个硬件程序设计民工,最近一直在学习python,写个爬虫,排个序,再画个界面,其实还是挺好玩的。然而这不是我的主业啊!!!-_-||| 下学期开学就要找工作了,明天刚好...

    作为一个硬件程序设计民工,最近一直在学习python,写个爬虫,排个序,再画个界面,其实还是挺好玩的。然而这不是我的主业啊!!!-_-|||

    下学期开学就要找工作了,明天刚好是新的一个月,还是滚回去调我的FPGA吧。

    今天先更新一个很小很小的例子作为开端,这是前几天xxx给我出的一道很随意的题目,主要是看面对一个项目,如何进行需求分析,模块功能划分以及仿真验证,当然还有如何写文档。

     

    一、需求分析

    设计一个十字路口交通等控制系统,其要求如下:

    (1)东西(用A表示)、南北(用B表示)方向均有红灯、绿灯、黄灯指示,东西向持续时间暂定为50s、5s和45s(对应南北向持续时间为40s、5s和55s),要求可以更改该时间。交通灯正常运行的切换示意图如图1.1所示。

    图1.1 交通控制系统正常运行切换示意图

    (2)系统设有时钟,以倒计时方式显示每一路允许通行的时间。

    (3)当任何一个方向出现特殊情况时,系统可由交警手动控制进入特殊运行状态,即红灯全亮,时钟停止计时,东西、南北向所有车辆停止通行;当特殊运行状态结束后,系统恢复工作,继续正常运行。

    二、原理分析

    本系统以秒为时间单位运行,其核心工作过程可用状态机进行描述:

    EMRG:紧急制动状态,东西(A)方向红灯亮,南北(B)方向红灯亮,当紧急制动信号(hold=’0’)时进入这种状态;

    AgBr:东西(A)方向绿灯亮,南北(B)方向红灯亮,此状态持续50秒的时间;

    AyBr:东西(A)方向黄灯亮,南北(B)方向红灯亮,此状态持续5秒的时间;

    ArBg:东西(A)方向红灯亮,南北(B)方向绿灯亮,此状态持续40秒的时间;

    ArBy:东西(A)方向红灯亮,南北(B)方向黄灯亮,此状态持续5秒的时间。

    图2.1 交通控制系统状态转移图

    当紧急制动信号无效(hold=’1’)时,状态机按照AgBr->AyBr->ArBg->ArBy->AgBr循环;当紧急制动信号有效(hold=’0’) 时,状态机进入EMRG,两个方向红灯全亮,计数器停止计数;当紧急制动信号再恢复无效时,状态机会回到原来的状态继续执行。

    三、系统框架

    如图3.1所示,本系统主要有分频器、控制器、计数器和数码管译码器组成。

    图3.1交通信号灯控制系统原理图

    分频器将系统时钟分频成1Hz时钟信号,将其输出到信号灯控制器和倒计时计数器模块;控制器实现100s的计数(该计数值为AgBr,AyBr,ArBg,ArBy四个状态的时间总和,可由用户自行修改),100s是交通信号控制系统完成一次大循环所需的时间,在该时间内控制系统的状态转移以及AB两路信号的输出;倒计时模块实现50s、45s和5s的倒计时,该计数值可由用户自行修改;数码管译码模块负责将一位十进制数转换成对应的数码管段码值。

    四、模块设计

    1、分频器设计

    负责将输入的系统时钟(通常以MHz为量级)分频成1Hz时钟信号,供后级模块使用。

    其接口信号如图4.1所示,clk为系统时钟信号;rst_n为系统复位信号,低电平有效;clk_1Hz为输出信号。除此之外,该模块向上一级模块提供一个参数接口,用于配置当前系统时钟。

    图4.1 分频器模块接口

    2、控制器设计

    负责在时钟信号的控制下,交替控制两路红绿黄信号的输出;当出现紧急状态时,可手动控制两路的信号灯输出红色;当紧急状态解除后,恢复到进入紧急状态之前的状态。

    各个状态之间的切换使用状态机来实现,状态机采用三段式独热编码,其中5'b00001表示EMRG、5'b00010表示AgBr、5'b00100表示AyBr、5'b01000表示ArBg、5'b10000表示ArBy。

    其接口信号如图4.2所示,clk为1Hz时钟信号;rst_n为系统复位信号,低电平有效;hold_n为紧急制动输入,低电平有效;red_a,green_a,yellow_a, red_b,green_b,yellow_b分别为AB两路的红绿黄交通信号灯输出;state表示当前交通信号灯的状态,该信号输出到倒计时模块。

    图4.2 控制器模块接口

    3、计数器设计

    负责在时钟信号的控制下,对每一个state进行倒计时,倒计时的初值由用户设置;并将该倒计时按十位和个位分别输出。

    其接口信号如图4.3所示,clk为1Hz时钟信号;rst_n为系统复位信号,低电平有效;state为控制器输出,每当state改变时,计数器重载计数初值并开始倒计时;count_h,count_l分别为倒计时数值的十位和个位,输出到数码管译码模块。 

    图4.3 计数器模块接口

    4、数码管译码器设计

    将一位十进制数转换为数码管对应的段码值,数码管采用共阳极接法。

    其接口信号如图4.4所示,data为一位十进制数输入;seg为8比特段码值输出,信号按照从低到高的顺序依次为数码管的dp、seg_a、seg_b、seg_c、seg_d、seg_e、seg_f、seg_g。

      图4.4 数码管译码模块接口

    五、验证项

    由于该设计顶层除时钟和复位信号外,仅有一个紧急制动(hold)信号,因此只需要对该信号进行验证即可。

    方法:产生一个随机的时间(时间值为5000000 ± 500ns),系统运行到该时间以后,使hold_n拉低并保持10000 ± 1000ns,观察此时系统的运行状态;重复5次。

    六、仿真结果

    1、分频器仿真结果

    图6.1分频器仿真结果

    在仿真环境下使用的分频系数是100。

    2、控制器仿真结果

    如图6.2所示,当系统复位或初始化时,控制器会短暂的进入一个紧急状态,1s以后开始正常工作。

     

    图6.2 复位之后仿真结果

    系统正常运行仿真结果如图6.3所示,A路绿灯持续50s后进入黄灯状态,此时B路一直处于红灯状态;B路绿灯持续40s后进入黄灯状态,此时A路一直处于红灯状态。

     

    图6.3 正常运行仿真结果

    如图6.4所示,当hold按下时,系统进入紧急制动状态。此时AB两路均亮红灯,倒计时暂停;当hold释放时,系统恢复到进入紧急状态之前的状态,倒计时继续。

     

    图6.4 紧急制动状态仿真

    3、计数器仿真结果

    系统正常运行时计数器各信号如图6.5所示,此时A路绿灯时间为50s,黄灯时间为5s,红灯时间45秒;B路绿灯时间为40s,黄灯时间为5s,红灯时间55秒。

     

    图6.5 正常运行仿真结果

    当出现紧急状态时,两路均停止计时;退出紧急状态后恢复计时。

     

    图6.6 紧急状态仿真结果

    4、数码管译码仿真结果

    数码管采用共阳极接法:

     

    图6.7 数码管译码仿真结果

     

    以下是控制器的部分代码:

      1 //==================================================================================================
      2 //  Filename      : control.v
      3 //  Created On    : 2016-06-19 10:21:38
      4 //  Last Modified : 2016-06-22 20:15:01
      5 //  Revision      : 
      6 //  Author        : christ_song
      7 //  Company       : Xidian ISN
      8 //  Email         : christsong0127@gmail.com
      9 //
     10 //  Description   : 控制两路红绿灯的状态切换
     11 //                  hold信号表示紧急制动
     12 //
     13 //==================================================================================================
     14 `include "define.v"
     15 
     16 module CONTROL(
     17     input clk,
     18     input rst_n,
     19     input hold_n,
     20     output reg red_a,
     21     output reg green_a,
     22     output reg yellow_a,
     23     output reg red_b,
     24     output reg green_b,
     25     output reg yellow_b,
     26     //与倒计时模块的接口
     27     output reg [4:0] state
     28     );
     29 
     30     // localparam EMRG = 5'b00001;
     31     // localparam AgBr = 5'b00010;
     32     // localparam AyBr = 5'b00100;
     33     // localparam ArBg = 5'b01000;
     34     // localparam ArBy = 5'b10000;
     35     localparam TimeRound = `AgBr_time + `AyBr_time + `ArBg_time + `ArBy_time + 8'd3;
     36 
     37     reg [4:0] next_state;
     38     reg [7:0] time_cnt;
     39     always @(posedge clk or negedge rst_n)
     40         if (!rst_n) 
     41             time_cnt <=#1 8'b0;
     42         else if(!hold_n)
     43             time_cnt <=#1 time_cnt;
     44         else if(time_cnt >= TimeRound)
     45             time_cnt <=#1 8'b0;
     46         else 
     47             time_cnt <=#1 time_cnt + 1'b1;
     48             
     49     always @(posedge clk or negedge rst_n)
     50         if (!rst_n)
     51             state <=#1 `EMRG;
     52         else 
     53             state <=#1 next_state;
     54     always @(*)
     55         case(state)
     56             `EMRG:
     57                 if(!hold_n)
     58                     next_state = `EMRG;
     59                 else if(time_cnt < `AgBr_time)
     60                     next_state = `AgBr;
     61                 else if(time_cnt < `AgBr_time + `AyBr_time + 8'd1)
     62                     next_state = `AyBr;
     63                 else if(time_cnt < `AgBr_time + `AyBr_time + `ArBg_time + 8'd2)
     64                     next_state = `ArBg;
     65                 else
     66                     next_state = `ArBy;        
     67             `AgBr:
     68                 if(!hold_n)
     69                     next_state = `EMRG;
     70                 else if(time_cnt < `AgBr_time)
     71                     next_state = `AgBr;
     72                 else
     73                     next_state = `AyBr;
     74             `AyBr:
     75                 if(!hold_n)
     76                     next_state = `EMRG;
     77                 else if(time_cnt < `AgBr_time + `AyBr_time + 8'd1)
     78                     next_state = `AyBr;
     79                 else
     80                     next_state = `ArBg;                    
     81             `ArBg:
     82                 if(!hold_n)
     83                     next_state = `EMRG;
     84                 else if(time_cnt < `AgBr_time + `AyBr_time + `ArBg_time + 8'd2)
     85                     next_state = `ArBg;
     86                 else
     87                     next_state = `ArBy;
     88             `ArBy:
     89                 if(!hold_n)
     90                     next_state = `EMRG;
     91                 else if(time_cnt < TimeRound)
     92                     next_state = `ArBy;
     93                 else
     94                     next_state = `AgBr;
     95             default:
     96                 next_state = `EMRG;
     97         endcase
     98     always @(posedge clk or negedge rst_n)
     99         if (!rst_n) begin
    100             {red_a, green_a, yellow_a} <=#1 3'b100;
    101             {red_b, green_b, yellow_b} <=#1 3'b100;
    102             end
    103         else
    104             case(state)
    105                 `EMRG:
    106                     begin
    107                         {red_a, green_a, yellow_a} <=#1 3'b100;
    108                         {red_b, green_b, yellow_b} <=#1 3'b100;
    109                     end
    110                 `AgBr:
    111                     begin
    112                         {red_a, green_a, yellow_a} <=#1 3'b010;
    113                         {red_b, green_b, yellow_b} <=#1 3'b100;
    114                     end
    115                 `AyBr:
    116                     begin
    117                         {red_a, green_a, yellow_a} <=#1 3'b001;
    118                         {red_b, green_b, yellow_b} <=#1 3'b100;
    119                     end
    120                 `ArBg:
    121                     begin
    122                         {red_a, green_a, yellow_a} <=#1 3'b100;
    123                         {red_b, green_b, yellow_b} <=#1 3'b010;
    124                     end
    125                 `ArBy:
    126                     begin
    127                         {red_a, green_a, yellow_a} <=#1 3'b100;
    128                         {red_b, green_b, yellow_b} <=#1 3'b001;
    129                     end
    130             endcase
    131 
    132 endmodule

    仿真代码:

     1 //==================================================================================================
     2 //  Filename      : TB.v
     3 //  Created On    : 2016-06-19 10:05:43
     4 //  Last Modified : 2016-06-21 21:03:59
     5 //  Revision      : 
     6 //  Author        : christ_song
     7 //  Company       : Xidian ISN
     8 //  Email         : christsong0127@gmail.com
     9 //
    10 //  Description   : Testbench for Urban Traffic Control system
    11 //
    12 //
    13 //==================================================================================================
    14 `timescale 1ns/1ps
    15 
    16 module TB;
    17 
    18     reg clk;
    19     reg rst_n;
    20     reg        hold_n;
    21     wire       red_a;
    22     wire       green_a;
    23     wire       yellow_a;
    24     wire       red_b;
    25     wire       green_b;
    26     wire       yellow_b;
    27     wire [7:0] A_seg_l;
    28     wire [7:0] A_seg_h;
    29     wire [7:0] B_seg_l;
    30     wire [7:0] B_seg_h;
    31 
    32     UTC_top #(100) U_UTC_top
    33     (
    34         .clk(clk),
    35         .rst_n(rst_n),
    36         .hold_n(hold_n),
    37         .red_a(red_a),
    38         .green_a(green_a),
    39         .yellow_a(yellow_a),
    40         .red_b(red_b),
    41         .green_b(green_b),
    42         .yellow_b(yellow_b),
    43         .A_seg_l(A_seg_l),
    44         .A_seg_h(A_seg_h),
    45         .B_seg_l(B_seg_l),
    46         .B_seg_h(B_seg_h)
    47     );
    48 
    49     initial begin
    50         clk = 0;
    51         rst_n = 1;
    52         hold_n = 1;
    53         #30
    54         sys_rst(100);
    55         repeat(5) hold;
    56         #10000;
    57         $stop;
    58     end
    59 
    60     always #5 clk = ~clk;
    61 
    62     task sys_rst;
    63         input  [10:0] rst_time;   //调用task的时候,将参数赋值给rst_time
    64         begin
    65             rst_n = 0;
    66             #rst_time;
    67             rst_n = 1;
    68         end
    69     endtask
    70 
    71     task hold;
    72         integer i,hold_time;
    73         begin
    74             i = 5000000 + $random % 500;
    75             hold_time = 10000 + $random % 1000;
    76             #i 
    77                 hold_n = 0;
    78             #hold_time;
    79             hold_n = 1;
    80         end
    81     endtask
    82 
    83 endmodule

     

    posted on 2016-06-30 16:00 christ0127 阅读( ...) 评论( ...) 编辑 收藏

    转载于:https://www.cnblogs.com/christsong/p/5629643.html

    展开全文
  • 交通灯原理图绘制及PCB板设计.pdf
  • 城乡交通灯控制系统电路设计 [日期:2005-2-1] 来源:国外电子元器件 作者:章家岩 谢富春 [字体:大 中 小] ...城市交通控制系统是用于城市交通数据监测、交通信号灯控制与交通疏导的计算机综合管理系统,它
  • 微机原理
  • 靠的就是交通信号灯的自动指挥系统。 设计功能描述: 1、采用51单片机作为主控单元; 2、采用74HC245芯片驱动数码管; 3、采用数码管显示倒计时时间; 4、东西和南北方向各有两个数码管,分别显示时间,...
  • 基于单片机的智能交通灯控制系统的设计

    千次阅读 热门讨论 2022-01-15 10:07:48
    通过对定时器的设置和中断的控制,实现交通信号灯的功能。本设计引入了车流量检测,通过在地面铺设环形线圈传感器,测量车辆通过数量,检测车流量的大小,来自动调节红绿灯的显示时间。还设置了按键模块,在紧急情况...
  • 交通信号灯电路图

    2015-05-04 22:27:32
    交通信号灯控制系统 protues文件 电路图

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,084
精华内容 1,233
热门标签
关键字:

交通信号灯控制系统原理