Dit project beschrijft de ontwikkeling van een zelfgebouwde 16-bit relaiscomputer met een Accumulator-architectuur. Het systeem is eerst gesimuleerd in de software "Logic World" voordat de fysieke bouw startte.
Technische specificaties:
- Architectuur: De CPU werkt met een Accumulator-register voor alle rekenkundige en geheugenoperaties. De programmateller (PC) heeft een eigen adder voor efficiëntie.
- Klokmechanisme: Vanwege het gebruik van zelfhoudende relais maakt de klok gebruik van vier verschillende pulsen om data correct te kunnen wissen en wijzigen.
- Instructieset: De computer ondersteunt diverse adresseringsmodi (direct, indirect) en basis subroutines via CALL en RET-operaties.
Hardware en Ontwikkeling: Het systeem is modulair opgebouwd met borden voor controle, adresberekening en een 16-bit ALU. Voor het geheugen en de klokgeneratie worden Arduino's ingezet. Naast de fysieke bouw is een software-simulatie in Excel ontwikkeld om de instructieset te valideren.
Mijlpalen: De computer is in staat tot complexe berekeningen (zoals PI en worteltrekkingen) en heeft Dijkstra's algoritme uitgevoerd voor routeberekeningen. Daarnaast is het systeem uitgebreid met een 32×32 LED-matrix en een FPGA-coprocessor voor wiskundige versnelling.
Homebrew 16-bit Relaiscomputer
Systeemoverzicht
Het relaissysteem is een klassieke Accumulator (Accu) CPU, vergelijkbaar met CPU's uit de jaren '80. Het systeem is aanvankelijk gesimuleerd in het spel "Logic World", waarna de fysieke bouw is gestart.
Architectuur
De CPU is een eenvoudig systeem dat gebruikmaakt van een Accu-register. Alle rekenkundige bewerkingen, evenals alle store- en load-operaties, vinden plaats via de Accu.
Vanwege de focus op "hoge prestaties" binnen een relaissysteem, beschikt de programmateller (Program Counter, PC) over een eigen adder die uitsluitend in staat is om 1 op te tellen bij de programmateller. Er is tevens een register aanwezig dat een retouradres kan opslaan, wat ondersteuning voor één niveau van subroutines mogelijk maakt.
Opmerking over het PCHR register: Het PCHR register is noodzakelijk omdat het niet mogelijk is om de gewijzigde PC (gebaseerd op zijn eigen waarde plus 1) direct terug in de PC te schrijven.
De Klok
Een essentieel detail in het ontwerp is dat alle registers, die zijn gerealiseerd door "zelfhoudende" relais, moeten worden gewist voordat er nieuwe informatie kan worden opgeslagen of voordat bestaande informatie kan worden gewijzigd. Daarom is de klok van dit systeem geen gewone klok zoals gebruikelijk in digitale systemen, maar bestaat deze uit vier verschillende pulsen.
Instructieset en Adressering
De CPU kan het geheugen aanspreken via drie verschillende adresseringsmodi:
- LD X: Laadt de Accu met het datawoord dat is opgeslagen in het adres dat volgt op de opcode.
- LD M(X): Laadt de Accu met de data die is opgeslagen in het geheugenadres dat wordt vermeld na de opcode.
- LD M(M(X)): Indirecte adressering. Het datawoord na de opcode bevat het adres waar de CPU het uiteindelijke adres vindt van het datawoord dat in de Accu moet worden opgeslagen.
Daarnaast is er een set CALL / RET-operaties beschikbaar. Er is geen stack gerealiseerd, waardoor slechts één subroutine-niveau mogelijk is. Het retouradres wordt opgeslagen in het register SR.
Hardwarecomponenten
Het systeem is opgebouwd uit verschillende moduleborden:
- Control board: Verantwoordelijk voor de aansturing.
- Adresberekeningsbord: Verantwoordelijk voor de berekening van adressen.
- ALU en Logica: De 16-bit ALU is opgebouwd uit groene PCB's. Kleinere borden aan de onderzijde implementeren de branch- en carry-logica, samen met het accumulatorregister.
- I/O-decoder: Bevat het 16-bit outputregister en de contactor die een lamp schakelt (gebruikt voor de "1 Hertz challenge").
- Geheugen en Klokgenerator: Deze zijn beide geïmplementeerd met behulp van aparte Arduino's.
Simulatie en Ontwikkeling
Logic World
Voor het ontwerp en het testen van verschillende varianten is het volledige systeem gesimuleerd in het spel "Logic World". Hierin zijn zowel het relais-element als het volledige systeemoverzicht uitgewerkt.
Software-simulatie
Om te controleren of de instructieset van de CPU bruikbaar is, is een software-simulatie ontwikkeld middels een Excel-macro. Met deze macro kan men door de code stappen, registers en het geheugen monitoren en doorgaan tot een breakpoint. Een voorbeeld van deze simulatie is een programma dat twee getallen vermenigvuldigt middels shift-operaties.
Projectmijlpalen en Logboeken
In het verloop van het project zijn de volgende resultaten behaald en functies toegevoegd:
- Berekeningen: Het systeem is in staat om de wortel van 60.000 en de waarde van PI te berekenen. De berekening van PI (nauwkeurig tot 2 decimalen) duurde iets meer dan 8 minuten en vereiste 1.377 stabiele instructies.
- Navigatiesysteem: Het relaissysteem is ingezet als navigatiesysteem.
- Dijkstra's Algoritme: De computer heeft het kortste pad berekend van Eisenstadt naar Innsbruck met behulp van een gewogen graaf van acht Oostenrijkse steden.
- LED-Matrix: Via een tweede Arduino is een 32×32 LED-matrix aangesloten. Een deel van het systeemgeheugen wordt hiervoor gebruikt als videogeheugen (memory-mapped).
- FPGA Coprocessor: Er is een FPGA-bord ontwikkeld dat fungeert als wiskundige coprocessor. De VHDL-code op de FPGA emuleert het ontwerp van het relaissysteem, waardoor routines (zoals de worteltrekking) identiek zijn. De communicatie verloopt via het 16-bit I/O-register.
- Input-poorten: Er is een 16-poorts inputregister gebouwd (relais-geïmplementeerde geschakelde inputs op de databus), omdat het gebruik van outputpoorten als inputs problemen veroorzaakte bij het wissen van het outputregister.
- Adder-ontwerp: Het ontwerp van de adder is geoptimaliseerd, waardoor deze sneller is dan men op basis van de traagheid van relais zou verwachten.
Homebrew 16-bit Relaiscomputer
Systeemoverzicht
Het relaissysteem is een klassieke Accumulator (Accu) CPU, vergelijkbaar met CPU's uit de jaren '80. Het systeem is aanvankelijk gesimuleerd in het spel "Logic World", waarna de fysieke bouw is gestart.
Architectuur
De CPU is een eenvoudig systeem dat gebruikmaakt van een Accu-register. Alle rekenkundige bewerkingen, evenals alle store- en load-operaties, vinden plaats via de Accu.
Vanwege de focus op "hoge prestaties" binnen een relaissysteem, beschikt de programmateller (Program Counter, PC) over een eigen adder die uitsluitend in staat is om 1 op te tellen bij de programmateller. Er is tevens een register aanwezig dat een retouradres kan opslaan, wat ondersteuning voor één niveau van subroutines mogelijk maakt.
Opmerking over het PCHR register: Het PCHR register is noodzakelijk omdat het niet mogelijk is om de gewijzigde PC (gebaseerd op zijn eigen waarde plus 1) direct terug in de PC te schrijven.
De Klok
Een essentieel detail in het ontwerp is dat alle registers, die zijn gerealiseerd door "zelfhoudende" relais, moeten worden gewist voordat er nieuwe informatie kan worden opgeslagen of voordat bestaande informatie kan worden gewijzigd. Daarom is de klok van dit systeem geen gewone klok zoals gebruikelijk in digitale systemen, maar bestaat deze uit vier verschillende pulsen.
Instructieset en Adressering
De CPU kan het geheugen aanspreken via drie verschillende adresseringsmodi:
- LD X: Laadt de Accu met het datawoord dat is opgeslagen in het adres dat volgt op de opcode.
- LD M(X): Laadt de Accu met de data die is opgeslagen in het geheugenadres dat wordt vermeld na de opcode.
- LD M(M(X)): Indirecte adressering. Het datawoord na de opcode bevat het adres waar de CPU het uiteindelijke adres vindt van het datawoord dat in de Accu moet worden opgeslagen.
Daarnaast is er een set CALL / RET-operaties beschikbaar. Er is geen stack gerealiseerd, waardoor slechts één subroutine-niveau mogelijk is. Het retouradres wordt opgeslagen in het register SR.
Hardwarecomponenten
Het systeem is opgebouwd uit verschillende moduleborden:
- Control board: Verantwoordelijk voor de aansturing.
- Adresberekeningsbord: Verantwoordelijk voor de berekening van adressen.
- ALU en Logica: De 16-bit ALU is opgebouwd uit groene PCB's. Kleinere borden aan de onderzijde implementeren de branch- en carry-logica, samen met het accumulatorregister.
- I/O-decoder: Bevat het 16-bit outputregister en de contactor die een lamp schakelt (gebruikt voor de "1 Hertz challenge").
- Geheugen en Klokgenerator: Deze zijn beide geïmplementeerd met behulp van aparte Arduino's.
Simulatie en Ontwikkeling
Logic World
Voor het ontwerp en het testen van verschillende varianten is het volledige systeem gesimuleerd in het spel "Logic World". Hierin zijn zowel het relais-element als het volledige systeemoverzicht uitgewerkt.
Software-simulatie
Om te controleren of de instructieset van de CPU bruikbaar is, is een software-simulatie ontwikkeld middels een Excel-macro. Met deze macro kan men door de code stappen, registers en het geheugen monitoren en doorgaan tot een breakpoint. Een voorbeeld van deze simulatie is een programma dat twee getallen vermenigvuldigt middels shift-operaties.
Projectmijlpalen en Logboeken
In het verloop van het project zijn de volgende resultaten behaald en functies toegevoegd:
- Berekeningen: Het systeem is in staat om de wortel van 60.000 en de waarde van PI te berekenen. De berekening van PI (nauwkeurig tot 2 decimalen) duurde iets meer dan 8 minuten en vereiste 1.377 stabiele instructies.
- Navigatiesysteem: Het relaissysteem is ingezet als navigatiesysteem.
- Dijkstra's Algoritme: De computer heeft het kortste pad berekend van Eisenstadt naar Innsbruck met behulp van een gewogen graaf van acht Oostenrijkse steden.
- LED-Matrix: Via een tweede Arduino is een 32×32 LED-matrix aangesloten. Een deel van het systeemgeheugen wordt hiervoor gebruikt als videogeheugen (memory-mapped).
- FPGA Coprocessor: Er is een FPGA-bord ontwikkeld dat fungeert als wiskundige coprocessor. De VHDL-code op de FPGA emuleert het ontwerp van het relaissysteem, waardoor routines (zoals de worteltrekking) identiek zijn. De communicatie verloopt via het 16-bit I/O-register.
- Input-poorten: Er is een 16-poorts inputregister gebouwd (relais-geïmplementeerde geschakelde inputs op de databus), omdat het gebruik van outputpoorten als inputs problemen veroorzaakte bij het wissen van het outputregister.
- Adder-ontwerp: Het ontwerp van de adder is geoptimaliseerd, waardoor deze sneller is dan men op basis van de traagheid van relais zou verwachten.