基于FPGA的交通灯设计与实现

EDA工具:Modelsim and Vivado
##一、产品要求:
在这里插入图片描述
该控制器用于主干道和支道公路交叉口,优先保证主干道通行,平时处于"主干道绿灯,支道红灯"状态,支道有车辆要穿过主干道时,信号灯改为"主干道红灯,支道绿灯",支道无车辆时,信号灯返回"主干道绿灯,支道红灯"状态。如果支道始终有车,按普通信号灯处理。主干道和支道每次通行时间不得短于30s,两个状态交换之间有"主黄,支红"和"主红,支黄"的中间状态,持续时间均为4s。支道是否来车用开关代替,交通信号灯用LED代替。

##二、代码设计:

module traffic_ctrl(
    input sys_clk,
    input sys_rst_n,
    input bypass_car,
    output reg main_light,
    output reg bypass_light

);
//wire sys_rst_n;
//assign sys_rst_n = 1'b1;
parameter S0 = 2'b00;
parameter S1 = 2'b01;
parameter S2 = 2'b11;
parameter S3 = 2'b10;
/**************************实际测试数据*********************************************************/
//parameter CLK_CNT    = 32'B1100_1010_1010_0111_1110_0010_0000_0000;//68s
//parameter YELLOW_CNT = 25'B1_0111_1101_0111_1000_0100_0000;
/**************************缩小1000000倍后的用于仿真测试数据**************************************/
parameter CLK_CNT    = 35'd3400;
parameter YELLOW_CNT = 25'd25;

reg [31:0]clk_cnt;
reg [24:0]yellow_cnt;
wire red;
reg yellow;
wire green;
assign red   = 1'b1;
assign green = 1'b0;

always@(posedge sys_clk or negedge sys_rst_n)begin
    if(!sys_rst_n||!bypass_car)
        yellow_cnt <= 25'b0;
    else if(yellow_cnt == YELLOW_CNT - 1)begin
        yellow <= ~yellow;
        yellow_cnt <= 25'b0;
        end
    else
        yellow_cnt <= yellow_cnt + 1'b1; 
end

//计数模块
always@(posedge sys_clk or negedge sys_rst_n)begin
    if(!sys_rst_n||!bypass_car)
        clk_cnt <= 32'b0;
    else if(clk_cnt==CLK_CNT-1)
        clk_cnt <= 32'b0;
    else
         clk_cnt <= clk_cnt + 1'b1;
end
reg [1:0]curr_st;
reg [1:0]next_st;

//状态机之一段
always@(posedge sys_clk or negedge sys_rst_n)begin
    if(!sys_rst_n||!bypass_car)
      curr_st = S0;
//    else if((clk_cnt==(30*50_000_000-1))||            /* 
//            (clk_cnt==(34*50_000_000-1))||                实际时间
//            (clk_cnt==(64*50_000_000-1))||
//            (clk_cnt==(68*50_000_000-1))  )            */
/**************************缩小1000000倍后的仿真测试**************************************/
    else if((clk_cnt==(30*50_-1))||             
            (clk_cnt==(34*50_-1))||
            (clk_cnt==(64*50_-1))||
            (clk_cnt==(68*50_-1))  )
      curr_st <= next_st;
    else
        curr_st <= curr_st;
end

//状态机之二段
always@(*)begin
    case(curr_st)
        S0 : next_st = S1;
        S1 : next_st = S2;
        S2 : next_st = S3;
        S3 : next_st = S0;
        default :;
    endcase
end

//状态机之第三段
always@(posedge sys_clk or negedge sys_rst_n)begin
    if(!sys_rst_n)begin
        main_light <= green;
        bypass_light <= red;
    end
    else begin
        case(curr_st)
            S0: begin
		    	main_light <= green;
		    	bypass_light <= red;
		        end
            S1:	begin
		    	main_light <= yellow;
		    	bypass_light <= red;
		        end
            S2:	begin
		    	main_light <= red;
		    	bypass_light <= green;
		        end
            S3:	begin
		    	main_light <= green;
		    	bypass_light <= yellow;
		        end
            default:;  
        
