module dec #(m = 32) ( //clock and reset //control slave //memory slave //external ports ); typedef enum logic [1:0] {RED, YELLOW, BLINK, GREEN} FSMStates; logic run; logic [1:0] divider; logic [1:0] state; logic [31:0] greenSaved; logic [31:0] greenCount; // we don't enable counters, if color is green always_comb begin enacnt = ((cntdiv == divisor) && !(colors == 3'b001)); end always_ff @ (posedge clk or negedge clrn) begin if (!clrn) begin colors <= 3'b001; state <= GREEN; greenCount <= 32'd0; end else begin if (~run) begin colors <= 3'b001; state <= GREEN; end if (train) begin colors <= 3'b100; state <= RED; greenSaved <= divisor; greenCount <= divisor; end else begin case (state) RED: begin colors <= 3'b100; if (enacnt) begin state <= state + 1'b1; greenSaved <= divisor; end end YELLOW: begin colors <= 3'b010; if (enacnt) begin state <= state + 1'b1; end end BLINK: begin if (enacnt) begin state <= state + 1'b1; end if (greenSaved[0] == 0) begin colors <= 3'b011; end else begin greenCount <= greenCount - 1'b1; if (greenCount == 32'd0) begin colors[1] <= ~colors[1]; greenCount <= greenSaved; end end end GREEN: begin if (enacnt) begin state <= state + 1'b1; end colors <= 3'b001; end default: colors <= 3'b100; endcase end end end assign contr = state; assign red = colors[2]; assign yellow = colors[1]; assign green = colors[0]; periodram b2v_inst3 ( .clock(clk), .data (ram_wrdata), .wraddress (ram_addr), .wren (ram_wr), .rdaddress({divider,contr}), .q(divisor) ); endmodule