基于FPGA的交通信号灯设计(二)

这篇具有很好参考价值的文章主要介绍了基于FPGA的交通信号灯设计(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

详细设计及实现

根据要求,我们可以用典型时序状态机实现功能,共有六个大的状态,现设定:

S0: 四个方向的红灯全亮

S1: 东、西方向绿灯亮,南、北方向红灯亮

S2:东、西方向黄灯闪烁,南、北方向红灯亮

S3:东、西方向红灯亮,南、北方向绿灯亮

S4:东、西方向红灯亮,南、北方向黄灯闪烁

S5:东、西、南、北四个方向的红灯亮

整体控制状态图如下:

基于FPGA的交通信号灯设计(二),fpga开发,fpga

图1 整体功能状态机

此状态机是该设计的核心模块,由其控制着东、西、南、北方向的交通。仔细分析设计要求可知,东西方向交通灯状态变化相同,南北方向亦相同,故实际上只需控制两组交通灯,所以状态机有六个输出变量,分别控制东西、南北方向的红、绿、黄灯的亮灭状态。另外,状态机还有三个输入变量,分别为复位信号、紧急状况控制信号、时钟信号。

由于在vhdl语言中,同一个进程内只能有一个时钟,所以紧急信号宜以电平来触发。但实验要求通过单脉冲来控制紧急信号,为了解决这个矛盾,可以设计一个边沿触发的紧急信号发生器,当输入一个单脉冲时,输出电平为高,即进入紧急状态;再输入一单脉冲,输出电平为低,解除紧急状态。

为了控制各个状态持续的时间,需在状态机中设置计时装置。可将输入状态机的时钟信号的频率设计为1Hz,即一个脉冲周期为1s。由于实际试验中,给定的实验器材频率都很大,从Khz到MHz,在这里采用50MHz,这样就只需要计数器来分频。此外,复位信号利用高低电平来控制,当电平为高时,状态机保持东、西、南、北四个方向红灯均亮的状态,若为低则由初始状态进入状态循环。

综上所述,可得总体设计结构框图如下:

基于FPGA的交通信号灯设计(二),fpga开发,fpga

图2 总体设计结构框图

clk为输入时钟(用于计时,由计数器分频后提供);

reset为复位信号,与计数器的复位信号连接在一起,由一个电平开关控制;

hold为紧急信号(由紧急信号发生器控制);

输出变量red1、green1、yellow1控制东西方向红、绿、黄交通灯的亮灭状态;南北方向则由red2、green2、yellow2控制。

部分模块结构图如下:

基于FPGA的交通信号灯设计(二),fpga开发,fpga

图2 控制模块结构图

基于FPGA的交通信号灯设计(二),fpga开发,fpga

图3 时钟分频模块
基于FPGA的交通信号灯设计(二),fpga开发,fpga
图4 数码管显示模块结构图

状态机

状态机用于控制十字路口交通灯的状态变化。此模块中我设计的是异步复位和异步等待(即进入紧急状态),复位信号是低电平有效,紧急信号是高电平有效。另外,为了控制各个状态的持续时间,此状态机中还设计了一个计数装置,用于计时。

状态SO持续时间为1s,由于输入状态机的时钟频率为1Hz,即一个脉冲持续时间为1s,所以在计数为0~1内状态机为S0状态。同理,在计数为1~31内,为S1状态;在计数为31~36内,为S2状态;S3状态所处的计数范围为36~56;S4状态所处的计数范围为56~61。

状态机部分代码如下:

ENTITY state_machine IS
PORT(
    clk,reset_n,hold,clk_1hz,select_model:     IN STD_LOGIC;       --clk为50M时钟信号,hold为紧急信号,reset为复位信号
    second_count_ge_out: OUT std_logic_vector(3 downto 0);--秒的个位
    second_count_shi_out:OUT std_logic_vector(3 downto 0);--秒的十位
    red1_out,green1_out,yellow1_out:OUT STD_LOGIC; --控制东西方向的交通灯
    red2_out,green2_out,yellow2_out:OUT STD_LOGIC);--控制南北方向的交通灯
END;

ARCHITECTURE state_machine_function OF state_machine IS
TYPE states IS(s0,s1,s2,s3,s4);
SIGNAL next_state:states;    


signal red1:        std_logic;
signal red2:        std_logic;
signal green1:        std_logic;
signal green2:        std_logic;
signal yellow1:        std_logic;
signal yellow2:        std_logic;
signal second_count_ge:  std_logic_vector(3 downto 0);--秒的个位
signal second_count_shi: std_logic_vector(3 downto 0);--秒的十位
signal second_count_ge_reg:  std_logic_vector(3 downto 0);--秒的个位
signal second_count_shi_reg: std_logic_vector(3 downto 0);--秒的十位
signal second_count_ge_model:  std_logic_vector(3 downto 0);--秒的个位
signal second_count_shi_model: std_logic_vector(3 downto 0);--秒的十位
BEGIN
    red1_out<= red1;
    red2_out<= red2;
    green1_out<= green1;
    green2_out<= green2;
    yellow1_out<= yellow1;
    yellow2_out<= yellow2;
    
    second_count_ge_out<=second_count_ge_reg;
    second_count_shi_out<=second_count_shi_reg;
    
    process(clk_1hz,reset_n)
      begin 
        if(reset_n = '0')then
            second_count_ge_reg<="0000";
            second_count_shi_reg<="0000";
        elsif(clk_1hz'event and clk_1hz = '1')then--上升沿触发
            second_count_ge_reg<=second_count_ge;
            second_count_shi_reg<=second_count_shi;
        end if;
    end process;
    process(select_model)
      begin 
        if(select_mode = '1')then--白天模式
            second_count_ge_model1<="1001";--主干道30秒
            second_count_shi_model1<="0010";
            
            second_count_ge_model2<="1001";--次干道20秒
            second_count_shi_model2<="0001";
        else--夜晚模式
            second_count_ge_model1<="1001";--主干道20秒
            second_count_shi_model1<="0010";
            
            second_count_ge_model2<="1010";--次干道10秒
            second_count_shi_model2<="0000";
        end if;
    end process;
-- /**********************************************************/
-- //控制模块
-- //
-- /**********************************************************/
     PROCESS(reset_n,hold,clk_1hz)
     VARIABLE countnum:INTEGER RANGE 0 TO 61;  --计数变量
     BEGIN
          IF(reset_n='0') THEN     --复位
             countnum:=0;  
             next_state<=s0;  
             red1<='1';green1<='0';yellow1<='0';
             red2<='1';green2<='0';yellow2<='0';
             
            second_count_ge <= "0001";--1
            second_count_shi <= "0000";--0
          ELSIF(hold='0') THEN   --进入紧急状态
             countnum:=0; 
             next_state<=next_state;
             red1<='1';green1<='0';yellow1<='0';
             red2<='1';green2<='0';yellow2<='0';
          ElSIF(clk_1hz'event AND clk_1hz='1') THEN
             IF(countnum>=60) THEN  --循环后又回到S1状态
               countnum:=1;
             ELSE
               countnum:=countnum+1; --计数加1
             END IF;
             
             CASE next_state IS
                WHEN s0 =>        --东西、南北方向红灯均亮
                  red1<='1';green1<='0';yellow1<='0';
                  red2<='1';green2<='0';yellow2<='0';
                  
                if(second_count_ge = "0000")then
                    second_count_ge <= "0000";--0
                else
                    second_count_ge <= second_count_ge - '1';

                end if;
                  
                  IF(countnum=1) THEN
                    next_state<=s1;
                    second_count_ge <= second_count_ge_model1;--9
                    second_count_shi <= second_count_shi_model1;--2
                  ELSIF(countnum>=0 AND countnum<1) THEN
                    next_state<=s0;
                  END IF;
              
                WHEN s1 =>    --东西方向绿灯亮,南北方向红灯亮。东西方向通车,时间30S
                  red1<='0';green1<='1';yellow1<='0';
                  red2<='1';green2<='0';yellow2<='0';
                  
                if(second_count_ge = "0000")then
                    second_count_ge <= "1001";--
                    if(second_count_shi = "0000")then
                        second_count_shi <= "0000";--0
                    else
                        second_count_shi <= second_count_shi - '1';
                    end if;
                else
                    second_count_ge <= second_count_ge - '1';
                end if;
                  
                  IF(countnum = 31) THEN
                    next_state<=s2;
                    second_count_ge <= "0100";--4
                    second_count_shi <= "0000";--0
                  ELSIF(countnum>=1 AND countnum<31) THEN
                    next_state <= s1;
                  END IF;

                WHEN s2 =>    --东西方向黄灯亮,南北方向红灯亮,时间5s。
                  red1<='0';green1<='0';yellow1<='1';  
                  red2<='1';green2<='0';yellow2<='0';
                  
                  if(second_count_ge = "0000")then
                    second_count_ge <= "0000";--0
                 else
                    second_count_ge <= second_count_ge - '1';
                 end if;
                 
                  IF(countnum=36) THEN
                    next_state<=s3;
                    second_count_ge <= second_count_ge_model2;--9
                    second_count_shi <= second_count_shi_model2;--1
                  ELSIF(countnum>=31 AND countnum<36) THEN
                    next_state<=s2;
                  END IF;

                  WHEN s3 =>   --东西方向红灯亮,南北方向绿灯亮,南北方向通车,时间20s。
                    red1<='1';green1<='0';yellow1<='0';
                    red2<='0';green2<='1';yellow2<='0';
                    
                    if(second_count_ge = "0000")then
                        second_count_ge <= "1001";--9
                        if(second_count_shi = "0000")then
                            second_count_shi <= "0000";--0

                        else
                            second_count_shi <= second_count_shi - '1';

                        end if;
                  else
                    second_count_ge <= second_count_ge - '1';

                  end if;
                    
                    IF(countnum=56) THEN
                      next_state<=s4;
                       second_count_ge <= "0100";--4
                       second_count_shi <= "0000";--0
                    ELSIF(countnum>=36 AND countnum<56) THEN
                      next_state<=s3;
                    END IF;

                  WHEN s4 =>    --东西方向红灯亮,南,北方向黄灯亮,时间5s。
                    red1<='1';green1<='0';yellow1<='0';
                    red2<='0';green2<='0';yellow2<='1';
                    
                    if(second_count_ge = "0000")then
                        second_count_ge <= "0000";--0
                    else
                        second_count_ge <= second_count_ge - '1';
                  end if;
                    
                    IF(countnum=1) THEN
                      next_state<=s1;
                      second_count_ge <= second_count_ge_model1;--9
                      second_count_shi <= second_count_shi_model1;--2
                    ELSIF(countnum>=56 AND countnum<61) THEN
                      next_state<=s4;
                    END IF;
             END CASE;
          END IF;
     END PROCESS;
    
     
END state_machine_function;

状态机的波形图如下:

基于FPGA的交通信号灯设计(二),fpga开发,fpga

初始状态为四个方向的红灯全亮,时间1秒。然后东、西方向绿灯亮,南、北方向红灯亮。东、西方向通车,时间30秒。但在此过程中,有一个紧急的信号出现,所以在大概在6秒左右,出现紧急信号,东西南北方向红灯都亮。在11秒左右解除紧急信号,仿真图中恢复S1的状态。经验证,图中均符合题目要求。文章来源地址https://www.toymoban.com/news/detail-856342.html

到了这里,关于基于FPGA的交通信号灯设计(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于51单片机的交通信号灯设计

    简介 1.本系统采用STC89C51单片机以及单片机最小系统和74HC245电路以及外围的按键和数码管显示等部件,设计一个基于单片机的交通灯设计。设计通过两位一体共阴极数码管显示,并能通过按键对定时进行设置,而且具有蜂鸣器提示。 2、本设计拟实现的性能指标如下: 设在十

    2024年02月04日
    浏览(41)
  • 基于Proteus仿真的交通信号灯设计——利用汇编语言实现

    基本信息 采用AT89C51单片机 晶振频率:12MHZ 红绿灯:发光二极管 数字显示:LED数码管 东西南北四个方向,一次循环共有六个状态,且每个状态的倒计时时间一样 交通状态 东西红灯22s,南北绿灯22s(数码管从0到21); 东西红灯5s,南北绿灯5s且没0.5s闪烁一次(数码管从0到4);

    2024年02月09日
    浏览(55)
  • 基于AT89C52单片机的交通信号灯设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87772657 源码获取 主要内容: 本次设计所提出的一种基于单片机技术的简易计算器的方案,能更好的解决计算机计算的问题,随着数字生活的到来,单片机在生活中越来越重要,它能将大量的逻辑功

    2024年02月10日
    浏览(63)
  • Verilog设计交通信号灯

    目录 一、设计要求 二、模块总和 三、模块设计 1.顶层模块 2.分频模块 3.计数模块 4.状态机模块 5.倒计时模块 6.数码显示模块 7.约束代码 四、引脚分配 五、板上测试 总结 1.利用 NEXYS4 DDR 开发板设计一款交通灯控制系统,能够显示红、黄、绿灯; 2.交通灯控制系统具有秒表倒

    2024年02月12日
    浏览(46)
  • 【论文笔记】IntelliLight智能交通灯:一种基于强化学习的智能交通信号灯控制方法

    博客声明:本文仅为个人论文阅读笔记,大部分原文对照的中文为翻译而来,只对其中错误明显的部分作了修改。其他一些个人理解不到位或有误的地方也尽请见谅。 标题原文: IntelliLight:A Reinforcement Learning Approach for Intelligent Traffic Light Control 论文来源: Proceedings of the 24

    2024年04月12日
    浏览(61)
  • 交通信号灯课程设计(红绿灯)

    一、设计指标 1.1对设计课题进行简要阐述        由一条主干道和一条支干道的汇合点形成十字交叉路口,为确保车辆安全、迅速地通行,在交叉路口的每个人口处设置了红、绿、黄三色信号灯。        (1)用红、绿、黄三色发光二极管作信号灯,用传感器或逻辑开关

    2024年02月09日
    浏览(53)
  • Verilog设计实例(二):交通信号灯设计实例

    本文为Verilog实例开发的第二弹,缺少Verilog代码练手或者有些生疏的可以在这里参考一些设计实例进行练习。 本系列导航: Verilog设计实例(一):自动售货机设计实例 设计一个交通灯控制电路,红灯30s后转为绿灯。共x,y方向两组交通灯,每组红绿灯各一个,红灯亮30s,绿

    2024年02月03日
    浏览(87)
  • 数电课程设计——课设二:交通信号灯

     一、实验内容 (1)十字路口有 x、y 方向两组交通信号灯,每组有红、黄、绿灯各一个; (2)设计一个交通灯控制电路,模拟十字路口交通灯工作情况,红灯亮 35s,黄灯亮 5s,绿 灯亮 30s; (3)设系统时钟频率为 50MHz,要求用数码管显示计时结果; (4)掌握 Verilog HDL 的

    2024年02月09日
    浏览(52)
  • 基于单片机的交通信号灯控制

    目录 一、方案流程及技术规格书设计 二、系统硬件电路设计 三、系统软件设计 四、系统调试测试与分析 前言        伴随着越来越多的家用小轿车的出现,道路安全问题也越来越被人们重视,当今,红绿灯也被安装在各个路口,来规范人们的驾驶习惯,红灯停,绿灯行的

    2024年02月03日
    浏览(40)
  • 基于51单片机的交通信号灯

    本设计学校的一次单片机实训。 利用51单片机控制各个路口红绿灯及时间显示。 1、题目要求 1、各个路口红绿灯亮灭的规则,暂不考虑左转方向; 2、倒计时的实现,利用单片机的定时器进行计数得到秒信号; 3、时间显示:东西南北四个方向的时间一致,当东西方向为60秒绿

    2024年01月24日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包