{"id":252,"date":"2021-08-25T08:16:00","date_gmt":"2021-08-25T06:16:00","guid":{"rendered":"https:\/\/www.dev-tronic.de\/?p=252"},"modified":"2021-08-25T08:17:00","modified_gmt":"2021-08-25T06:17:00","slug":"die-homebrew-cpu","status":"publish","type":"post","link":"https:\/\/www.dev-tronic.de\/?p=252","title":{"rendered":"Die Homebrew CPU"},"content":{"rendered":"\n<p>Inspiriert durch die &#8222;8 bit CPU from scratch&#8220; von <a href=\"http:\/\/eater.net\">Ben Eater<\/a> hatte ich den Wunsch, \u00e4hnliches zu bauen. Dabei wollte ich das Projekt nicht auf dem Breadboard verwirklichen sondern lieber eine sch\u00f6ne Platine zum l\u00f6ten erstellen.<\/p>\n\n\n\n<p>Au\u00dferdem sollte der Adressbus 12 Bit breit sein und ein Speicher (ROM oder RAM oder beides) von maximal 4 Kilobyte zur Verf\u00fcgung stehen.  Au\u00dferdem wollte ich eine 8 Bit ALU implementieren. Alle Funktionen sollten auch mit LED&#8217;s sichtbar gemacht werden.<\/p>\n\n\n\n<p>Bereits am 18.10.2020 begann ich damit, eine entsprechende  Schaltung zu entwerfen. Noch am gleichen Tag war die erste Version fertig gestellt und ich bestellte entsprechende Platinen, die am 28.10. eintrafen. Die erste Version war ein vollkommener Reinfall, jede menge Fehler im Design.  Einige Teile, wie zum Beispiel die Register funktionierten aber dennoch. Das war zumindest ermutigend.<\/p>\n\n\n\n<p>In Betrieb genommen sah das Ganze aber dennoch bunt und durchaus beeindruckend aus:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"539\" height=\"715\" src=\"https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/01\/HomerBrewCPU_V1-e1611948930635.jpg\" alt=\"\" class=\"wp-image-253\" srcset=\"https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/01\/HomerBrewCPU_V1-e1611948930635.jpg 539w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/01\/HomerBrewCPU_V1-e1611948930635-226x300.jpg 226w\" sizes=\"auto, (max-width: 539px) 100vw, 539px\" \/><\/figure>\n\n\n\n<p>Es wurde also eine zweite Version f\u00e4llig. In der zweiten Version waren nat\u00fcrlich viele Fehler behoben und neue Fehler tauchten auf. Zu allem \u00dcberfluss vertauschte ich auf der Platine noch zwei Gatter, was nat\u00fcrlich zu sehr schwer nachzuvollziehenden Fehlern f\u00fchrte. Bei den Tests fiel dann noch auf, das die ALU nicht ganz richtig funktioniert. Das Adressregister wollte auch nicht so recht. <\/p>\n\n\n\n<p>Der neue Aufbau war im \u00fcbrigen zum Teil mit SMD Bauteilen aufgebaut. Alle LED&#8217;s und deren Vorwiderst\u00e4nde. Ich habe alles von Hand mit einem kleinen L\u00f6tkolben, einer Pinzette und einer Lupe gel\u00f6tet. Das war anstrengend und war am Ende auch nicht besser. \ud83d\ude42<\/p>\n\n\n\n<p>F\u00fcr Version 2 hatte ich bereits einen Teil des Mikrocodes erstellt. Dieser definiert sozusagen die &#8222;Befehle&#8220;, die die CPU ausf\u00fchren kann. Fr\u00fche Prozessoren funktionierten auch nach diesem Prinzip. <\/p>\n\n\n\n<p>So sah die zweite Version aus (Nat\u00fcrlich wieder beeindruckend leuchtend):<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"588\" src=\"https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/01\/HomerBrewCPU_V2.jpg\" alt=\"\" class=\"wp-image-254\" srcset=\"https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/01\/HomerBrewCPU_V2.jpg 500w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/01\/HomerBrewCPU_V2-255x300.jpg 255w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure>\n\n\n\n<p>Tja, es musste also eine dritte Version entstehen. Schaltplan \u00fcberarbeitet: ALU korrigiert, Adressz\u00e4hler korrigiert, Steuersignale neu verteilt (Einige davon aus dem Mikrocode in den Schaltplan verlegt), Taktgeber korrigiert, Verzicht auf Bustreiber f\u00fcr die LED&#8217;s um Platz auf der Platine zu schaffen und ehrlich gesagt auch aus Kostengr\u00fcnden. <\/p>\n\n\n\n<p>Die erforderlichen Platinen wurden bestellt und trafen am 27.01.2021 ein. Nun ist wieder l\u00f6ten angesagt:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"997\" src=\"https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/01\/20210129_191206-1024x997.jpg\" alt=\"\" class=\"wp-image-251\" srcset=\"https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/01\/20210129_191206-1024x997.jpg 1024w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/01\/20210129_191206-300x292.jpg 300w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/01\/20210129_191206-768x748.jpg 768w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/01\/20210129_191206-1536x1496.jpg 1536w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/01\/20210129_191206-2048x1994.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Phase 1: SMD LED&#8217;s und Vowiderst\u00e4nde l\u00f6ten<\/figcaption><\/figure>\n\n\n\n<p><\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p>Die L\u00f6tarbeiten haben wieder einige Stunden in Anspruch genommen. Dabei sind mir leider auch ein paar SMD LED&#8217;s kaputt gegangen, die ich dann ersetzen musste. Das war ein wenig tricky. Sie wollten sich nicht so richtig l\u00f6sen. Unten rechts auf der Platine l\u00f6ste sich sogar eine Leiterbahn von der Platine<\/p>\n<\/div>\n<\/div>\n\n\n\n<p><strong>05.02.2021. <\/strong><\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:100%\">\n<p>Zwischenzeitlich war die komplette Platine aufgebaut und diverse Tests hatten begonnen. Bei den Tests fand ich zun\u00e4chst noch eine fehlende Verbindung, die ich mit einer kurzen Kabel manuell erstellt habe. Bei den Tests stellt sich heraus, dass ich im Design einen Denkfehler hatte. Ich hatte drei Steuersignale (Counter out [CO], Counter Enable [CE] und Memory Address In [MAI] zusammengelegt um so Takte zu sparen bzw. f\u00fcr umfangreichere Befehle mehr Platz in einem Zyklus zu haben. <\/p>\n<\/div>\n<\/div>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"791\" height=\"1024\" src=\"https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141503-791x1024.jpg\" alt=\"\" class=\"wp-image-265\" srcset=\"https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141503-791x1024.jpg 791w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141503-232x300.jpg 232w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141503-768x994.jpg 768w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141503-1187x1536.jpg 1187w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141503-1583x2048.jpg 1583w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141503-scaled.jpg 1979w\" sizes=\"auto, (max-width: 791px) 100vw, 791px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<p>Das war ein gro\u00dfer Fehler, da diese Signale in vielen F\u00e4llen auch getrennt vorkommen k\u00f6nnen. Ich musste deshalb auf das Signal Cycle Break [CYB], welches einen Prozessorzyklus bei kurzen Befehlen vorzeitig beenden konnte, verzichten, um die drei genannten Signale wieder trennen zu k\u00f6nnen. Mit einigen L\u00f6tbr\u00fccken und durchtrennten Leiterbahnen war es mir m\u00f6glich. Der Preis ist allerdings eine erheblich langsamere Verarbeitung, da jetzt immer 8 Takte f\u00fcr einen Befehl durchlaufen werden, obwohl weniger erforderlich w\u00e4ren.<\/p>\n<\/div>\n<\/div>\n\n\n\n<p>Nunja&#8230; Weiter mit den Tests. Als n\u00e4chstes stellt ich fest, dass die Memory-Einheit nicht funktioniert. Die Daten (Das Programm), welche sich im EEProm befinden, erscheinen nicht auf dem Bus&#8230;..<\/p>\n\n\n\n<p>Da musste ich erst einmal verdauen und quittierte mit einer Pause&#8230;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><strong>13.03.2021 \/ 14.03.2021:<\/strong><\/p>\n\n\n\n<p>Weitere Tests liefen an. Jetzt intensives Messen der Signale am Sockel des EEProm. Chip Enable der Bausteins wird ordentlich an den Chip gelegt. Output Enable kommt auch an. Die Addresse wird ebenfalls korrekt an das EEProm angelegt&#8230;. Write Enable des EEProm liegt auf High-Pegel. Trotzdem kommen keine Informationen aus dem Speicher auf den Datenleitungen an. Zun\u00e4chst wieder mal keine Ahnung, warum das so ist.<\/p>\n\n\n\n<p>Ich schaute mir noch einmal meinen Schaltplan an und staune: An meinem EEprom (und auch am parallel liegenden SRAM) fehlen die Anschl\u00fcsse f\u00fcr Pin 22 und Pin 19 (A9 und A10). Diese hei\u00dfen im Plan stattdessen genauso wie I0 und I1 (die ersten beiden Bits des Datenbusses). Pin 22 hie\u00df 9, I0 ebenfalls, Pin 19 hie\u00df 10, I1 ebenfalls. Das Symbol des Bausteins HM6116P, welches ich als Footprint f\u00fcr das EEProm und das SRAM verwendet habe, ist fehlerhaft.<\/p>\n\n\n\n<p>Hatte ich das Symbol entworfen?? Ich erinnere mich nicht!! Die Folge war jedenfalls, dass Die Adressleitung A9 mit dem Datenbit 0 und die Adressleitung A10 mit dem Datenbit 1 verbunden war. Das zu korrigieren (Die passenden Punkte auf der Leiterplatte f\u00fcr die Reparatur zu finden, Leiterbahnen zu durchtrennen und neue Verbindungen zu schaffen) hat mich 3 Stunden gekostet. <\/p>\n\n\n\n<p>Nachdem das endlich korrigiert war, musste ich erneut testen. Das ern\u00fcchternde Ergebnis: Es funktioniert weiterhin nicht!!<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"814\" height=\"1024\" src=\"https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141405-814x1024.jpg\" alt=\"\" class=\"wp-image-267\" srcset=\"https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141405-814x1024.jpg 814w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141405-238x300.jpg 238w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141405-768x966.jpg 768w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141405-1221x1536.jpg 1221w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141405-1627x2048.jpg 1627w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141405-scaled.jpg 2034w\" sizes=\"auto, (max-width: 814px) 100vw, 814px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"389\" src=\"https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141342-1024x389.jpg\" alt=\"\" class=\"wp-image-268\" srcset=\"https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141342-1024x389.jpg 1024w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141342-300x114.jpg 300w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141342-768x292.jpg 768w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141342-1536x583.jpg 1536w, https:\/\/www.dev-tronic.de\/wp-content\/uploads\/2021\/03\/20210314_141342-2048x778.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Links die professionelle Korrektur der fehlerhaften Adress- und Datenleitungen. Oben Ein Signaltest am Sockel des SRAM-Bausteins. Adresse, Output Enable und Daten werden per LED angezeigt.<\/p>\n<\/div>\n<\/div>\n\n\n\n<p><strong>19.06.2021 &#8211; 25.08.2021:<\/strong><\/p>\n\n\n\n<p>Die Summe der Fehler aus der Version vom 13.03.2021 war am Ende zu gro\u00df und sie mit der Trennung von Leiterbahnen und das Verlegen von Ersatzleitungen erwies sich am Ende zu aufw\u00e4ndig. Also habe ich den korrigierten Schaltplan am 14.06.2021 erneut als PCB bestellt. Der Versand durch JLCPCB erfolgte am 19.06.2021. Wann die Platinen genau angekommen sind, wei\u00df ich nicht mehr genau. Es ging aber sehr schnell.<\/p>\n\n\n\n<p>Die neuen PCB&#8217;s wollten sogleich best\u00fcckt werden. Parallel zur PCB-Bestellung hatte ich die passenden Bauteile bestellt. Es sind ja doch so einige erforderlich. Die EEProms und den RAM-Baustein waren immer gesockelt und k\u00f6nnen auch weiter genutzt werden. Alle anderen Bauteile hatte ich ohne Sockel best\u00fcckt. Diese waren in den Vorg\u00e4ngerversionen dann verloren.<\/p>\n\n\n\n<p>Die ersten Tests der neuen Platine waren durchaus vielversprechend. Allerdings habe ich nur kurz ein paar Kleinigkeiten getestet und dann eine kleine &#8222;Sommerpause&#8220; eingelegt.<\/p>\n\n\n\n<p>Ab dem 16.08.2021 gingen die echten Tests los. Es hat sich herausgestellt, dass der Mikrocode ein paar Fehler enthielt. Diese zu korrigieren war nicht ganz leicht, da seit dem Beginn des Projekts doch einiges an Zeit verstrichen war. Ansonsten konnten die &#8222;Maschinenbefehle&#8220; aber mit Drahtbr\u00fccken statt dem EEProm mit dem Programm simuliert werden. Und die Ergebnisse dieser Tests sahen ebenfalls positiv aus.<\/p>\n\n\n\n<p>Also musste ein kleines Programm der einzelnen Maschinenbefehle her, um alle Befehle und den Mikrocode einmal zu testen. Komischerweise hat das \u00fcberhaupt nicht funktioniert. Aus dem EEProm kam \u00fcber den Datenbus selten raus, was eigentlich drin war. Nichts hat funktioniert. Nach langen Tests und dem Wissen, dass mit Drahtbr\u00fccken statt EEProm alle Befehle so funktioniert haben, wie es der Mikrocode vorgesehen hatte, hatte ich den Verdacht, dass die Ausgangssignale des EEProm zu schwach sein k\u00f6nnten, um die Elektronik drumherum (Datenbus, SMD-LED&#8217;s) zu treiben. <\/p>\n\n\n\n<p>Am 21.08.2021 entwickelte ich deshalb eine kleine Huckepackplatine f\u00fcr den EEProm-Sockel auf dem neben einem Sockel f\u00fcr das EEProm zus\u00e4tzlich ein Latch (74HCT573) sitzt, welches die Ausgangssignale verst\u00e4rkt. Das Prinzip funktioniert zwar grunds\u00e4tzlich, aber eben nicht vollst\u00e4ndig. An dem Punkt habe ich das Projekt wieder zur Seite gelegt, da ich nicht in der Lage bin, das Problem auf Anhieb zu beseitigen.<\/p>\n\n\n\n<p>Es wird also eine weitere Test- und Korrekturrunde geben&#8230;.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Inspiriert durch die &#8222;8 bit CPU from scratch&#8220; von Ben Eater hatte ich den Wunsch, \u00e4hnliches zu bauen. Dabei wollte ich das Projekt nicht auf dem Breadboard verwirklichen sondern lieber eine sch\u00f6ne Platine zum l\u00f6ten erstellen. Au\u00dferdem sollte der Adressbus 12 Bit breit sein und ein Speicher (ROM oder RAM oder beides) von maximal 4 Kilobyte zur Verf\u00fcgung stehen. Au\u00dferdem wollte ich eine 8 Bit ALU implementieren. Alle Funktionen sollten auch mit LED&#8217;s sichtbar gemacht werden. Bereits am 18.10.2020 begann<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[29],"tags":[30],"class_list":["post-252","post","type-post","status-publish","format-standard","hentry","category-homebrew_cpu","tag-homebrew-cpu"],"_links":{"self":[{"href":"https:\/\/www.dev-tronic.de\/index.php?rest_route=\/wp\/v2\/posts\/252","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dev-tronic.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dev-tronic.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dev-tronic.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dev-tronic.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=252"}],"version-history":[{"count":7,"href":"https:\/\/www.dev-tronic.de\/index.php?rest_route=\/wp\/v2\/posts\/252\/revisions"}],"predecessor-version":[{"id":507,"href":"https:\/\/www.dev-tronic.de\/index.php?rest_route=\/wp\/v2\/posts\/252\/revisions\/507"}],"wp:attachment":[{"href":"https:\/\/www.dev-tronic.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=252"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dev-tronic.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=252"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dev-tronic.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=252"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}