交通灯信号控制器


module Traffic_led_controller(
//Global 
input sys_clk,
input sys_rst_n,

//
input [1:0] sw,			//2 bits switch to control four states of vehicles



//
output R1,G1,Y1,		//main road traffic light
output R2,G2,Y2			//trunk road traffic light
	

	);
//

reg [5:0] led_reg;
assign G1 = led_reg[5];
assign R1 = led_reg[4];
assign Y1 = led_reg[3];
assign G2 = led_reg[2];
assign R2 = led_reg[1];
assign Y2 = led_reg[0];




//
parameter time_cycle1 = 45;//main road release time
parameter time_cycle2 = 25;//trunk road release time
parameter time_cycle3 = 5; //yellow light time

//Three-stage state machine

reg [3:0] current_state;
reg [3:0] next_state;


reg state_change_flag;  //状态转移标志位,同时作为黄灯亮标志位
reg [1:0]state_alt; //表示在“有有”时,交替同行状态  主干道-> 支路 支路->主干道

parameter IDLE = 4'b0001;  //无无
parameter S1 = 4'b0010;		//无有
parameter S2 = 4'b0100;		//有无
parameter S3 = 4'b1000;		//有有
//三段式状态机第一步:时序逻辑实现状态转移
always @(posedge sys_clk or negedge sys_rst_n) begin
	if (!sys_rst_n) begin
		current_state <= IDLE;
	end
	else begin
		current_state <= next_state;
	end
end

