﻿// 交通信号機のステートマシン

module traffic_lights( clock, reset );

	input clock, reset;
	
	reg [1:0] light;
	reg [3:0] cntr;
	
//	状態の定義
	parameter
		red	= 'b00,
		blue	= 'b01,
		yellow	= 'b10;
	
//	各状態の持続時間
	parameter
		REDcount	= 'h7,
		BLUEcount	= 'h5,
		YELLOWcount	= 'h1;

//	ステートマシンの定義
always @(posedge clock )
    if ( reset )	
    begin				
	light	<= red;	 		// 初期値は赤
	cntr	<= REDcount;		// 赤の時間をセット
    end
    else 
    case (light)
	red:	begin			// ライトが赤の時
	    if ( cntr == 0 )
	    begin
		light	<= blue;
		cntr	<= BLUEcount;
	    end
	    else
		cntr <= cntr-1;
	end

	blue:	begin			// ライトが青の時
	    if ( cntr == 0 )
	    begin
		light	<= yellow;
		cntr	<= YELLOWcount;
	    end
	    else
		cntr <= cntr-1;
	end
	
	yellow:	begin			// ライトが黄の時
	    if ( cntr == 0 )
		begin
		    light <= red;
		    cntr  <= REDcount;
		end
	    else
		cntr <= cntr-1;
	end

	default:	begin
	    light	<= red;	 	// 変な状態は赤へ
	    cntr	<= REDcount;	
	end
     endcase

endmodule