endcase
end 
end
  

endmodule

##三、测试代码设计:

`timescale 1ns/1ps
module tb_traffic_light();

reg sys_clk;
reg sys_rst_n;
reg bypass_car;
wire main_light;
wire bypass_light;


initial begin 
    sys_clk    = 1'b1;
    sys_rst_n  = 1'b0;
    bypass_car = 1'b0;
   
end
initial begin
    #20 sys_rst_n  = 1'b1;
    #1000 bypass_car = 1'b1; 
end
always #10 sys_clk = ~sys_clk;
 traffic_ctrl u_traffic_ctrl(
    .sys_clk          (sys_clk         )  ,
    .sys_rst_n        (sys_rst_n       )  ,
    .bypass_car       (bypass_car      )  ,
    .main_light       ( main_light     )  ,
    .bypass_light     ( bypass_light   )  

);


endmodule

##四、仿真测试结果

由于仿真工具的仿真时间的考虑,本次仿真是在缩小1000_000倍的前提下进行的仿真,入下(前提采用了两个led作为测试 灯亮表示红灯 灯灭表示绿灯 黄灯表示led灯闪烁 )

为什么黄灯会变成不定态(原因:可能因为led灯反转太快 导致的 在实际情况下不存在此情况如视频中演示)

在bypass_car=1(i.g. 旁路有车)前提下
一区:相隔30000ns后进行的
二区:相隔4000ns后进行的
三区:相隔30000ns后进行的
四区:相隔4000ns后进行的
五区:返回到主车道绿灯,旁车道红灯

在这里插入图片描述

##五、上板验证结果
Led1灯表示主干道 led3表示枝干道
在这里插入图片描述
在这里插入图片描述

交通信号灯

设计任务 (一)有一条主干道和一条支干道的汇合点形成十字交叉路口,主干道为东西向,支干道为南北向。为确保车辆安全,迅速地通行,在交叉道口的每个入口处设置了红,绿,黄3色信号灯。 (二)要求: (1)主干道绿灯亮时,支干道红灯亮,反之亦然,两者交替允许通行,主干道每次放行55s,支干道每次放行25s。每次由绿灯变为红灯的过程中,黄灯亮5s作为过渡。 (2)能实现正常的倒计时显示功能。 (3)能实现总体清零功能:计数器由初始状态开始计数,对应状态的指示灯亮。 (4)能实现特殊状态的功能显示:进入特殊状态时,东西、南北路口均显示红灯状态。 Verilog HDL作为一种规范的硬件描述语言,被广泛应用于电路的设计中。利用Verilog的设计描述可被不同的工具(包括验证仿真、时序分析、测试分析以及综合)所支持,可用不同器件来实现。而可编程器件的广泛应用,为数字系统的设计带来了极大的灵活性。由于可编程器件可以通过软件编程对硬件的结构和工作方式进行重构,使得硬件的设计可以如同软件设计那样快捷方便。 本文用Verilog HDL设计了一个交通灯控制系统,主干道交通灯按绿-黄-红变化,支干道交通灯按红-绿-黄变化。设计采用了自顶向下的设计方法,首先根据功能将电路分为div(包括div1和div2)、counter、controller、Fenwei(包括Fenwei1和Fenwei2)、demx模块,然后针对每个模块进行开发。利用QuartusII6.0中的仿真工具对每个模块进行仿真,保证功能正确。在此基础上,将所有模块连接起来,形成完整的设计,并用QuartusII6.0中的仿真工具再次仿真。仿真结果表明功能正确,符合设计要求。最后利用QuartusII6.0将程序下载到Altera FPGA芯片EP1C3T144C8中,实际结果表明电路工作正常,满足了设计要求。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值