Von klassischer Logik zu modernen Lösungen

Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 734
Registriert seit: Apr 2014
Bewertung: 5
#1
28.12.2018, 18:56

Hallo zusammen,

viele kennen ja inzwischen meinen Thread "Z80Ardu" hier im Forum. Und obwohl dieses Projekt noch längst nicht abgeschlossen ist, denke ich schon mal über neue Designs nach. Zum Beispiel ein Design, bei dem dann (bedauerlicherweise) kein Arduino (bzw. der darauf befindliche Atmega328) mehr zum Einsatz kommt. Ein Design, welches sein Bootprogramm mit den wichtigsten Funktionen aus einem EEprom bezieht.

Dafür ist natürlich eine andere Speicherlogik notwendig. Denn da wäre ein 2 KB großes EEProm. Parallel dazu haben wir ein 64 KB großes RAM. Und ab Adresse E000h beginnt das 8 KB Video-RAM. Im aktuellen Z80Ardu-Design wird der richtige Speicher über 2 UND-Gatter und 2 ODER-Gatter ausgewählt. Die Adressleitungen A12-A15 des Z80 teilen den Speicher mit dieser Logik in 56 KB RAM und 8 KB Video-RAM.

Welcher Baustein gerade aktiv ist, wird über den Pin /CS des jeweiligen RAM-Bausteins bestimmt. Ein Low-Signal am jeweiligen Pin aktiviert den Baustein.

Jetzt benötige ich jedoch ein Design, welches den Speicher, wie oben beschrieben, in 3 Blöcke teilt. 2, 54 und 8 KB. Die dafür erforderliche Logik sieht wie folgt aus:

   

Dafür werden 4 ODER-Gatter, 3 UND-Gatter und 2 INVERTER benötigt. Also 3 IC's. Da habe ich mir überlegt, ob das nicht auch mit weniger geht. Und bin ich auf die Idee gekommen, einen AtTiny2313 zu verwenden. Der hat 2 KB Flash und ist mit 20 Pins auch nicht allzu groß. Und schon kann man sich eine komplexe Schaltung sparen. Stattdessen wird nur ein kleines Programm auf dem Controller benötigt.

 
; Memory-Decoder 5 zu 3
; MemReq + /RD --> /RD
; MemReq + /WR --> /WR
 
; *------*
; PA2 -* *- Vcc
; * *
; PD0 -* *- PB7
; * *
; PD1 -* *- PB6
; * *
; PA1 -* *- PB5
; * *
; PA0 -* *- PB4
; * *
; A11 ->PD2 -* *- PB3
; * *
; A12 ->PD3 -* *- PB2 --> E000h - FFFFh
; * *
; A13 ->PD4 -* *- PB1 --> 0800h - DFFFh
; * *
; A14 ->PD5 -* *- PB0 --> 0 - 07FFh
; * *
; Gnd -* *- PD6 <- A15
; * *
; *------*
 
rjmp start


start: ldi r16,low(RAMEND) ; Stack ans RAM-Ende packen
out spl, r16

ldi r16,0xff
out ddrb,r16 ; Port B auf Ausgabe
out portb,r16 ; Ausgänge alle auf High

ldi r16,0x00
out ddrd,r16 ; Port D auf Eingabe

; PORT D lesen
loop: in r16, pind ; Port D lesen

lsr r16 ; die unteren 2 Bit nach rechts raus schieben
lsr r16

; Prüfen, welche Adressen gesetzt sind und den entsprechenden
; Memory-Selector aktivieren

; kein Adressbit gesetzt dann ist PB0 auf low (=0000h - 07FFh)
ldi r17,0b00000110
ldi r18,0x00
cp r16,r18
breq setmem

; die Adressbits 15,14 und 13 sind mindestens gesetzt
; dann ist PB2 auf low (= E000h - FFFFh)
ldi r17,0b00000011
ldi r18,0x1B
cp r16,r18
brge setmem

; Alle anderen Kombinationen führen zu PB1 auf low
; (= 0800h - DFFFh)
ldi r17,0b00000101
setmem:

out portb,r17
rjmp loop


 

ich weiß noch nicht, ob das im echten Leben so funktionieren wird. Es könnte tatsächlich sein, dass der AtTiny2313 bei maximaler Geschwindigkeit dennoch zu langsam ist. Schließlich sind selbst die langsamsten Gatter immer noch sauschnell.

Ich werde das natürlich testen.... Mal sehen, was dabei raus kommt.

