Forum Discussion

Altera_Forum's avatar
Altera_Forum
Icon for Honored Contributor rankHonored Contributor
9 years ago

Can't resolve multiple constant drivers

I have a process


type StateType is (ST_IDLE, ST_WAIT_DONE, ST_START_RX_DATA, ST_RX_DATA0, ST_RX_DATA, ST_RX_REG_COM, ST_RX_REG_ADDR, ST_RX_REG_DATA, ST_TX_REG_COM,  ST_TX_REG_ADDR, ST_TX_REG_DATA, ST_TX_REG_DONE, ST_READ_STATUS_0, ST_READ_STATUS_1, ST_START_TX_DATA, ST_TX_DATA, ST_WAIT_USER_DONE);
signal State :StateType;
signal NextState :StateType;
mspi_mcp25625_interface: process (REG_CLK) 
begin 
    if (rising_edge(REG_CLK)) then
  
      case State is
  
        when ST_IDLE =>
        MSPI_WR_START_TRIG <= '0';
        MSPI_WR_DONE_CLR  <= '0';
        if (MCP25625_RX0BF='0' or MCP25625_RX1BF='0') then
            State <= ST_START_RX_DATA;
        end if;
      
    when ST_WAIT_DONE =>
        MSPI_WR_START_TRIG <= '0';
        MSPI_WR_DONE_CLR <= '0';
            if (MSPI_WR_DONE = '1') then 
          MSPI_WR_DONE_CLR <= '1';
          if (NextState = ST_RX_DATA) then
             if (rx_byte_idx < DATA_LENGHT) then
                temp_rx_mailbox(rx_byte_idx) <= MSPI_RD_DATA; 
              rx_byte_idx := rx_byte_idx + 1; --index for next rx byte
--             else
--               rx_byte_idx := 0;
--             State <= ST_IDLE;
           end if; 
        elsif (NextState = ST_RX_REG_DATA) then
              mcp25625_reg_data <=  MSPI_RD_DATA;
              elsif (NextState =  ST_READ_STATUS_1) then
              mcp25625_status_reg <= MSPI_RD_DATA;  
          end if;
        State <= NextState;
      else   --timeout 
                timeout <= timeout + 1; 
              if (timeout >= X"FFFE") then
            timeout <= X"0000";
        State <= ST_IDLE;
            end if;     
      end if;  
    
            ---------------------------------------RECEIVE MAILBOX FROM MCP25625-------------------------
    
        when ST_START_RX_DATA =>      --start to receive a mailbox
     if (MCP25625_RX0BF='0') then
      MSPI_WR_DATA <= X"90";  --Receive Buffer 0, Start at RXB0SIDH (0x61) 
     elsif (MCP25625_RX1BF='0') then
      MSPI_WR_DATA <= X"94";  --Receive Buffer 1, Start at RXB1SIDH (0x71)
     end if;
     MSPI_CS <= '0';            --chip select low
     MSPI_WR_START_TRIG <= '1'; --send a byte
     NextState <= ST_RX_DATA0;
     State <= ST_WAIT_DONE;
     
    when ST_RX_DATA0 =>           --skip first byte - it was a command
          MSPI_WR_DONE_CLR <= '0';
          State <= ST_RX_DATA;
      
    when ST_RX_DATA =>                 --receive a mailbox
        MSPI_WR_DONE_CLR <= '0'; 
        if (rx_byte_idx < DATA_LENGHT) then
            MSPI_WR_DATA <= X"00";     --load dummy byte
            MSPI_WR_START_TRIG <= '1'; --send a byte
          NextState <= ST_RX_DATA;
          State <= ST_WAIT_DONE;   
        else                           --13 bytes received
              MSPI_CS <= '1';            --chip select high 
            rx_byte_idx := 0;
        --MCP25625_DATA_RDY <= '1';  --WHERE TO CLEAR?
        rx_data_ready <= '1';
          NextState <= ST_IDLE;
          State <= ST_IDLE;
          end if; 
 when others =>
        State <= ST_IDLE;
      end case; 
    end if;         
end process mspi_mcp25625_interface; 

When I compile I get multiple errors :

Error (10028): Can't resolve multiple constant drivers for net "State.ST_IDLE"……

Error (10028): Can't resolve multiple constant drivers for net "State.ST_WAIT_DONE" …..

Error (10028): Can't resolve multiple constant drivers for net "State.ST_START_RX_DATA" …..

And so on.

But I use State only in this process.