8-bit computer op een breadboard

Daarnet in de trein even de tijd gehad om mijn geplande architectuur voor een aparte 16-bit address bus uit te tekenen. Control signals geen tijd voor gehad helaas.
Feedback is welkom.



ADRACC is om relatieve adressering mogelijk te maken. Dat worden simpelweg vier 74LS189's. De ALU worden twee 74181 op termijn (pas nadat ik een aparte address bus heb geïmplementeerd).
Verder OP_hi is de eerste operand byte van een instructie (one-, two- en three-byte instructies is mijn plan). Dat kan gebruikt worden voor de relatieve adressering. OP_lo icm met OP_hi kan gebruikt worden voor absolute adressering. Ik twijfel of ik MAR bidirectionaal moet laten communiceren met de address bus. Weet niet of er situaties zijn waarin ik bijv. MAR OUT, PC IN, CE moet doen (address inc operatie zou dat zijn, weet niet hoeveel snelheidswinst daarmee te behalen valt tov via OP_hi relative addressing met 1 doen). Dat is mijn vraagstuk de komende tijd. Blijft lastig om alle instructies uit m'n hoofd te doen, misschien moet ik eens een instructieset op papier gaan zetten en daarbij de mogelijke control signals bedenken.
Op 9 oktober 2017 15:57:30 schreef tmdr:
Gerard, je ALCI signaal doet mij afvragen of je al nagedacht hebt over een flags register. Want dit signaal zou met een logical AND de ALU in moeten gaan. Hoe heb je dit vormgegeven?


De ALU bestaat in mijn geval uit twee 74LS181’s. De carry out van de minst significante wordt doorverbonden met de Carry In van de meest significante (cascade). Met de Carry In van de minst significante kun je nog een en ander sturen - zie datasheet.

Gerard
Ain't no place like 127.0.0.1
Op 9 oktober 2017 18:24:52 schreef GerardWassink:
[...]

De ALU bestaat in mijn geval uit twee 74LS181’s. De carry van de minst significante wordt doorverbonden met de Carri In van de meest significante (cascade). Met de Carri In van de minst significante kun je nog een en ander sturen - zie datasheet.

Gerard


Begrijp ik, ADD met carry en ADD zonder carry. Maar heb je een flags register geïmplementeerd?
Ben heel benieuwd naar hoe je dat doet? Eén 161 register lijk me namelijk niet optimaal. Zo zijn losse flags niet te setten (voor zo ver ik weet).
Nee, heb ik (nog) niet gedaan. De signalen zijn op de ALU aanwezig en worden direct naar de bus uitgevoerd. Dat vergt dat je ze gebruikt voordat de inhoud van het A of B register veranderen.
Ain't no place like 127.0.0.1
Op 9 oktober 2017 17:21:23 schreef tmdr:
Daarnet in de trein even de tijd gehad om mijn geplande architectuur voor een aparte 16-bit address bus uit te tekenen. Control signals geen tijd voor gehad helaas.
Feedback is welkom.


Hoi Tmdr,

Het valt mij op dat jij de ALU 3 data wegen geeft. vroegâ had deze allen reg A en reg B. Reg A was "volatile" wat zou kunnen betekenen dat iedereen denkt dat het een register is, maar in de praktijk register A de databus zou kunnen zijn. Je zou er een weg kunnen laten volgens mij.

Een 16 bits adressering is een boel draadjes knippen. Heb je die wel nodig? Zou het ook met DatAddrL en DatAddrH kunnen in een burst voor een 8 bits bus. Dan is een memory adress register/buffer wel handig voor de hoogste of laagste byte.

Wat ik leuk vind om te implementeren is de "ticker" die in ARM processoren voorkomt voor multi threading. Deze "counter" wil ik dan als InsAddrH gebruiken en de PC alleen als InsAddrL.

