VHDL - mõned trikid

Siin on toodud mõned näpunäited, kuidas kirjutada lihtsat kuid efektiivset VHDL-koodi, kui on teada implikant-kate.

Olgu näiteks espresso tulemuseks:

.i 5
.o 3
.phase 100
00--- 110
01-1- 001
111-- 100
11--1 010
10--1 001
.e

Sisenditeks on 5-bitine std_logic_vector tüüpi signaal x ja väljunditeks kolm 3-bitist sama tüüpi signaali y1, y2 ja y3 (vastavalt andmevoo, pseudo-struktuuri ja käitumusliku stiili jaoks).

Andmevoo-stiilis võiks kood olla näiteks selline:

y1(1) <= ((not x(1)) and (not x(2))) or (x(1) and x(2) and x(3));
y1(2) <= not (((not x(1)) and (not x(2))) or (x(1) and x(2) and x(5)));
y1(3) <= not (((not x(1)) and x(2) and x(4)) or
              (x(1) and (not x(2)) and x(5)));

Teistsugune andmevoog (täiendavad signaalid t1...t5 vastavad implikantidele). Võib vaadata ka kui pseudo-struktuuri:

t1 <= (not x(1)) and (not x(2));
t2 <= (not x(1)) and x(2) and x(4);
t3 <= x(1) and x(2) and x(3);
t4 <= x(1) and x(2) and x(5);
t5 <= x(1) and (not x(2)) and x(5);
y2(1) <= t1 or t3;
y2(2) <= not (t1 or t4);
y2(3) <= not (t2 or t5);

Käitumusliku koodi kirjutamisel tuleks arvestada seda, et korraga võib aktiveeruda suvaline arv implikante. Seega peaks protsessis karvestama ka olukorraga, et mitte ükski implikant ei aktiveeru - vajalikud on vaikeväärtused. Alljärgnev kood on üks võimalik lähenemine. Muuseas, iga if-käsu ees on märgend (mis peidab ära arhitektuuris oleva samanimelise signaali).

process (x) begin
  y3 <= "011"; -- Default value, see ".phase 100" !!!
  t1: if x(1)='0' and x(2)='0' then y3(1)<='1'; y3(2)<='0'; end if;
  t2: if x(1)='0' and x(2)='1' and x(4)='1' then y3(3)<='0'; end if;
  t3: if x(1)='1' and x(2)='1' and x(3)='1' then y3(1)<='1'; end if;
  t4: if x(1)='1' and x(2)='1' and x(5)='1' then y3(2)<='0'; end if;
  t5: if x(1)='1' and x(2)='0' and x(5)='1' then y3(3)<='0'; end if;
end process;

Hea lihtsa generaatori sisendsignaalide kombinatsioonide jaoks saab tsükli abil (x_u on unsigned tüüpi).

process begin
  for i in 0 to 31 loop
    x_u <= conv_unsigned(i,5);
    wait for 10 ns; -- After every 10 ns
  end loop;
  wait;
end process;
x <= std_logic_vector(x_u);


Simulatsiooni tulemus.

Terviklik VHDL-kood.