Hirdetés

Aktív témák

  • t3rm1nat0r

    csendes tag

    Igazából a program látványos, de nem eléggé átlátható, mi miért történik.

    Az írtam, nem foglalkozok a szorzással, de ha már belekezdtem, akkor legyen az is itt. Mivel nem fér el az előző megoldással a monitoron egy teljes szorzó, és nem is átlátható,ezért egyszerűsíteni fogok.

    Minden egyes D flip-floppot, ami egy bitet tárolt eddig, és sok NAND kapuból épült fel, most egyetlen INT tipusú változó fogja jelölni. Ez tehát egy regiszer egy bit értéke lesz.
    Az összeadót nem kapus megoldással fogom felírni, hanem az előre kiszámolt táblázat módszerrel. Mint írtam, ez gyorsabb, és valami hasonlóan kell működniük a modern grafikus megjelenítőkben található vektorprocesszoroknak is, hiszen ennél gyorsabb módszer nincs.

    Az összeg úgy fog előállni, hogy egyetlen aritmetikai műveletet sem végzek el, csak a 2bites összeadásra előre kiszámolt táblázatot használom.
    Ennek kiszámolása a program elején történik. Ez a hardverbe már készen kerül bele, emiatt nem tartozik közvetlenül a szimulációhoz.

    for(c=0;c<2;c++)//carry
    for(i=0;i<4;i++)
    for(j=0;j<4;j++)
    {
    int osszeg=i+j+c;
    int addr=c*16+i*4+j;
    mask=1;

    for(k=0;k<3;k++) {adder_tablazat[addr][k]=((osszeg & mask)>>k);mask<<=1;}
    }

    Két bit összeadása pedig ennyi lesz.

    int addra=(bita1<<1)+bita0;
    int addrb=(bitb1<<1)+bitb0;
    addra=(carry<<4) + (addra<<2) + addrb;


    pipeline[j+1][k ]=adder_tablazat[addra][0];
    pipeline[j+1][k+1]=adder_tablazat[addra][1];
    pipeline[j+1][8 ]=adder_tablazat[addra][2];//carry

    Annyi történik itt, hogy az összeadandó bitekből kiszámolódik a táblázat címe, majd az eredmény bitjei bekerülnek a csővezetékbe.

Aktív témák