toevoeging:
Dit is ook het spelletje wat ik wil spelen icm de stackpointer om dan weer multi threading inzichtelijk te maken. Wat ik op een breadborad maak, kan ook in een FPGA geintegreerd worden, en weer opgenomen worden in de volgende breadboard wandversiering.

Dromen is wel goedkoper en tijdsefficienter... :)

[Bericht gewijzigd door SuperPrutser op 11 oktober 2017 11:00:01 (14%)]

Op 10 oktober 2017 08:05:30 schreef SuperPrutser:
[...]


Een 16 bits adressering is een boel draadjes knippen. Heb je die wel nodig? Zou het ook met DatAddrL en DatAddrH kunnen in een burst voor een 8 bits bus. Dan is een memory adress register/buffer wel handig voor de hoogste of laagste byte.



Die oplossing zou ik zelf geloof ik ook kiezen. Twee address registers naast het geheugen om te kunnen adresseren, dit in verband met de eenvoud (relatief). Voor meer ingewikkelde instructies heb je dan misschien meer microcode nodig, maar zoals je al schrijft, een stuk minder "draadjes knippen"...

Gerard
Ain't no place like 127.0.0.1
Op 10 oktober 2017 13:22:00 schreef GerardWassink:
[...]

Die oplossing zou ik zelf geloof ik ook kiezen. Twee address registers naast het geheugen om te kunnen adresseren, dit in verband met de eenvoud (relatief). Voor meer ingewikkelde instructies heb je dan misschien meer microcode nodig, maar zoals je al schrijft, een stuk minder "draadjes knippen"...

Gerard


Tsja, ik moet toch iets te doen hebben als ik in de late uurtjes na een lange dag geen tv wil kijken. En haast zit er natuurlijk ook niet achter.
Niets is definitief natuurlijk, dus wie weet verander ik nog van plannen.

Even een snel vraagje. Misschien dat iemand hier een goed idee heeft.
Ik wil een 7-segment display toevoegen aan het A register. Ik wil geen extra OUT register maken namelijk.
Echter, ik heb momenteel alleen common anode displays in huis. Ben werkt met common cathode displays en een 73LS139. Daarmee ga ik de anodes natuurlijk niet kunnen aansturen. Iemand een idee hoe ik dit nu snel op een andere manier kan doen?

Edit: op internet kan ik toch echt niet uitvinden of het nou common anode of cathode is, op het display staat KYX-3461AS. Iemand die het mij kan zeggen?
Behalve het voor de hand liggende antwoord: "uitproberen!", kun je, als het echt common anode is, een paar 74LS04 hex inverter chips gebruiken, klaar is tmdr.

;-)

Gerard
Ain't no place like 127.0.0.1
Op 11 oktober 2017 17:35:22 schreef tmdr:
[...]
Niets is definitief natuurlijk, dus wie weet verander ik nog van plannen.


Dan kan het leuk zijn om alle opties te aanschouwen..
je kan van anode LCD naar kathode LCD overstappen,
een logisch/driver/buffer IC heeft soms ook een uitvoering met geïnverteerde uitgangen.
De tegenhanger van de ULN2003, bijv. iets als UDN2981A kan je inschakelen. -leuk probleem, ik heb ook de "verkeerde" displays :).
Er komt sowieso iets tussen je A reg. lijnen en jouw display aansturing dunkt me. Daardoor zie ik geen probleem in deze situatie. Met software (hex/bin naar 7segment decodertabel)

https://www.banggood.com/Wholesale-1-Pcs-7-Segment-4-Digit-S...mds=search

Het is leuk om van alles aan de bus te hangen, in de datasheet staat iets over Fan-out. (current)Overbelasting lijkt me iets om rekening mee te houden.
Op 11 oktober 2017 17:35:22 schreef tmdr:
Edit: op internet kan ik toch echt niet uitvinden of het nou common anode of cathode is, op het display staat KYX-3461AS. Iemand die het mij kan zeggen?


A=CC
B=CA