//组合逻辑描述状态转移条件
always @(*) begin
	if (!sys_rst_n) begin
		next_state = IDLE;
	end
	else begin
		case(current_state)
			IDLE: begin
				if (sw == 2'b00) begin
					next_state = IDLE;
				end
				else if (sw == 2'b01) begin
					next_state = S1;
				end
				else if (sw == 2'b10) begin
					next_state = S2;
				end
				else if (sw == 2'b11) begin
					next_state = S3;

				end				
			end
			S1:begin
				if (sw == 2'b00) begin
					next_state = IDLE;
				end
				else if (sw == 2'b01) begin
					next_state = S1;
				end
				else if (sw == 2'b10) begin
					next_state = S2;
				end
				else if (sw == 2'b11) begin
					next_state = S3;
				end				
			end
			S2:begin
				if (sw == 2'b00) begin
					next_state = IDLE;
				end
				else if (sw == 2'b01) begin
					next_state = S1;
				end
				else if (sw == 2'b10) begin
					next_state = S2;		
				end
				else if (sw == 2'b11) begin
					next_state = S3;
				end				
			end
			S3:begin
				if (sw == 2'b00) begin
					next_state = IDLE;
				end
				else if (sw == 2'b01) begin
					next_state = S1;
				end
				else if (sw == 2'b10) begin
					next_state = S2;				
				end
				else if (sw == 2'b11) begin
					next_state = S3;
				end			
			end
			default: next_state = IDLE;
		endcase
	end
end


//状态机第三步:时序逻辑描述输出

reg [6:0] G_time_cnt;  //green light time count 用于“有有状态”
reg [5:0] Y_time_cnt;   //yellow light time count 用于前三个状态

//第四个状态的绿灯黄灯计数器
always @(posedge sys_clk or negedge sys_rst_n) begin
	if (!sys_rst_n) begin
		G_time_cnt <= time_cycle1 + time_cycle2 + time_cycle3 + time_cycle3;
		state_alt <= 2'b00;
	end
	else if (state_change_flag == 1'b0)begin
		if (G_time_cnt > 7'd0) begin
			G_time_cnt <= G_time_cnt - 1'b1;
			if (G_time_cnt == time_cycle2 + 2 * time_cycle3) begin
				state_alt <= 2'b01;
			end
			else if (G_time_cnt == time_cycle2 + time_cycle3)begin
				state_alt <= 2'b10;
			end
			else if (G_time_cnt == time_cycle3) begin
				state_alt <= 2'b11;
			end
		end
		else if (G_time_cnt == 7'd0) begin
			state_alt <= 2'b00;
			G_time_cnt <= time_cycle1 + time_cycle2 + 2* time_cycle3;
		end
	end
end


//前三个状态的黄灯计数器
always @(posedge sys_clk or negedge sys_rst_n) begin
	if (!sys_rst_n) begin
		Y_time_cnt <= time_cycle3;
	end
	else if (state_change_flag == 1'b1 )begin
		if (Y_time_cnt > 6'd0) 
			Y_time_cnt <= Y_time_cnt - 1'b1;
		else if (Y_time_cnt == 6'd0)begin
			Y_time_cnt <= time_cycle3;
			// state_change_flag <= ~state_change_flag;
		end
	end
end


//state_change_flag 变化
always @(*) begin
	if (!sys_rst_n) begin
		state_change_flag = 1'b0;
	end
	else if (Y_time_cnt == 6'd0 && state_change_flag == 1'b1) begin
		state_change_flag <= ~state_change_flag;
	end
	else begin
		case(next_state)
			IDLE: begin
				if (current_state == IDLE || current_state == S2 || current_state == S3) begin
					state_change_flag = state_change_flag;
				end
				else if (current_state == S1) begin
					state_change_flag = ~state_change_flag;
				end
			end
			S1: begin
				if (current_state == IDLE || current_state == S2 || current_state == S3) begin
					state_change_flag = ~state_change_flag;
				end
				else if (current_state == S1) begin
					state_change_flag = state_change_flag;
				end
			end
			S2: begin
				if (current_state == IDLE || current_state == S2 || current_state == S3) begin
					state_change_flag = state_change_flag;
				end
				else if (current_state == S1) begin
					state_change_flag = ~state_change_flag;
				end
			end
			S3: begin
				if (current_state == IDLE || current_state == S2 || current_state == S3) begin
					state_change_flag = state_change_flag;
				end
				else if (current_state == S1) begin
					state_change_flag = ~state_change_flag;
				end
			end
			default: state_change_flag = 1'b0;
		endcase
	end
end


//状态机第三步:根据不同状态输出
always @(posedge sys_clk or negedge sys_rst_n) begin
	if (!sys_rst_n) begin
		led_reg <= 6'b000_000;
	end
	else begin
		case(next_state)
			IDLE: begin
				if (state_change_flag == 1'b1 && Y_time_cnt < time_cycle3) begin
					led_reg <= 6'b010_001;
				end
				else if (state_change_flag == 1'b0) begin
					led_reg <= 6'b100_010;
				end
			end
			S1: begin
				if (state_change_flag == 1'b1 && Y_time_cnt < time_cycle3) begin
					led_reg <= 6'b001_010;
				end
				else if (state_change_flag == 1'b0) begin
					led_reg <= 6'b010_100;
				end
			end
			S2: begin
				if (state_change_flag == 1'b1 && Y_time_cnt < time_cycle3) begin
					led_reg <= 6'b010_001;
				end
				else if (state_change_flag == 1'b0) begin
					led_reg <= 6'b100_010;
				end
			end
			S3: begin
				if (state_change_flag == 1'b1 && Y_time_cnt < time_cycle3) begin
					led_reg <= 6'b010_001;
				end
				else if (state_change_flag == 1'b0) begin
					if (state_alt == 2'b00) begin
						led_reg <= 6'b100_010;
					end
					else if (state_alt == 2'b01) begin
						led_reg <= 6'b001_010;
					end
					else if (state_alt == 2'b10) begin
						led_reg <= 6'b010_100;
					end
					else if (state_alt == 2'b11) begin
						led_reg <= 6'b010_001;
					end
				end
			end
			default: led_reg <= 6'b000_000;
		endcase
	end
end

endmodule
	




// 	else if (next_state == IDLE) begin
// 		if ((state_change_flag == 1'b1) && (Y_time_cnt < time_cycle3))
// 			led_reg <= 6'b010_001;
// 		else
// 			led_reg <= 6'b100_010;
// 	end
// 	else if (next_state == S1) begin
// 		if ((state_change_flag == 1'b1) && (Y_time_cnt < time_cycle3))
// 			led_reg <= 6'b001_010;
// 		else
// 			led_reg <= 6'b010_100;		
// 	end
// 	else if (next_state == S2) begin
// 		if ((state_change_flag == 1'b1) && (Y_time_cnt < time_cycle3))
// 			led_reg <= 6'b010_001;
// 		else 
// 			led_reg <= 6'b100_010;		
// 	end
// 	else if (next_state == S3) begin
// 		led_reg <= 6'b100_010;
// 	end
// 	else
// 		led_reg <= 6'b000_000;
// end




			// IDLE: begin
			// 	if ((state_change_flag == 1'b1) && (Y_time_cnt < time_cycle3))
			// 		led_reg <= 6'b010_001;
			// 	else
			// 		led_reg <= 6'b100_010;
			// end
			// S1: begin
			// 	if ((state_change_flag == 1'b1) && (Y_time_cnt < time_cycle3))
			// 		led_reg <= 6'b001_010;
			// 	else
			// 		led_reg <= 6'b010_100;
			// end
			// S2: begin
			// 	if ((state_change_flag == 1'b1) && (Y_time_cnt < time_cycle3))
			// 		led_reg <= 6'b010_001;
			// 	else 
			// 		led_reg <= 6'b100_010;
			// end
			// S3: begin
			// 	if ((G_time_cnt < time_cycle1) && (G1_flag == 1'b1))
			// 		led_reg <= 6'b100_010;
			// 	else if (G_time_cnt == time_cycle1) 
			// 		led_reg <= 6'b001_100;
			// end
			// default: led_reg <= 6'b000_000;

功能:

  实现四种不同的交通状况(无无、无有、有无、有有)和相应的灯光变换逻辑(主绿支红、主黄支红、支绿主红、支黄主红)。交通信号灯控制器需要根据不同的交通状况,自动切换不同的灯光状态,以避免交通拥堵和交通事故。例如,在无无情况下,主干道和支干道均无车辆通行,控制器需要保持原状态;在有无情况下,只有主干道有车辆通行,此时支干道应该停止通行,主干道应该放行;在无有情况下,只有支干道有车辆通行,此时主干道应该停止通行,支干道应该放行;在有有情况下,需要同时兼顾两条道路的通行情况,采用交替放行的方式。设计并实现车辆检测模拟系统,通过拨片开关模拟不同的交通流状态输入。车辆检测是智能交通灯控制器的重要组成部分。通过拨片开关模拟不同的交通流状态输入,可以有效地测试交通信号灯控制器在不同情况下的控制效果。例如,在无有情况下,如果控制器没有检测到主干道的车辆,可能会导致支干道一直保持红灯状态,从而影响交通效率。因此,设计并实现车辆检测模拟系统,可以有效地测试控制器的稳定性和可靠性。设计倒计时显示电路,以数码管形式展示主干道和支干道交通灯的剩余放行时间。倒计时显示电路是智能交通灯控制器的另一个重要组成部分。通过数码管形式展示主干道和支干道交通灯的剩余放行时间,可以提醒司机及时采取相应的行动,避免交通事故的发生。例如,在主干道绿灯将要结束时,倒计时显示电路可以提示未通过的车辆加快速度通过,从而减少交通拥堵。

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值