Search code examples
vhdlsynthesisquartus

LATCH Primitive disables outputs?


So I understand the concept of a latch, but I'm not seeing how I am inferring one here as my else condition should cover all the possible paths through this process. Quartus is telling me it is disabling the greenLEDS and redLEDs because of LATCH primitive, as well as there is an inferred latch on them. Am I missing something here?

process(current,advance,playerWins,dealerWins) begin
  if(advance) then
        case current is
          when START =>
                deal           <= '1';
                dealTo         <= '1';
                dealToCardSlot <= "00";
                greenLeds <= (others => '0');
                redLeds <= (others => '0');
          when PT1 =>
                deal           <= '1';
                dealTo         <= '1';
                dealToCardSlot <= "01";
                greenLeds <= (others => '0');
                redLeds <= (others => '0');
          when DT1 =>
                deal           <= '1';
                dealTo         <= '0';
                dealToCardSlot <= "00";
                greenLeds <= (others => '0');
                redLeds <= (others => '0');
          when PT2 =>
                deal           <= '1';
                dealTo         <= '1';
                dealToCardSlot <= "10";
                greenLeds <= (others => '0');
                redLeds <= (others => '0');
          when PT3 =>
                deal           <= '1';
                dealTo         <= '1';
                dealToCardSlot <= "11";
                greenLeds <= (others => '0');
                redLeds <= (others => '0');
          when DT2 =>
                deal           <= '1';
                dealTo         <= '0';
                dealToCardSlot <= "01";
                greenLeds <= (others => '0');
                redLeds <= (others => '0');
          when DT3 =>
                deal           <= '1';
                dealTo         <= '0';
                dealToCardSlot <= "10";
                greenLeds <= (others => '0');
                redLeds <= (others => '0');
          when DT4 =>
                deal           <= '1';
                dealTo         <= '0';
                dealToCardSlot <= "11";
                greenLeds <= (others => '0');
                redLeds <= (others => '0');
          when WIN =>
                deal           <= '0';
                dealTo         <= '0';
                dealToCardSlot <= "00";
                if(playerWins) then
                    greenLeds <= (others => '1');
                elsif(dealerWins) then
                    redLeds <= (others => '1');
                else
                    greenLeds <= (others => '0');
                    redLeds <= (others => '0');
                end if;
          when ENDGAME =>
                deal           <= '0';
                dealTo         <= '1';
                dealToCardSlot <= "00";
                greenLeds <= (others => '0');
                redLeds <= (others => '0');
          when others =>
                deal           <= '0';
                dealTo         <= '0';
                dealToCardSlot <= "00";
                greenLeds <= (others => '0');
                redLeds <= (others => '0');
          end case;
  else
    deal           <= '0';
    dealTo         <= '0';
    dealToCardSlot <= "00";
    greenLeds <= (others => '0');
    redLeds <= (others => '0');
  end if;
end process;

Solution

  •       when WIN =>
                deal           <= '0';
                dealTo         <= '0';
                dealToCardSlot <= "00";
                if(playerWins) then
                    greenLeds <= (others => '1');
                elsif(dealerWins) then
                    redLeds <= (others => '1');
                else
                    greenLeds <= (others => '0');
                    redLeds <= (others => '0');
                end if;
    

    You do not assign redLeds if playerWins is false and dealerWins is true. Likewise, you do not assign greenLeds if playerWins is true.