Als je het niet vertrouwd kan je ook een diode even 'doormeten'

[Bericht gewijzigd door RAAF12 op 11 oktober 2017 22:30:32 (11%)]

Op 11 oktober 2017 21:24:50 schreef RAAF12:
[...]

A=CC
B=CA
[bijlage]

Als je het niet vertrouwd kan je ook een diode even 'doormeten'


Dat was dus ook wat ik vond, maar in de artikelomschrijving op Ebay stond CA kennelijk. Vandaar mijn verwarring. Heb het inmiddels ook getest en is inderdaad CA.

Nou mooi, kan ik vanavond weer door :)
Want voor een inverter heb ik helaas geen plaats zo naast het A reg.

@Gerard: hopelijk krijg ik de bedrading vanavond voor elkaar zodat ik morgen avond de software kan testen om de ROM te programmeren.
@Gerard: op jouw blog zie ik dat je op je bus board female header gebruikt waar de male headers in passen, maar wél op maat te breken zijn. Dit zijn toch niet van die IC socket header strips?
Hoe kom je aan die headers? Ik heb die nog nergens kunnen vinden.
Op 12 oktober 2017 15:26:14 schreef tmdr:
@Gerard: op jouw blog zie ik dat je op je bus board female header gebruikt waar de male headers in passen, maar wél op maat te breken zijn. Dit zijn toch niet van die IC socket header strips?
Hoe kom je aan die headers? Ik heb die nog nergens kunnen vinden.


Female pin headers, en male headers (haaks) heb ik bij mijn huisleverancier vandaan, OKAPHONE in Groningen.
Ain't no place like 127.0.0.1
Bijgaand mijn idee om te laten kristalliseren. Klok is er nog niet bij. De timer is niet geplaatst. Deze zou ik via de IO bus aan wilen sturen waarbij deze terugkoppeling op de ontbrekende interrupt handler geeft. De pijlen geven de control-"bus" weer.

Ram L0 is meer voor de heap van de stack. Ram L1 voor programma data die bewerkt moet worden. Ram L2 voor de data "die er ook bij hoort" inclusief de rest. De ALU werkt alleen met data uit de register bank, zodat later nog een ALU met registerbank toegevoegd kan worden.

Ik vroeg me af of een interrupt mask register enige nut zou hebben, op dit niveau (enkel vlaggen), lijkt me dat nogal overbodig.

De Accumulator (register A) is de bus zelf. De ALU neemt bij opgaande flank data van de bus "register A", en biedt op de neergaande flank het resultaat aan op de bus "register A".

Ctrl Data register is voor IO data en ?geheugen adressering uit de broncode?. Het command register heeft dezelfde functie, maar dan voor proces gerelateerde data (gegevens).

De uitdaging voor mij is het stoeien met pointer, stack en interrupt. Daarbij komt ook nog dat ik met een rondslingerende pic16f877a het programma van een USB stick wil laden en draaien. Ik ben heel blij met de voorzet die Ben Eater heeft gegeven :)


[Bericht gewijzigd door SuperPrutser op 15 oktober 2017 03:17:01 (18%)]

Op 15 oktober 2017 01:34:21 schreef SuperPrutser:
Bijgaand mijn idee om te laten kristalliseren.
...


Gewetensvraag: is dit nog een 8-bit computer? (zie titel van het draadje)

Als ik lees dat je ook een pic16f877a en een USB aansluiting wilt gebruiken bekruipt mij de gedachte dat dit misschien niet past in de geest van dit topic, die duidelijk om het bouwen van een zeer eenvoudige computer gaat. Maar ik weet dat niet zeker hoor, misschien wil de rest er ook iets over roepen?

