Løsning: Reducer til et VHDL statement

lør jul 12, 2008 (Anders Enggaard)

Inden du kommer for langt: Se først opgaven!!!

Brainer - billede

Den første og hurtigste med et ”concurrent” svar var Martin Johansson som valgte nedenstående løsning. Løsningen forudsætter anvendelse af biblioteket: ieee.numeric_std.all.

result <= std_logic_vector("00000000" &
  unsigned(input)) when cnt = "11" else
  std_logic_vector("00000000" &
  unsigned(input)  sll (to_integer(unsigned(cnt) & "00")) );

Der er en lille ekstra vinkel på løsningen af denne opgave. Nemlig hvorvidt konstruktionen skal undertrykke eller videresende X’er på input. Der er ikke mange som tænker over dette, men rent faktisk kan man reducere fejlfindingstiden i simuleringerne ved at lade alle moduler videresende X’er til output. Resultatet vil være at så snart der kommer et X på en af indgangene, vil dette hurtigt brede sig gennem designet under simuleringen. Derved bliver den nemmere at se til hvilket tidspunkt kilden til fejlen optrådte.

En anden løsning på opgaven som håndterer X er:

result <= input & x”00”       when (cnt=”10”) else
  x”0” & input & x”0” when (cnt=”01”) else
  x”00” & input       when (cnt=”11” or cnt=”00”) else
  (others => ’X’);

Dette er ikke de eneste løsninger, da VHDL programmering i høj grad handler om smag for kodestil – men det vi ofte ser er at kodestilen kan være anledning til megen forvirring.

Hvad mener du?