Domanda

Sto cercando di testare un componente VHDL , ma io non riesco a ottenere questo inout porta per darmi qualsiasi comportamento. Ho provato a installare la porta a tutto da '1' a '-', ma si tratta ancora come 'U' nella simulazione. Eventuali sugestions quali potrebbero essere sbagliato?

È stato utile?

Soluzione

Per la porta Inout (per esempio in RAM):

....
port(
    data    :inout std_logic_vector (DATA_WIDTH-1 downto 0);
....
-- Memory Write Block
-- Write Operation : When we = 1, cs = 1
  MEM_WRITE: process (address, cs, we, data, address_1, cs_1, we_1, data_1) begin
    if (cs = '1' and we = '1') then
       mem(conv_integer(address)) <= data;
    end if;
  end process;

 -- Tri-State Buffer control
  data <= data_out when (cs = '1' and oe = '1' and we = '0') else (others=>'Z');

 -- Memory Read Block
  MEM_READ: process (address, cs, we, oe, mem) begin
    if (cs = '1' and we = '0' and oe = '1') then
      data_out <= mem(conv_integer(address));
    else
      data_out <= (others=>'0');
    end if;
  end process;

È possibile assegnare i dati di lettura e scrittura per inout con una condizione. Quando i dati vengono letti, è guidato da un altro modulo. Quando si scrive, è guidato da interno.

  • Quando azionato da un altro modulo (come nel segnale), i dati viene risolto tra tutti 'Z' e un vettore "0.101.010" per esempio. I dati saranno guidati come "0.101.010".
  • Nel secondo caso: l'altro modulo deve guidare i dati da tutti "Z" e quindi il segnale interno può mettere il suo valore di dati
  • .

Altri suggerimenti

È necessario un driver esplicito alla 'Z'.

  

Ho provato a fissare la porta a tutto da '1' a '-', ma si tratta ancora come 'U' nella simulazione.

Per inciso per la buona risposta sull'assegnazione / lettura inout porte, il testo sopra citato potrebbe essere correlato alla porta viene assegnata in due luoghi separati, quindi è risolto come 'U'.

Quando si utilizza una porta inout, sono stato morso da uno strumento di sintesi istanziare un OBUF invece di un IOBUF quando le dichiarazioni VHDL erano apparentemente troppo complicato per la sintesi di dedurre l'IOBUF. Quanto segue è un esempio semplificato (assumono tutti i segnali sono std_logic) della situazione che mi ha morso:

data_a <= '1' when assert_a = '1' else '0';
data_b <= 'Z' when float_b = '1' else '0';  
data_inout <= data_a when choose_a = '1' else data_b;

Nel mio caso il fallimento, la sintesi generato un OBUF per data_inout. Mi sarei aspettato un IOBUF per gestire il caso di choose_a = '0' e float_b = '1', perché che avrebbe dovuto assegnato 'Z' per data_inout, ma non è quello che ho ottenuto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top