Tweede - inhoudelijke - vraag: wat maakt dat je maar liefst drie soorten geheugen introduceert? Hoe heb je dat bedacht? (of zijn het verschillende segmenten in hetzelfde geheugen?). Zekere voor een stack lijkt het me niet handig om die te begrenzen (denk aan recursieve programma's). En het splitsen van programmacode en data in twee soorten geheugens, wat is de gedachte daar achter?

En als derde, de bus gebruiken als accumulator heb ik eerder gelezen. Ga je ook microcode in stappen gebruiken? Want dan wordt de ALU per instructie misschien wel 7 of 8 keer aan het werk gezet (per microcode stap). In de meeste programma's / processoren is register A het meest gebruikte register, ook bij "simpele" geheugenbewerkingen. Welke toegevoegde waarde heeft het dan om het in de BUS te definiëren?

Gerard
Ain't no place like 127.0.0.1
Op 15 oktober 2017 08:06:45 schreef GerardWassink:
[...]
Gewetensvraag: is dit nog een 8-bit computer? (zie titel van het draadje)
Gerard

Het is mijn bedoeling om de bus 8 bits breed te houden. Wel vind ik mijn tekening meer op een u-processor lijken dan een u-controller.


Als ik lees dat je ook een pic16f877a en een USB aansluiting wilt gebruiken bekruipt mij de gedachte dat dit misschien niet past in de geest van dit topic, die duidelijk om het bouwen van een zeer eenvoudige computer gaat. Maar ik weet dat niet zeker hoor, misschien wil de rest er ook iets over roepen?
Gerard

De disk drive van een 8bit PC gebruikte ook een 16 bits brede parallel ATA bus.


Tweede - inhoudelijke - vraag: wat maakt dat je maar liefst drie soorten geheugen introduceert? Hoe heb je dat bedacht? (of zijn het verschillende segmenten in hetzelfde geheugen?).
Gerard

Meestal wordt aan het einde van de rit memory mapping toegepast. Idd zou ik L0 en L1 samen kunnen voegen. Omdat ik het mogelijk wil houden om er nog een ALU bij te plaatsen vind ik het handiger om het eerst als fysiek gescheiden geheugens te beschouwen. Een byte als bv een ASII karakter hoeft niet per se door de ALU bewerkt te worden, dan hoeft deze ook niet in de buurt te komen. Dit scheelt volgens mij overbodige (tijdrovende) verplaatsingen.


En als derde, de bus gebruiken als accumulator heb ik eerder gelezen. Ga je ook microcode in stappen gebruiken? Want dan wordt de ALU per instructie misschien wel 7 of 8 keer aan het werk gezet (per microcode stap). In de meeste programma's / processoren is register A het meest gebruikte register, ook bij "simpele" geheugenbewerkingen. Welke toegevoegde waarde heeft het dan om het in de BUS te definiëren?
Gerard


Dit gaat volgens mij veel verplaatsingen schelen. Vroegâ waren de data in de accu, en het ALU resultaat ook vluchtig. Hierdoor denk ik dat het idee om de bus als register A te gebruiken niet zo vreemd is. Waar ik ook aan zat te denken is verschillende ALU's bij de RAM data poort plaatsen. Deze voorzien dan in unieke bewerkingen (ROL / SUB / SBI / TAN)
Op 15 oktober 2017 08:06:45 schreef GerardWassink:
[...]

Gewetensvraag: is dit nog een 8-bit computer? (zie titel van het draadje)

Als ik lees dat je ook een pic16f877a en een USB aansluiting wilt gebruiken bekruipt mij de gedachte dat dit misschien niet past in de geest van dit topic, die duidelijk om het bouwen van een zeer eenvoudige computer gaat. Maar ik weet dat niet zeker hoor, misschien wil de rest er ook iets over roepen?


Ik persoonlijk vind het helemaal geen probleem. Mij gaat het om het leren over dit soort computers en hoe lastiger het wordt hoe leuker ik het vind. Zo lang we niet veel verder gaan dan een willekeurige 8-bit MCU van de huidige tijd moet het tot op zekere hoogte voor iedereen die de originele serie van Ben heeft gevolgd nog enigszins te begrijpen zijn. Zelf vind ik de computer die Ben heeft gebouwd een leuk uitgangspunt, maar wil zelf toch iets verder gaan. Onder aan de streep wordt het toch nooit bijzonder complex. Bovendien moeten we denk ik stimuleren dat we buiten het boekje om gaan en zelf nieuwe dingen proberen en uitzoeken. De theorie van Ben is een mooie jumpstart, maar daarna moet je zelf voor de uitdaging zorgen.

We hebben trouwens al lange tijd niets van Ben vernomen. Zou hij definitief stoppen omdat de computer af is? Zou hij misschien werken aan uitbreidingen voor een vervolg? Ik hoop natuurlijk dat laatste.

Wat betreft een USB aansluiting om bijv software voor de computer te laden denk ik overigens dat dat meer een hulpmiddel is dan een uitbreiding op de computer zelf. Zo wil ik EEPROM gaan gebruiken voor de opslag van programma’s. Dat is met een separate programmer te programmeren. Maar je zou ook aan iets van IO kunnen denken, om een autonoom systeem te realiseren. In feiten is dat niet veel anders dan de DIP switches van Ben’s design, maar misschien iets gebruiksvriendelijker/sneller (@Gerard: op een keyboard HEX tikken bijv) ;-)

