Поиск…


Вступление

Типы VHDL могут быть неразрешенными или разрешенными . Например, тип bit объявленный пакетом std.standard , не разрешен, в то время как тип std_logic объявленный пакетом ieee.std_logic_1164 , разрешен.

Сигнал, тип которого не разрешен, не может управляться (назначаться) более чем одним процессом VHDL, в то время как разрешен тип сигнала.

замечания

Использование разрешенных типов должно быть зарезервировано для ситуаций, когда намерение действительно заключается в моделировании аппаратного провода (или набора проводов), управляемого более чем одной аппаратной схемой. Типичным случаем, когда это необходимо, является двунаправленная шина данных памяти: при записи в память это устройство записи, которое управляет шиной, когда считывается память, это память, которая управляет шиной.

Использование разрешенных типов в других ситуациях, в то время как часто встречающаяся практика, является плохой идеей, потому что она подавляет очень полезные ошибки компиляции, когда случайно создаются непредвиденные ситуации с несколькими дисками.

Пакет ieee.numeric_std объявляет типы signed и unsigned векторов и перегружает на них арифметические операторы. Эти типы часто используются, когда необходимы арифметические и битовые операции для одних и тех же данных. signed и unsigned типы разрешены. Ранее VHDL2008, используя ieee.numeric_std и его типы, подразумевал, что случайные ситуации с несколькими дисками не будут приводить к ошибкам компиляции. VHDL2008 добавляет новые объявления типов к ieee.numeric_std : unresolved_signed и unresolved_unsigned (псевдонимы u_signed и u_unsigned ). Эти новые типы должны быть предпочтительными во всех случаях, когда не требуется несколько ситуаций с несколькими приводами.

Два процесса, управляющих одним и тем же сигналом типа «бит»

Следующая модель VHDL управляет сигналами s от двух разных процессов. Поскольку тип s bit , неразрешенный тип, это недопустимо.

-- File md.vhd
entity md is
end entity md;

architecture arc of md is

  signal s: bit;

begin

  p1: process
  begin
    s <= '0';
    wait;
  end process p1;

  p2: process
  begin
    s <= '0';
    wait;
  end process p2;

end architecture arc;

Компиляция, разработка и попытка моделирования, например, с помощью GHDL, вызывают ошибку:

ghdl -a md.vhd
ghdl -e md
./md
for signal: .md(arc).s
./md:error: several sources for unresolved signal
./md:error: error during elaboration

Обратите внимание, что ошибка возникает, даже если, как и в нашем примере, все драйверы согласны с движущей силой.

Функции разрешения

Сигнал, тип которого разрешен, имеет связанную функцию разрешения . Он может управляться более чем одним процессом VHDL. Функция разрешения вызывается для вычисления результирующего значения всякий раз, когда драйвер присваивает новое значение.

Функция разрешения - это чистая функция, которая принимает один параметр и возвращает значение типа для разрешения. Параметр - это одномерный, неограниченный массив элементов типа для разрешения. Например, для bit типа параметр может иметь тип bit_vector . Во время моделирования функция разрешения вызывается, когда это необходимо, чтобы вычислить полученное значение для применения к многократно управляемому сигналу. Он передает массив всех значений, управляемых всеми источниками, и возвращает полученное значение.

Следующий код показывает объявление функции разрешения для bit типа, которое ведет себя как проводное and . Он также показывает, как объявить разрешенный подтип типа bit и как его можно использовать.

-- File md.vhd
entity md is
end entity md;

architecture arc of md is

  function and_resolve_bit(d: bit_vector) return bit is
    variable r: bit := '1';
  begin
    for i in d'range loop
      if d(i) = '0' then
        r := '0';
      end if;
    end loop;
    return r;
  end function and_resolve_bit;

  subtype res_bit is and_resolve_bit bit;

  signal s: res_bit;

begin

  p1: process
  begin
    s <= '0', '1' after 1 ns, '0' after 2 ns, '1' after 3 ns;
    wait;
  end process p1;

  p2: process
  begin
    s <= '0', '1' after 2 ns;
    wait;
  end process p2;

  p3: process(s)
  begin
    report bit'image(s); -- show value changes
  end process p3;

end architecture arc;

Компиляция, разработка и моделирование, например, с помощью GHDL, не вызывает ошибки:

ghdl -a md.vhd
ghdl -e md
./md
md.vhd:39:5:@0ms:(report note): '0'
md.vhd:39:5:@3ns:(report note): '1'

Однобитовый протокол связи

Некоторые очень простые и недорогие аппаратные устройства, такие как датчики, используют однобитовый протокол связи. Одна двунаправленная линия данных соединяет устройство с микроконтроллером. Он часто подтягивается подтягивающим резистором. Коммуникационные устройства управляют строкой низкого уровня в течение заранее определенной продолжительности для отправки информации другому. На следующем рисунке показано следующее:

Однобитовый протокол связи

В этом примере показано, как моделировать это, используя тип ieee.std_logic_1164.std_logic .

-- File md.vhd
library ieee;
use ieee.std_logic_1164.all;

entity one_bit_protocol is
end entity one_bit_protocol;

architecture arc of one_bit_protocol is

  component uc is
    port(
      data_in: in  std_ulogic;
      set_low: out std_ulogic
    );
  end component uc;

  component sensor is
    port(
      data_in: in  std_ulogic;
      set_low: out std_ulogic
    );
  end component sensor;

  signal data:           std_logic;  -- The bi-directional data line
  signal set_low_uc:     std_ulogic;
  signal set_low_sensor: std_ulogic;

begin

  -- Micro-controller
  uc0: uc port map(
    data_in => data,
    set_low => set_low_uc
  );

  -- Sensor
  sensor0: sensor port map(
    data_in => data,
    set_low => set_low_sensor
  );

  data <= 'H'; -- Pull-up resistor

  -- Micro-controller 3-states buffer
  data <= '0' when set_low_uc = '1' else 'Z';

  -- Sensor 3-states buffer
  data <= '0' when set_low_sensor = '1' else 'Z';

end architecture arc;


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow