Issues with combining counters for traffic light
You're way over-thinking this. There's no reason to make the counter a separate entity; you just end up writing a lot of code to do explicitly what the synthesis tools can do for you implicitly.

Also, for the example of traffic lights, you really only need one counter, because you only need one delay at a time. The same counter can handle different delays for different states.

Just make the counter part of the main state machine, something like this:

entity traffic_light is
  generic (
    green_time  : natural := 50;
    yellow_time : natural := 20;
  );
  port (
    clk         : in std_ulogic;
    rst         : in std_ulogic;
    -- lights are 3-bit fields that control red, yellow, green
    ns_lights   : out std_logic_vector (2 downto 0);
    ew_lights   : out std_logic_vector (2 downto 0);
  );
end entity;

architecture behav of traffic_light is
  signal state : natural;
  signal count : natural;
begin
  process (clk)
  begin
    if rising_edge(clk) then
      if rst = '1' then         -- active-high synchronous reset
        state &lt;= 0;
        ns_lights &lt;= "100";
        ew_lights &lt;= "100";
        count &lt;= 100;
      else
        case state is

        when 0 =&gt;               -- special start-up state; all lights red
          if count = 0 then
            ns_lights &lt;= "001"; -- switch NS to green
            ew_lights &lt;= "100";
            state &lt;= 1;
            count &lt;= green_time;
          else
            count &lt;= count - 1;
          end if;

        when 1 =&gt;               -- NS green, EW red
          if count = 0 then
            ns_lights &lt;= "010"; -- switch NS to yellow
            ew_lights &lt;= "100";
            state &lt;= 2;
            count &lt;= yellow_time;
          else
            count &lt;= count - 1;
          end if;

        when 2 =&gt;               -- NS yellow, EW red
          if count = 0 then
            ns_lights &lt;= "100"; -- switch NS to red
            ew_lights &lt;= "001"; -- switch EW to green
            state &lt;= 3;
            count &lt;= green_time;
          else
            count &lt;= count - 1;
          end if;

        when 3 =&gt;               -- NS red, EW green
          if count = 0 then
            ns_lights &lt;= "100";
            ew_lights &lt;= "010"; -- switch EW to yellow
            state &lt;= 4;
            count &lt;= yellow_time;
          else
            count &lt;= count - 1;
          end if;

        when 4 =&gt;               -- NS red, EW yellow
          if count = 0 then
            ns_lights &lt;= "001"; -- switch NS to green
            ew_lights &lt;= "100"; -- switch EW to red
            state &lt;= 1;
            count &lt;= green_time;
          else
            count &lt;= count - 1;
          end if;

        when others =&gt;
          state &lt;= 0;
          ns_lights &lt;= "100";   -- switch NS to red
          ew_lights &lt;= "100";   -- switch EW to red
          count &lt;= 100;
        end case;
      end if;
    end if;
  end process;
end architecture behav;