Szukaj…


Wprowadzenie

Typy VHDL mogą być nierozwiązane lub rozwiązane . Na przykład typ bit zadeklarowany przez pakiet std.standard jest nierozwiązany, a typ std_logic zadeklarowany przez pakiet ieee.std_logic_1164 jest rozwiązany.

Sygnał, którego typu jest nierozwiązany, nie może być sterowany (przypisywany) przez więcej niż jeden proces VHDL, podczas gdy sygnał, którego typu jest rozwiązany, może.

Uwagi

Zastosowanie typów rozstrzygniętych powinno być zastrzeżone dla sytuacji, w których intencją jest naprawdę modelowanie drutu sprzętowego (lub zestawu drutów) napędzanego przez więcej niż jeden obwód sprzętowy. Typowym przypadkiem, w którym jest to potrzebne, jest dwukierunkowa magistrala danych pamięci: gdy pamięć jest zapisywana, to urządzenie zapisujące napędza magistralę, podczas gdy pamięć jest czytana, to pamięć napędza magistralę.

Używanie typów rozwiązanych w innych sytuacjach, choć jest często spotykaną praktyką, jest złym pomysłem, ponieważ eliminuje bardzo przydatne błędy kompilacji, gdy przypadkowo powstają niepożądane sytuacje z wieloma dyskami.

Pakiet ieee.numeric_std deklaruje signed i unsigned typy wektorów i przeciąża na nich operatory arytmetyczne. Te typy są często używane, gdy potrzebne są operacje arytmetyczne i bitowe na tych samych danych. signed i unsigned typy są rozwiązane. Wcześniejsze wersje VHDL2008 przy użyciu ieee.numeric_std i jego typów sugerowały, że przypadkowe sytuacje na wielu dyskach nie spowodowałyby błędów kompilacji. VHDL2008 dodaje deklaracje nowego typu do ieee.numeric_std : unresolved_signed i unresolved_unsigned (aliasy u_signed i u_unsigned ). Te nowe typy powinny być preferowane we wszystkich przypadkach, w których wiele napędów nie jest pożądanych.

Dwa procesy sterujące tym samym sygnałem typu „bit”

Poniższe napędy modelu VHDL sygnał s z dwóch różnych procesów. Ponieważ typ s jest bit , nierozwiązanym typem, nie jest to dozwolone.

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

Kompilowanie, opracowywanie i próba symulacji, np. Z GHDL, powodują błąd:

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

Pamiętaj, że błąd jest zgłaszany, nawet jeśli, tak jak w naszym przykładzie, wszyscy kierowcy zgadzają się co do wartości jazdy.

Funkcje rozdzielczości

Sygnał, który typ jest rozwiązany, ma powiązaną funkcję rozdzielczości . Może być sterowany przez więcej niż jeden proces VHDL. Wywoływana jest funkcja rozdzielczości w celu obliczenia wartości wynikowej za każdym razem, gdy sterownik przypisuje nową wartość.

Funkcja rozdzielczości to czysta funkcja, która przyjmuje jeden parametr i zwraca wartość typu do rozwiązania. Ten parametr jest jednowymiarową, nieograniczoną tablicą elementów typu do rozwiązania. Na przykład dla bit typu parametr może być typu bit_vector . Podczas symulacji wywoływana jest funkcja rozdzielczości, gdy jest to potrzebne do obliczenia wartości wynikowej w celu zastosowania do wielokrotnie sterowanego sygnału. Przekazuje tablicę wszystkich wartości sterowanych przez wszystkie źródła i zwraca wartość wynikową.

Poniższy kod pokazuje deklarację funkcji rozdzielczości dla bit typu, który zachowuje się jak przewodowy and . Pokazuje także, jak zadeklarować rozstrzygnięty podtyp bit typu i jak można go użyć.

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

Kompilowanie, opracowywanie i symulowanie, np. Za pomocą GHDL, nie powoduje błędu:

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

Jednobitowy protokół komunikacyjny

Niektóre bardzo proste i tanie urządzenia sprzętowe, takie jak czujniki, wykorzystują jednobitowy protokół komunikacyjny. Pojedyncza dwukierunkowa linia danych łączy urządzenie z rodzajem mikrokontrolera. Często jest podciągany przez rezystor podciągający. Urządzenia komunikacyjne prowadzą linię na niskim poziomie przez wcześniej określony czas, aby wysłać informacje do drugiej. Poniższy rysunek ilustruje to:

Jednobitowy protokół komunikacyjny

Ten przykład pokazuje, jak modelować to za pomocą typu rozstrzygniętego 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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow