Pergunta

Estou tentando testar um Vhdl Componente, mas não consigo obter essa porta de entrada para me dar qualquer comportamento. Tentei definir a porta para tudo, de '1' para '-', mas ela ainda aparece como 'u' na simulação. Alguma sugestão o que pode estar errado?

Foi útil?

Solução

Para a porta de entrada (por exemplo na 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;

Você atribui dados de leitura e grava para Inout com uma condição. Quando os dados são lidos, são conduzidos por outro módulo. Quando escreve, é acionado por interno.

  • Quando impulsionado por outro módulo (como no sinal), os dados são resolvidos entre todos os 'z' e um vetor "0101010", por exemplo. Os dados serão acionados como "0101010".
  • No outro caso: o outro módulo deve direcionar dados por todos os "Z" e, em seguida, o sinal interno pode colocar seu valor nos dados.

Outras dicas

Você precisa de um driver explícito para 'Z'.

Tentei definir a porta para tudo, de '1' para '-', mas ela ainda aparece como 'u' na simulação.

Além da boa resposta sobre a atribuição/leitura de portas de entrada, o texto citado acima pode estar relacionado à porta que está sendo atribuída em dois locais separados, para que seja resolvido como 'u'.

Ao usar uma porta de entrada, fui mordido por uma ferramenta de síntese instanciando um OBUF em vez de um IOBUF quando as instruções VHDL aparentemente eram aparentemente complicadas demais para que a síntese inferir o IOBUF. A seguir, é apresentado um exemplo simplificado (suponha que todos os sinais sejam std_logic) da situação que me mordeu:

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;

No meu caso de falha, a síntese gerou um OBUF para data_inout. Eu esperaria que um IOBUF lide com o caso de escolha_a = '0' e float_b = '1' porque isso deveria ter atribuído 'z' para data_inout, mas não é isso que recebi.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top