交通信号灯控制系统

发布时间:2025-12-09 19:52:23 浏览次数:4

一、设计一个主干道和支干道十字路口的交通信号灯控制电路,技术要求:
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:stateregif(~RESET)CurrentState<=S0;else CurrentState<=NextState;end//stateregalways@(S or CurrentState or TL or TS or TY)begin:fsmcase(CurrentState)S0:beginNextState=(TL&&S)?S1:S0;ST=(TL&&S)?1:0;endS1:beginNextState=(TY)?S2:S1;ST=(TY)?1:0;endS2:beginNextState=(TS||~S)?S3:S2;ST=(TS||~S)?1:0;endS3:beginNextState=(TY)?S0:S3;ST=(TY)?1:0;endendcaseend//fsm/*定时器工作描述*/always@(posedge CLK or negedge RESET)begin:counterif(~RESET){TimeH,TimeL}<=8'b0;else if(ST){TimeH,TimeL}<=8'b0;else if((TimeH==5)&(TimeL==9))begin {TimeH,TimeL}<={TimeH,TimeL}; endelse if(TimeL==9)begin TimeH<=TimeH+1;TimeL<=0; endelsebegin TimeH<=TimeH;TimeL<=TimeL+1; endend//counterassign TY=(TimeH==0)&(TimeL==4);assign TS=(TimeH==2)&(TimeL==9);assign TL=(TimeH==5)&(TimeL==9);/*输出译码电路描述*/always@(CurrentState)begincase(CurrentState)S0:begin{HG,HY,HR}=3'b100;{FG,FY,FR}=3'b001;endS1:begin{HG,HY,HR}=3'b010;{FG,FY,FR}=3'b001;endS2:begin{HG,HY,HR}=3'b001;{FG,FY,FR}=3'b100;endS3:begin{HG,HY,HR}=3'b001;{FG,FY,FR}=3'b010;endendcaseendendmodule

二、设计一个东西方向和南北方向十字路口的交通信号灯控制电路,技术要求:
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) beginif(!rst_n) tl_state_next <=EW_G_ST;else begincase(tl_state_next)EW_G_ST:beginif(ew_t == 7'd0)tl_state_next <= EW_Y1_ST;else tl_state_next <= EW_G_ST;endEW_Y1_ST:beginif(ew_t == 7'd0)tl_state_next <= EW_L_ST;else tl_state_next <= EW_Y1_ST;endEW_L_ST:beginif(ew_t == 7'd0)tl_state_next <= EW_Y2_ST;else tl_state_next <= EW_L_ST;endEW_Y2_ST:beginif(ew_t == 7'd0)tl_state_next <= SN_G_ST;else tl_state_next <= EW_Y2_ST;endSN_G_ST:beginif(sn_t == 7'd0)tl_state_next <= SN_Y1_ST;else tl_state_next <= SN_G_ST;endSN_Y1_ST:beginif(sn_t == 7'd0)tl_state_next <= SN_L_ST;else tl_state_next <= SN_Y1_ST;endSN_L_ST:beginif(sn_t == 7'd0)tl_state_next <= SN_Y2_ST;else tl_state_next <= SN_L_ST;endSN_Y2_ST:beginif(sn_t == 7'd0)tl_state_next <= EW_G_ST;else tl_state_next <= SN_Y2_ST;enddefault: tl_state_next <= EW_Y1_ST;endcaseendend//out always@(posedge clk or negedge rst_n) beginif(!rst_n) beginew_rgyl <= 4'b0100;sn_rgyl <= 4'b1000;ew_t <= EW_G_T;//40 //为什么复位的时候东西向计时器要为绿灯时长?sn_t <= SN_R_T;//65 //因为时间不好统计,所以将东西向计时标准设为南北向红灯时长endelse begincase(tl_state_next)EW_G_ST:beginif(ew_t == 7'd0) begin ew_rgyl <= 4'b0010;sn_rgyl <= 4'b1000; ew_t <= EW_Y_T;sn_t <= sn_t - 1'd1;endelse beginew_rgyl <= 4'b0100;sn_rgyl <= 4'b1000;ew_t <= ew_t - 1'd1;//40sn_t <= sn_t - 1'd1;//65endendEW_Y1_ST:beginif(ew_t == 7'd0) begin ew_rgyl <= 4'b0001;sn_rgyl <= 4'b1000;ew_t <= EW_L_T;sn_t <= sn_t - 1'd1;endelse beginew_rgyl <= 4'b0010;sn_rgyl <= 4'b1000;ew_t <= ew_t - 1'd1;//5sn_t <= sn_t - 1'd1;//65endendEW_L_ST:beginif(ew_t == 7'd0) begin ew_rgyl <= 4'b0010;sn_rgyl <= 4'b1000;ew_t <= EW_Y_T;sn_t <= sn_t - 1'd1;endelse beginew_rgyl <= 4'b0001;sn_rgyl <= 4'b1000;ew_t <= ew_t - 1'd1;//15sn_t <= sn_t - 1'd1;//65endendEW_Y2_ST:beginif(ew_t == 7'd0) begin ew_rgyl <= 4'b1000;sn_rgyl <= 4'b0100;ew_t <= EW_R_T;sn_t <= SN_G_T;endelse beginew_rgyl <= 4'b0010;sn_rgyl <= 4'b1000;ew_t <= ew_t - 1'd1;//5sn_t <= sn_t - 1'd1;//65endend//南北向SN_G_ST:beginif(sn_t == 7'd0) begin ew_rgyl <= 4'b1000;sn_rgyl <= 4'b0010;ew_t <= ew_t - 1'd1; sn_t <= SN_Y_T;endelse beginew_rgyl <= 4'b1000;sn_rgyl <= 4'b0100;ew_t <= ew_t - 1'd1;//55sn_t <= sn_t - 1'd1;//30endendSN_Y1_ST:beginif(sn_t == 7'd0) beginew_rgyl <= 4'b1000;sn_rgyl <= 4'b0001;ew_t <= ew_t - 1'd1;sn_t <= SN_L_T;endelse beginew_rgyl <= 4'b1000;sn_rgyl <= 4'b0010;ew_t <= ew_t - 1'd1;//55sn_t <= sn_t - 1'd1;//5endendSN_L_ST:beginif(sn_t == 7'd0) beginew_rgyl <= 4'b1000;sn_rgyl <= 4'b0010;ew_t <= ew_t - 1'd1;sn_t <= SN_Y_T;endelse beginew_rgyl <= 4'b1000;sn_rgyl <= 4'b0001;ew_t <= ew_t - 1'd1;//55sn_t <= sn_t - 1'd1;//15endendSN_Y2_ST:beginif(sn_t == 7'd0) beginew_rgyl <= 4'b0100;sn_rgyl <= 4'b1000;ew_t <= EW_G_T;sn_t <= SN_R_T;endelse beginew_rgyl <= 4'b1000;sn_rgyl <= 4'b0010;ew_t <= ew_t - 1'd1;//55sn_t <= sn_t - 1'd1;//5endenddefault: beginew_rgyl <= 4'b0100;sn_rgyl <= 4'b1000;ew_t <= EW_G_T;sn_t <= SN_R_T;endendcaseendendendmodule
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477