Edit: ik zou het leuk vinden als er wat foto’s van de computers geplaatst worden. Ik ga dit ook zo snel mogelijk doen. Schaam me alleen nog een beetje want er zijn wat dingen die nog niet zo netjes zijn helaas. Haha.
fred101

Golden Member

Ipv of naast dip-schakelaars om de boel te programmeren, lijkt het mij leuker om een soort ponskaart lezer te maken (8 diodes met 8 fotocellen en een stukje karton waar je gaatjes in stanst (oude perforator verbouwen) Heb je gelijk een opslagmedium.
Je kunt natuurlijk ook een schijf gebruiken. Dan berg je ze op in een oud floppy hoesje.

Of een rond stuk kunststof staf waar je een berg gaatjes in tapt. 8 naast elkaar. Daar kleine boutjes in, steeds rijen van 8 naast elkaar. De omtrek bepaald de "opslag capaciteit" Die rol hang je boven een rij microswitches. De rol 1x rond en het programma is geladen. Dat is een rewritable fredisk. Je kunt er ook stukjes plastic oplijmen voor de read only variant. :-)
www.pa4tim.nl, Reparatie van meet- en calibratie apparatuur, ook oud en exotisch
Is een floppy interface bouwen voor een bestaande floppy drive dan niet handiger? Kun je ook nog eens iets schrijven en het scheelt bijzonder veel knutselwerk. Zou je kunnen kijken naar hoe The Woz destijds zijn eigen floppy interface voor de 6502 Apple I en II heeft gedaan. Zal vast informatie over te vinden zijn.

Floppy’s verkrijgen zal alleen wat lastig zijn misschien. Of worden die tegenwoordig al weer gemaakt?
maartenbakker

Special Member

Op 15 oktober 2017 10:45:55 schreef SuperPrutser:

[...]
De disk drive van een 8bit PC gebruikte ook een 16 bits brede parallel ATA bus.


Niet heel raar als je bedenkt dat een 8-bit PC geen 8 bits had maar 16. Er zat alleen een wat smallere bus tussen zodat de 16 bits niet tegelijk gecommuniceerd konden worden. Overigens bestonden er in mijn herinnering wel degelijk 8-bits ATA bussen...
"The mind is a funny thing. Sometimes it needs a good whack on the side of the head to jar things loose." - Disclaimer: ik post soms vanaf een tablet, het is geen doen om alle autocrrect, ontbrekende spaties en off-by-ones er uit te halen.
Vraagje: wat voor draad gebruiken jullie?
Tot op heden heb ik al twee setjes van dit Adafruit assortiment besteld:
https://www.sossolutions.nl/3175-hook-up-wire-spool-set-22aw...-10-x-25ft
Echter ga ik er vrij snel doorheen. Zeker met de veelgebruikte kleuren. Nu kreeg ik de tip voor deze:
https://www.rapidonline.com/rapid-100m-reel-1-0-6-1-of-each-...ls-01-0380