Grüße
Uni
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
(Dieser Beitrag wurde zuletzt bearbeitet: 13.04.2019, 13:18 von Unilein.)
Zitieren
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 734
Registriert seit: Apr 2014
Bewertung: 5
#2
30.12.2018, 16:48

Hallo Leute,

heute habe ich die Theorie mal in die Praxis umgesetzt und den ATTiny2313 wie zuvor beschrieben programmiert. Danach habe ich einen Z80-Prozessor dazu gebracht, einfach alle Adressen durchzunudeln und dabei NOP's (No Operation) durchzuführen. So läuft der Prozessor quasi in einer Dauerschleife. Der Z80 war dabei mit 4 MHz getaktet. Das entspricht der Taktfrequenz eines Z80B-Modells.

Zunächst habe ich versucht, die Schaltvorgänge des ATTiy2313 mit LED's darzustellen. Das war aber aufgrund der Geschwindigkeit unmöglich. Meine Augen waren nicht schnell genug. Dann habe ich die Taktfrequenz des Z80 auf wenige Takte pro Sekunde herab gesetzt (mit einem kleinen Timer aus einem Inverter; übrigens auch hier im Forum beschrieben).

Irgendwie hat das nicht geklappt. Lediglich der Z80 wurde ordentlich warm.

Zu guter letzt habe ich meinen Z80Ardu genommen und dessen Adressleitungen A11-A15 direkt mit demATTiny verbunden. Die Signale an PB0, PB1 und PB2 (welches die Chipselect-Signale sind) habe ich mit meinem Oszi visualisiert. Und siehe da: es klappt. Ich muss allerdings dazu sagen, dass der interne Taktgeber des AtTiny zu langsam ist. Dieser bringt lediglich 8 MHz. Ich habe den AtTiny also mit externen Bauteilen auf 20 MHz getaktet. Damit gehts dann.

Das Programm auf dem Tiny benötigt für jeden Schleifendurchlauf 11 µS (maximal). Das sind 1,81 Millionen Durchläufe pro Sekunde. Für eine Speicherlogik  eines mit 4 MHz getakteten Z80 reicht das aus. Bei höhrem Takt wird es aber unter Umständen kritisch. Wenn in einem Programm auf dem Z80 ständig zwischen den Speicherbänken hin-und-her gesprungen wird, hätten wir theoretisch bei jedem zweiten Takt eine Änderung der Speicherbank. Das würde schief gehen, da 1,81 Mio Durchläufe dann zu wenig wären.

Bei 4 MHz auf dem Z80 sollte das aber kein Problem sein, da der sogenannte Instruction-Fetch zwischen 3 und 5 Takte benötigt. Es ist also bei der Umschaltung der Speicherbänke maximal mit einem Drittel der Taktfrequenz zu rechnen. Bei einem Z80 mit 10 MHz sähe das allerdings anders aus....

Naja... Spannend, wie ich finde.

Ich bleibe zunächst mal bei den normalen Gattern. Aber gelegentlich bestelle ich mal eine Platine, die mit dem neuen Design arbeitet.

Liebe Grüße
Uni
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
(Dieser Beitrag wurde zuletzt bearbeitet: 30.12.2018, 17:05 von Unilein.)
Zitieren
Unilein
Fachgebiet Rauchentwicklung
*******

Beiträge: 734
Registriert seit: Apr 2014
Bewertung: 5
#3
13.04.2019, 14:01

Übrigens:

eine derartige Vereinfachung hat man bereits in den frühen Heimcomputerzeiten angestrebt. Im Sinclair ZX81 gab es den ULA-Chip, der die Funktion von 18 Chips in sich vereinte. Auch im C64 gab es solche Bausteine in späteren Platinenrevisionen. Und das Vorbild zum Z80Ardu, der Laser 210 bzw der größere Bruder Laser 310 hatte später auch solche Chips an Bord.

Häufig hat man auch sogenannte GAL's (https://de.wikipedia.org/wiki/Programmable_Array_Logic), programmierbare Logikbausteine, genutzt, um besondere Funktionalitäten zu schaffen oder Bausteine einzusparen. Ging ein solcher Baustein über die Wupper, war es meist sehr schwierig Ersatz zu beschaffen, da die interne Logik unbekannt war und man diese nicht so ohne Weiteres nachbauen konnte.

GAL's sind heute eher nicht mehr zu finden. Sie wurden durch CPLD's ersetzt.

Man kann sie aber auch durch Mikrocontroller ersetzen und hat dort dann auch noch wesentlich mehr Möglichkeiten!

Grüße
Uni
-----

Klopapier beidseitig verwenden und der Erfolg liegt auf der Hand!
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste