Kodutöö #1 - silumine

Juhul, kui simulatsioonide tulemused ei klapi, tuleks proovida vea süstemaatilist otsimist. Aluseks on eeldus, et minimeerimine ja teisendused toimuvad (esialgse) DNK peal, kus implikandi aktiveerumisel on selle väärtuseks '1'. Viisin selle sama näite VHDL koodi sisse vea (vt. koodi), mille tulemusena väljundid m ja n on vigaste väärtustega osadel sisendkombinatsioonidel (punased kriipsud simulatsiooni tulemusel).

Enne vea otsimisega alustamist tuleks kokku koondada lähteülesande ja minimeerimise tulemuse tõeväärtustabelid ning minimeerimisel leitud implikandid. Siis on hea võrrelda, kuidas implikandid aktiveeruvad (või mitte). Näidislahenduse omad on alljärgnevas tabelis.

ülesanne espresso implikandid

 0000 1-00 
 0001 01-0 
 0010 11-1 
 0011 0-01 
 0100 1110 
 0101 1010 
 0110 -111 
 0111 01-0 
 1000 0011 
 1001 -10- 
 1010 -0-1 
 1011 1001 
 1100 11-0 
 1101 0-10 
 1110 -000 
 1111 1011 

 0000 1000 
 0001 0100 
 0010 1111 
 0011 0101 
 0100 1110 
 0101 1010 
 0110 1111 
 0111 0110 
 1000 0011 
 1001 0100 
 1010 0011 
 1011 1001 
 1100 1100 
 1101 0010 
 1110 0000 
 1111 1011 

 0--0 1000 : t0 
 0-10 0011 : t1 
 0-1- 0100 : t2 
 -001 0100 : t3 
 1-11 1001 : t4 
 010- 1000 : t5 
 -100 1110 : t6 
 -1-1 0010 : t7 
 10-0 0011 : t8 
 -01- 0001 : t9 

Selle tabeli ja simulatsioonitulemuse alusel on võimalik välja kirjutada, millistel sisendkombinatsioonidel väljundid aktiveeruvad valesti (vt. alljärgnevat tabelit). Tähistus - "X" on '1', kuid peab olema '0'; "*" on '0', peab olema '1'. Samuti on tabelisse lisatud, millised implikandid peaksid vigaste väljundite korral aktiveeruma.

abcd peab  on vead aktiveeruvad implikandid

 0000 
 0001 
 0010 
 0011 
 0100 
 0101 
 0110 
 0111 
 1000 
 1001 
 1010 
 1011 
 1100 
 1101 
 1110 
 1111 

 1000 
 0100 
 1111 
 0101 
 1110 
 1010 
 1111 
 0110 
 0011 
 0100 
 0011 
 1001 
 1100 
 0010 
 0000 
 1011 

 1011 
 0100 
 1101 
 0101 
 1111 
 1010 
 1100 
 0110 
 0000 
 0100 
 0001 
 1001 
 1101 
 0010 
 0011 
 1011 

 ..XX 
 .... 
 ..*. 
 .... 
 ...X 
 .... 
 ..** 
 .... 
 ..** 
 .... 
 ..*. 
 .... 
 ...X 
 .... 
 ..XX 
 .... 

 0--0 1000

 0--0 1000 | 0-10 0011 | 0-1- 0100 | -01- 0001 

 0--0 1000 | 010- 1000 | -100 1110

 0--0 1000 | 0-10 0011 | 0-1- 0100

 10-0 0011

 10-0 0011 | -01- 0001

 -100 1110

 mitte ükski ei tohiks aktiveeruda!

Sisendkombinatsioonid "0110" ja "1000" on ainsad, mis ei aktiveeri mitte kumbagi vigast väljundit(1). Implikandid, mis peaksid olema '1'-d vastavatel sisendkombinatisoonidel ja mõjutavad ainult m ja n, on "0-10" (t1) ja "10-0" (t8).

Põhimõtteliselt on võimalik ka skeemi analüüsides leida, millised implikandid aktiveeruvad valesti. See võib aga osutuda liiga keeruliseks, sest teisenduste käigus teisenevad ka implikandid. Antud näites on m ja n ühisteks implikantideks t1 ja t8 (espresso tulemus). Optimeerimata skeemis(2) on ühiseks implikandiks ainult t1t8 (optimeeritud skeemis t1t8i, st. inverteeritult). Vrdl. seda implikantide aktiveerumise tulemusega, mis samuti viitab implikantidele t1 ja t8 (3). Kõik osafunktsioonid, mis mõjutavad t1t8-t või sõltuvad sellest, on järgmised:

t2   = ai & c
t53  = a  & bi
t54  = t2 + t53
t1t8 = di & t54
m    = t1t8 + t6 + t7
n    = t1t8 + t4 + t9

Edasi tuleks leida vastavate osafunktsioonide väärtused nende kahe kahtlase sisendkombinatsiooni korral ja võrrelda eeldatavaid väärtusi tegelikega. Kuna lõpptulemuses on osad neist signaalidest inverteeritult (t2i, t53i ja t1t8i), siis peab ka sellega arvestama. Simulatsiooni tulemustel on vastavad kohad tähistatud värvliste joonekesega (sinine õige ja oranž vale väärtus).

 Sisendkombinatsioon "0110" (a'b c d')  Sisendkombinatsioon "1000" (a b'c'd')

 t2 = ai & c == '1'     --> t2i == '0'   -- on '0' - OK 
 t53 = a  & bi == '0'   --> t53i == '1'  -- on '1' - OK 
 t54 = t2 + t53 == '1'                   -- on '0' - ?! 
 t1t8 = di & t54 == '1' --> t1t8i == '0' -- on '1' - ?! 

 t2 = ai & c == '0'     --> t2i == '1'   -- on '1' - OK 
 t53 = a  & bi == '1'   --> t53i == '0'  -- on '0' - OK 
 t54 = t2 + t53 == '1'                   -- on '0' - ?! 
 t1t8 = di & t54 == '1' --> t1t8i == '0' -- on '1' - ?! 

Mõlemad variandid viitavad sellele, et midagi on valesti t54-ga. Tõepoolest, t54 peaks olema pärast DeMorgan'i teisendust "t54 <= not (t2i & t53i);" ja mitte "t54 <= t2i & t53i;", nagu on vigases kirjelduses (vrdl. õiget ja vigast koodi).

Mis puutub ülejäänud sisendkombinatsioonidesse, kus väljundid m ja n on valede väärtustega, siis ka neil juhtudel on t54 väärtus vale. Osadel juhtudel aga maskeerivad teised signaalid t54 väärtuse ja selle pärast on väljundid isegi õiged.


(1) Kuna aluseks on DNK, mille puhul aktiivsed implikandid on 1-d, siis on ka loomulik otsida neid kohti, kus mõlemad väljundid ei ole 1-d.

(2) Seda eeldusel, et ühised alamavaldised on korrektsed. Kui siit viga vaja ei tule, tuleks espresso tulemusest alustada (nt. implikante eraldi välja tuues).

(3) Viga sisse viies oletasin tegelikult, et viga hakkab hargnema implikantide t4 ja t5 kandis, sest "rikkusin" ära ju t54. Olin isegi pisut üllatunud, kui kaks osaliselt erinevat lähenemist viitasid mõlemad t1-le ja t8-le.