Incl verzendkosten is dat wel bijzonder veel geld (voor mij dan). Je krijgt er wel wat voor natuurlijk.
Eventueel zouden we eens kunnen kijken of het loont om meerdere sets in één zending te laten komen en die vervolgens binnen NL goedkoper te versturen naar elkaar.

Maar goed, als iemand een soortgelijke leverancier in NL weet, zou dat nog beter zijn.
Ik ben nu namelijk heel zuinig met draad dus denk ik altijd 3x na voordat ik iets ga maken en probeer ik zo veel mogelijk rekening te houden met geplande aanpassingen.
Wikkeldraad 0,2 mm, Posyndraad genaamd, is heel goed te gebruiken.
Of anders een UTP kabel afpellen.
Wikkeldraad heeft alleen maar 1 kleur,is dat bezwaarlijk?

[Bericht gewijzigd door mel op 16 oktober 2017 19:22:56 (21%)]

u=ir betekent niet :U bent ingenieur..
Bij Budgetronincs.nl heb ik in juni Assortiment zwakstroomdraad met massieve kern gekocht. (KAB140B)

Dit is 0.2 mm2 dia ipv de aanbevolen 0.22m2. Dit is wel te merken aan de mechanische weerstand. Ook het kontaktoppervlak is kleiner. (HF stromen gaan alleen over het oppervlak van de geleider -> skin effect).

Ik heb er 14,95 voor betaald, inclusief reiskosten vond ik het eigenlijk iets te prijzig. 80 meter, 10 meter per kleur, 22,5ct p/m.

UTP kabel altijd bewaard voor dit doel, koop alleen meer als ik van kritieke kleuren tekort ga komen (rood/zwart). Maar die draden mogen dan weer wat dikker zijn. Bijvoorbeeld zoals Ben heeft gedaan met een 2x3 pins breed voetje.

[Bericht gewijzigd door SuperPrutser op 16 oktober 2017 19:48:39 (21%)]

Het idee van de USB stick komt voort uit mijn ervaring met een antieke pc en de ontwikkeling aangaande bootloader.
Bij primitieve PC's moest eerst een DOS dis geladen worden. Hierna kon pas een applicatie-drager worden ingevoerd. Allemaal heel omslachtig. Als ik de BIOS en OS kan integreren scheelt dat gekloot met EEPROMs. Het resultaat is dan een general purpose processing unit die eenvoudiger bedienbaar is. Wellicht kan ik voor Python een compiler maken als ik verder droom. (alles ligt nog in de kast :))
fred101

Golden Member

De eerste stap is gezet, even snel de klok in elkaar gezet (het drie maal 555 deel met de leds en schakelaars op gaatjesprint) Eigenlijk geen tijd maar als de eerste stap er is gaat de rest makkelijker. Het voordeel is dat het vrij modulair is. Dat maakt bouwen en testen makkelijker.

Ik loop nog steeds met het idee een Z80 singleboard computertje te maken wat in assembler geprogrammeerd kan worden. Iets met een 7 segment display, en geschikt om er dingen aan te kunnen knopen. LEDs, schakelaars, sensors etc. Een soort easypic/retro arduino maar dan met Z80. Ik heb Z80's, PIO's, DART's, eproms en diverse smaken RAM.
En dan een hollorith kaart lezer maken. :-) Jeugtsentiment, ik had vroeger een ZX81 en een Spectrum. De eerste zwaar gemodificeerd. Helaas zijn ze bij een verhuizing verdwenen.
www.pa4tim.nl, Reparatie van meet- en calibratie apparatuur, ook oud en exotisch