Était-ce utile?

La solution

Pour le port Inout (par exemple dans la 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;

Vous attribuez des données lecture et d'écriture pour inout avec une condition. Lorsque les données sont lues, il est entraîné par un autre module. Quand il écrit, il est entraîné par interne.

  • Lorsqu'il est entraîné par un autre module (comme dans le signal), des données est résolu entre toutes « Z » et un vecteur « 0101010 » par exemple. Les données conduit comme "0101010".
  • Dans l'autre cas: l'autre module doit conduire des données par tous « Z » et le signal interne peut mettre sa valeur aux données
  • .

Autres conseils

Vous avez besoin d'un pilote explicite à 'Z'.

  

Je l'ai tenté de mettre le port à tout de « 1 » à « - », mais il se heurte encore comme « U » dans la simulation.

En aparté à la bonne réponse sur l'attribution / lecture inout ports, le texte cité ci-dessus pourrait être lié au port étant affecté à deux endroits séparés, il est donc décidé que « U ».

Lorsque vous utilisez un port inout, j'ai été mordu par un outil de synthèse instanciation d'un OBUF au lieu d'un IOBUF lorsque les déclarations VHDL étaient apparemment trop compliquée pour la synthèse de déduire la IOBUF. Ce qui suit est un exemple simplifié (en supposant que tous les signaux sont std_logic) de la situation qui m'a mordu:

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;

Dans mon cas d'échec, la synthèse a généré un OBUF pour data_inout. Je me serais attendu à un IOBUF pour traiter le cas de choose_a = « 0 » et float_b = « 1 » parce que cela aurait affecté « Z » à data_inout, mais ce n'est pas ce que je suis.

scroll top