Hirdetés

Keresés

Aktív témák

  • t3rm1nat0r

    csendes tag

    válasz t3rm1nat0r #24 üzenetére

    A dekóder értékének a kiiratása felesleges. Szemmel jól látszik, ahogy mindig csak egy jobb oldali NAND kapunak 1 a kimenete.
    Ez címezhetne egy ramban egy sor kondenzátort, ami tartalmazhatna egy egyszerű utasítást. Azt lehetne dekódolni, egyszerű összeadásra és forgatásokra.

    De ahhoz már nagyobb hely kellene, így ez egyenlőre ennyi.

  • t3rm1nat0r

    csendes tag

    válasz t3rm1nat0r #24 üzenetére

    A legalsó kép két bitet és egy átvitelt ad össze, az eredmény 1 bit és egy új átvitel.
    Ez 8 bites összeadónál annyit jelent, hogy miután beálltak stabil állapotba az első bitösszeadó kapui, a következő bit ekkor kapja meg az átvitelt.
    Igaz hogy addig az is beállt valahogy, de az az eredmény érvénytelen, hiszen az első bitösszeadó áltvitel bitje csak most lett "érvényes".

    Ezt a "beállást" nagyon szépen látni lehet a programban, ha kissé módosítjuk.

    draw_layer();//ido kell mig minden beall, kirajzolhato a koztes allapot
    //ide meg lehetne tenni valamilyen Sleep(x)-et
    //getchar();

    Ezt a két sort módosítva látható, ahogy végighullámzik ez a beállás a tranzisztorokon. Ezért /is/ lassúak viszonylag a hagyományos processzorok. Az átvitelbitnek végig kell futnia az összeadón. És a szorzásról még nem is beszéltem. /Nem is fogok. xD/

    A vektorprocesszorok ezt úgy oldják meg /Cray, geforce, etc/, hogy egy órajelciklus alatt csak egyetlen bitet adnak össze egy számon. A többi bit közben csak tárolódik, mondjuk egy flipflop sorban. Az átvitel a következő fozokatban adódik majd hozzá a számhoz, miközben az előző fokozat sem megy üresjáratban, hanem oda már egy másik szám érkezett. Könnyen belátható, hogy így nincs "beállási hullám", és minden ciklusban helyes eredmény kapunk.
    Az egyetlen hátránya a dolognak, hogy a "vektor csővezetéket" fel kell tölteni, addig csak üresjáratban fut. Nincs értelme egyetlen számmal műveletet végezni, csak és kizárólag nagy tömbökkel.

  • t3rm1nat0r

    csendes tag

    válasz t3rm1nat0r #24 üzenetére

    Talán kezdem a decoderrel.

    Mint kivehető a képből, négy bemeneti vezetékből 16 kimenetet állít elő. Helyesebben a 16 közül mindig csak egy aktív. A 4 vezeték egy 4 bites decimális számként van értelmezve. A 16 vezeték közül mindig az aktív, amelyik sorszáma megfelel a deciális szám értékének.
    Az első lépés, hogy a 4 vezeték invertálódik. Ez azért kell mert mint mostmár tudjuk, az AND kapu akkor fog aktíválódni, ha minden bemenete 1. Itt négy bemenetű AND kapuk vannak a képen. Ezért nem kell megtanulni a táblázatot, elég csak a szabályt alkalmazni. 1000 bemenetű AND kapura is az érvényes.
    Tehát a 10 érteknél a vezetéken 1010 érték lesz. A két nullás vezetéknek az inverzét kell venni, így kapjuk az 1111 értéket, ami már aktíválni fogja az AND kaput.

    void define_decoder(int tr3,int tr4,int mask)
    {
    int dx[]={sor,sor,sor,sor};//invertalva egy ketsorral lejjebb

    if(mask&1) dx[0]=0;
    if(mask&2) dx[1]=0;
    if(mask&4) dx[2]=0;
    if(mask&8) dx[3]=0;

    define_links(tr3 ,tr4+dx[0] ,tr4+ketsor+dx[1],0);
    define_links(tr3+1,tr3,link_5V,0); //inverter

    define_links(tr3+2,tr4+ketsor*2+dx[2],tr4+ketsor*3+dx[3],0);
    define_links(tr3+3,tr3+2,link_5V,0);//inverter

    define_links(tr3+4,tr3+1,tr3+3,0);
    define_links(tr3+5,tr3+4,link_5V,0);//inverter
    }

    /A programban nincs szükség invertálásra, mert a decoder a counter-t dekódolja, ami Dflipfloppokból áll. Azokról pedig közvetlenül levehető a kimenet inverze, hiszen a visszacsatolt rész pont így működik./

Aktív témák