交通信号灯控制系统

一、设计一个主干道和支干道十字路口的交通信号灯控制电路,技术要求:
1.一般情况下,保持主干道畅通,主干道绿、支干道红,且主干道绿灯亮时间不少于60S。
2.主干道绿灯亮超过60s,且支干道有车时,主干道红、支干道绿,但支干道绿灯亮时间不超过30s。
3.每次主干道或支干道绿灯变红灯时,黄灯先亮5s。

module Traffic_RTL(
/*输入输出端口描述*/
input CLK,S,RESET,
output reg HG,HY,HR,FG,FY,FR);

//声明系统内部的信号变量及其类型
reg [3:0] TimeH,TimeL;
wire TL,TS,TY;
reg ST;
reg [1:0] CurrentState,NextState;
parameter S0=2'b00,S1=2'b01,S2=2'b11,S3=2'b10;

/*控制单元状态转换描述*/
always@(posedge CLK or negedge RESET)
  begin:statereg
    if(~RESET)
	  CurrentState<=S0;
	  else CurrentState<=NextState;
  end//statereg
  
always@(S or CurrentState or TL or TS or TY)
  begin:fsm
    case(CurrentState)
	   S0:begin
		     NextState=(TL&&S)?S1:S0;
			  ST=(TL&&S)?1:0;
			end
	   S1:begin
		     NextState=(TY)?S2:S1;
			  ST=(TY)?1:0;
			end
		S2:begin
		     NextState=(TS||~S)?S3:S2;
			  ST=(TS||~S)?1:0;
			end
	   S3:begin
		     NextState=(TY)?S0:S3;
			  ST=(TY)?1:0;
			end
    endcase
	end//fsm
	
	
/*定时器工作描述*/
always@(posedge CLK or negedge RESET)
  begin:counter
    if(~RESET)
	   {TimeH,TimeL}<=8'b0;
	 else if(ST)
	        {TimeH,TimeL}<=8'b0;
	 else if((TimeH==5)&(TimeL==9))
	        begin {TimeH,TimeL}<={TimeH,TimeL}; end
	 else if(TimeL==9)
	        begin TimeH<=TimeH+1;TimeL<=0; end
	 else
           begin TimeH<=TimeH;TimeL<=TimeL+1; end
			
	end//counter
assign TY=(TimeH==0)&(TimeL==4);
assign TS=(TimeH==2)&(TimeL==9);
assign TL=(TimeH==5)&(TimeL==9);

/*输出译码电路描述*/
always@(CurrentState)
begin
  case(CurrentState)
  	   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
endmodule

二、设计一个东西方向和南北方向十字路口的交通信号灯控制电路,技术要求:
1.东西方向和南北方向各有4盏灯,分别为左拐灯、绿灯、黄灯和红灯。
2.东西方向信号灯的时间为:红灯55s,黄灯5s,绿灯40s,左拐灯15s;南北方向信号灯的时间为:红灯65s,黄灯5s,绿灯30s,左拐灯15s。
在这里插入图片描述
在这里插入图片描述
程序

