VHDL: как установить значение на входном порте? - PullRequest
4 голосов
/ 02 октября 2009

Я пытаюсь протестировать компонент VHDL , но, похоже, я не могу получить этот один входной порт, который бы дал мне какое-либо поведение. Я попытался установить порт на все от «1» до «-», но он все еще выглядит как «U» в симуляции. Любые предложения, что может быть не так?

Ответы [ 4 ]

11 голосов
/ 04 июля 2012

Для входного порта (например, в ОЗУ):

....
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;

Вы назначаете чтение и запись данных для ввода с условием. Когда данные читаются, они управляются другим модулем. Когда это пишет, это управляется внутренним.

  • При управлении другим модулем (как в сигнале) данные разрешаются между всеми 'Z' и вектором "0101010", например. Данные будут обработаны как «0101010».
  • В другом случае: другой модуль должен управлять данными по всем "Z", и тогда внутренний сигнал может поместить свое значение в данные.
6 голосов
/ 02 октября 2009

Вам нужен явный драйвер для 'Z'.

1 голос
/ 04 июля 2013

Я пытался установить порт на все от «1» до «-», но он по-прежнему выглядит как «U» в симуляции.

В дополнение к хорошему ответу о назначении / считывании входных портов, приведенный выше текст может быть связан с портом, назначаемым в двух отдельных местах, поэтому он разрешается как 'U'.

0 голосов
/ 03 января 2019

При использовании входного порта меня укусил инструмент синтеза, который создавал экземпляр OBUF вместо IOBUF, когда операторы VHDL были явно слишком сложными для синтеза, чтобы вывести IOBUF. Ниже приведен упрощенный пример (предположим, что все сигналы являются std_logic) ситуации, которая меня кусала:

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;

В моем случае сбоя синтез сгенерировал OBUF для data_inout. Я ожидал, что IOBUF будет обрабатывать случай select_a = '0' и float_b = '1', потому что это должно было назначить 'Z' для data_inout, но это не то, что я получил.

...