/******************************************************
*                                                     
*  Description:  Vorlage Ampelsteurerung                                
*         Date:  05.01.2018                          
*    File Name:  ampel_wo_src.v                              
*      Version:  1.2                                  
*       Target:  Simulation and Synthesis             
*   Technology:                                       
*                                                     
* Rev   Author   Date          Changes                
* -----------------------------------------------------
* 1.0   RHK      10.10.2011    Initial Release        
* 1.1   JZ       10.03.2016    several bugfixes
* 1.2   JZ       05.01.2018    angepasst auf neues Ampelboard
* 1.3   MW       07.03.2019    STATE Konstanten angepasst
*******************************************************/

`timescale 1ns / 1ps

module ampel (
  input              CLOCK_50,
  input        [1:0] KEY,
  output       [2:0] LEDH_L,
  output       [2:0] LEDH_R,
  output       [2:0] LEDN_L,
  output       [2:0] LEDN_R,
  output       [1:0] LEDF_L,
  output       [1:0] LEDF_R, 
  output reg			DBG  
);

reg [9:0] CLKDIV1;
reg [9:0] CLKDIV2;
reg [9:0] CLKDIV3;

reg MELDER;
reg MELDER_Q;
reg MELDER_QQ;
reg MELDER_ACK;
reg CLOCK_ENABLE;

reg START_WARTEN;
reg [3:0] STATE;
reg [2:0] HAUPTSTR;
reg [2:0] NEBENSTR;
reg [1:0] FUSSGAENGER;

reg [3:0] WARTEZAEHLER;
reg [3:0] WARTEWERT;

//                       R Gr
parameter FUSS_AUS   = 2'b00;
parameter FUSS_ROT   = 2'b10;
parameter FUSS_GRUEN = 2'b01;
//                      R Ge Gr
parameter AUTO_AUS   = 3'b000;
parameter AUTO_ROT   = 3'b100;
parameter AUTO_GELB  = 3'b010;
parameter AUTO_GRUEN = 3'b001;

assign RESETn                     = KEY[1];

assign LEDH_L  = HAUPTSTR;
assign LEDH_R  = HAUPTSTR;
assign LEDN_L = NEBENSTR;
assign LEDN_R = NEBENSTR;
assign LEDF_L = FUSSGAENGER;
assign LEDF_R = FUSSGAENGER;

`ifdef SIMULATION
`define DIVVAL1 10-1
`define DIVVAL3 5-1
`else
`define DIVVAL1 1000-1
`define DIVVAL3 50-1
`endif

`define FUSS_WARTEN       4  //Wartezeit
`define GELB_DAUER        4  //Wartezeit 
`define FUSS_GRUEN_DAUER  4  //Wartezeit
`define ALLE_ROT_DAUER    4  //Wartezeit

`define HAUPT_GRUEN_DAUER 4  //Wartezeit
`define NEBEN_GRUEN_DAUER 4  //Wartezeit


`define PHASEVAL 8

//clock divider to generate 1 Hz
//

// HIER IHREN CODE EINFÜGEN


// synchronisze KEY to CLOCK_50
always @(posedge CLOCK_50) begin
// HIER IHREN CODE EINFÜGEN
end

// Melder sofort setzen 
// Melder zuruecksetzen wenn die Anforderung von der Statemachine verarbeitet
// wurde. Die Ampelanlage gibt den FUSSGAENGERn nur dann gruen wenn
// ein Melder anstehst...			
always @(posedge CLOCK_50 or negedge RESETn) begin
  if (~RESETn)
    MELDER <= 1'b0;
  else begin
// HIER IHREN CODE EINFÜGEN
  end 	
end            

//Wartezaehler
// HIER IHREN CODE EINFÜGEN

assign WARTEN_FERTIG =  // HIER IHREN CODE EINFÜGEN;


always @(posedge CLOCK_50 or negedge RESETn)
  if (~RESETn)
    begin
    HAUPTSTR     <= AUTO_GRUEN;
    NEBENSTR     <= AUTO_ROT;
    FUSSGAENGER  <= FUSS_ROT;
    START_WARTEN <= 1'b0;
    STATE        <= 4'd0;
    MELDER_ACK   <= 1'b0;
    end
  else
  if (CLOCK_ENABLE)
  case (STATE)
    4'd0: begin

          end        
    4'd1: begin

          end
    4'd2: begin

          end
    4'd3: begin

          end 
    4'd4: begin
    
          end
    4'd5: begin
    
          end
    4'd6: begin
    
          end     
    4'd7: begin
    
          end     
    default:                      
          STATE <= 4'd1;
  endcase
                        
endmodule