module traffic(        
  input                         clk,
  input                         rst_n,
  output reg [3:0]              ew_rgyl,//东西向路灯状况
  output reg [3:0]              sn_rgyl,//南北向路灯状况
  output reg [6:0]              ew_t,
  output reg [6:0]              sn_t
);                           
                              
  parameter  EW_R_T     = 7'd54;
  parameter  EW_G_T     = 7'd39;
  parameter  EW_Y_T     = 7'd4;
  parameter  EW_L_T     = 7'd14;
  parameter  SN_R_T     = 7'd64;
  parameter  SN_G_T     = 7'd29;
  parameter  SN_Y_T     = 7'd4;
  parameter  SN_L_T     = 7'd14;
  localparam EW_G_ST    = 4'd0;
  localparam EW_Y1_ST   = 4'd1;
  localparam EW_L_ST    = 4'd2;
  localparam EW_Y2_ST   = 4'd3;
  localparam SN_G_ST    = 4'd4;
  localparam SN_Y1_ST   = 4'd5;
  localparam SN_L_ST    = 4'd6;
  localparam SN_Y2_ST   = 4'd7;

  reg  [3:0]                    tl_state_next;

 //tl_state_next  
  always@(posedge clk or negedge rst_n) begin
   if(!rst_n) 
     tl_state_next <=EW_G_ST;
   else begin
    case(tl_state_next)
    EW_G_ST:begin
      if(ew_t == 7'd0)
        tl_state_next <= EW_Y1_ST;
      else 
        tl_state_next <= EW_G_ST;
     end
     EW_Y1_ST:begin
      if(ew_t == 7'd0)
        tl_state_next <= EW_L_ST;
      else 
        tl_state_next <= EW_Y1_ST;
     end
    EW_L_ST:begin
      if(ew_t == 7'd0)
        tl_state_next <= EW_Y2_ST;
      else 
        tl_state_next <= EW_L_ST;
     end
    EW_Y2_ST:begin
      if(ew_t == 7'd0)
        tl_state_next <= SN_G_ST;
      else 
        tl_state_next <= EW_Y2_ST;
     end
    SN_G_ST:begin
      if(sn_t == 7'd0)
        tl_state_next <= SN_Y1_ST;
      else 
        tl_state_next <= SN_G_ST;
     end
    SN_Y1_ST:begin
      if(sn_t == 7'd0)
        tl_state_next <= SN_L_ST;
      else 
        tl_state_next <= SN_Y1_ST;
     end
    SN_L_ST:begin
      if(sn_t == 7'd0)
        tl_state_next <= SN_Y2_ST;
      else 
        tl_state_next <= SN_L_ST;
     end
    SN_Y2_ST:begin
      if(sn_t == 7'd0)
        tl_state_next <= EW_G_ST;
      else 
        tl_state_next <= SN_Y2_ST;
     end
    default: 
      tl_state_next <= EW_Y1_ST;
    endcase
    end
   end
   
    //out  
  always@(posedge clk or negedge rst_n) begin
   if(!rst_n) begin
     ew_rgyl <= 4'b0100;
     sn_rgyl <= 4'b1000;
     ew_t <= EW_G_T;//40  //为什么复位的时候东西向计时器要为绿灯时长?
     sn_t <= SN_R_T;//65 //因为时间不好统计,所以将东西向计时标准设为南北向红灯时长
    end
   else begin
    case(tl_state_next)
    EW_G_ST:begin
      if(ew_t == 7'd0) begin 
        ew_rgyl <= 4'b0010;
        sn_rgyl <= 4'b1000; 
        ew_t <= EW_Y_T;
        sn_t <= sn_t - 1'd1;
       end
      else begin
        ew_rgyl <= 4'b0100;
        sn_rgyl <= 4'b1000;
        ew_t <= ew_t - 1'd1;//40
        sn_t <= sn_t - 1'd1;//65
       end
     end
    EW_Y1_ST:begin
      if(ew_t == 7'd0) begin 
        ew_rgyl <= 4'b0001;
        sn_rgyl <= 4'b1000;
        ew_t <= EW_L_T;
        sn_t <= sn_t - 1'd1;
       end
      else begin
        ew_rgyl <= 4'b0010;
        sn_rgyl <= 4'b1000;
        ew_t <= ew_t - 1'd1;//5
        sn_t <= sn_t - 1'd1;//65
       end
     end
    EW_L_ST:begin
      if(ew_t == 7'd0) begin 
        ew_rgyl <= 4'b0010;
        sn_rgyl <= 4'b1000;
        ew_t <= EW_Y_T;
        sn_t <= sn_t - 1'd1;
       end
      else begin
        ew_rgyl <= 4'b0001;
        sn_rgyl <= 4'b1000;
        ew_t <= ew_t - 1'd1;//15
        sn_t <= sn_t - 1'd1;//65
       end
     end
    EW_Y2_ST:begin
      if(ew_t == 7'd0) begin 
        ew_rgyl <= 4'b1000;
        sn_rgyl <= 4'b0100;
        ew_t <= EW_R_T;
        sn_t <= SN_G_T;
       end
      else begin
        ew_rgyl <= 4'b0010;
        sn_rgyl <= 4'b1000;
        ew_t <= ew_t - 1'd1;//5
        sn_t <= sn_t - 1'd1;//65
       end
     end
	  
	  //南北向
    SN_G_ST:begin
      if(sn_t == 7'd0) begin 
        ew_rgyl <= 4'b1000;
        sn_rgyl <= 4'b0010;
        ew_t <= ew_t - 1'd1; 
        sn_t <= SN_Y_T;
       end
      else begin
        ew_rgyl <= 4'b1000;
        sn_rgyl <= 4'b0100;
        ew_t <= ew_t - 1'd1;//55
        sn_t <= sn_t - 1'd1;//30
       end
     end
    SN_Y1_ST:begin
      if(sn_t == 7'd0) begin
        ew_rgyl <= 4'b1000;
        sn_rgyl <= 4'b0001;
        ew_t <= ew_t - 1'd1;
        sn_t <= SN_L_T;
       end
      else begin
        ew_rgyl <= 4'b1000;
        sn_rgyl <= 4'b0010;
        ew_t <= ew_t - 1'd1;//55
        sn_t <= sn_t - 1'd1;//5
       end
     end
    SN_L_ST:begin
      if(sn_t == 7'd0) begin
        ew_rgyl <= 4'b1000;
        sn_rgyl <= 4'b0010;
        ew_t <= ew_t - 1'd1;
        sn_t <= SN_Y_T;
       end
      else begin
        ew_rgyl <= 4'b1000;
        sn_rgyl <= 4'b0001;
        ew_t <= ew_t - 1'd1;//55
        sn_t <= sn_t - 1'd1;//15
       end
     end
    SN_Y2_ST:begin
     if(sn_t == 7'd0) begin
        ew_rgyl <= 4'b0100;
        sn_rgyl <= 4'b1000;
        ew_t <= EW_G_T;
        sn_t <= SN_R_T;
       end
      else begin
        ew_rgyl <= 4'b1000;
        sn_rgyl <= 4'b0010;
        ew_t <= ew_t - 1'd1;//55
        sn_t <= sn_t - 1'd1;//5
       end
     end
    default: begin
        ew_rgyl <= 4'b0100;
        sn_rgyl <= 4'b1000;
        ew_t <= EW_G_T;
        sn_t <= SN_R_T;
       end
    endcase
    end
   end
endmodule
  • 4
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值