Logikproblem: Speicherbank umschalten

unilein

Mitglied
01. Dez. 2013
74
6
8
54
Henau
Sprachen
  1. ANSI C
  2. Assembler
  3. PHP
Hallo zusammen,

ich stecke gerade bei der Entwicklung einer Speicherlogik fest. Ich habe einen Adressraum von 64 Kb und ich möchte bei verschiedenen Adressbereichen auf einen anderen Speicherchip umschalten. Der Adressbus ist 16 Bit breit, die oberen 3 Bit sollen und ich möchte folgendermaßen vorgehen:

Die oberen 3 Bit (Bit 14-16) kämen für die Chipauswahllogik in Frage.

Chip 1: Adressbereich $0000 - $7FFF, (Bitmuster 000) = 32 Kb
Chip 2: Adressbereich $8000 - $BFFF, (Bitmuster 100) = 16 Kb
Chip 3: Adressbereich $C000 - $DFFF, (Bitmuster 110) = 8 Kb
Chip 4: Adressbereich $E000 - $FFFF, (Bitmuster 111) = 8 Kb

Ich benötige für den jeweils zu aktivierenden Chip ein /CS-Signal (Chipselect, active low). Bei der Umsetzung hatte ich zunächst an den Multiplexer 74HC139 gedacht, da bin ich jedoch gescheitert. Es gibt ja neben den oben beschriebenen Zuständen weiter Zustände, die dazu führen würden, dass die /CS-Signalen für die genannten Adressbereiche nicht vorhanden wären:

Beispiele:

Bitmuster 001 = $2000 ff.
Bitmuster 010 = $4000 ff.
Bitmuster 011 = $6000 ff.
Bitmuster 101 = $A000 ff.

Ich glaube, es wäre wohl sinnvoll die "Zwischenmuster" im Ergebnis so aufzubereiten, dass diese entweder ausgeblendet werden oder alternativ so aufbereitet werden, dass die ersten dreiBitmuster an /CS des ersten Chips anliegen und das vierte Bitmuster an Chip 2.

Zu beachten ist noch, dass ich keinen Einfluss auf die Adressierung an sich habe. Ich habe einen Z80-Prozessor als Basis meines Projekts.

Und für diejenigen, die es interessiert, habe ich noch einen frühen Entwurf meines Projekts beigefügt (Nicht abgeschlossen! Nicht funktionsfähig!). Links oben im Schaltplan ist mein Ansatz mit dem 74HC139 zu erkennen.

Hat jemand eine Idee? Ich nämlich gerade nicht!

Beste Grüße
Uni

Z80Ardu-1.png
 
Zu beachten ist noch, dass ich keinen Einfluss auf die Adressierung an sich habe. Ich habe einen Z80-Prozessor als Basis meines Projekts.
Das könnte vielleicht etwas schwierig werden. Aber ist auch (zumindest für mich) etwas missverständlich. Weil du musst ja so oder so dann irgendwie die höheren Bereiche ansteuern und nutzen können.

Bei der wohl bekanntesten Handheld Spielekonsole (früher ebenfalls Z80) wurde es so gemacht dass ein Microcontroller im Spielmodul integriert war, der die (in dem Fall) Adressleitungen >16 anhand einer Speicheradresse umgeschaltet hat. Quasi Bank switching. Über sowas würden sich dann aus den 16 Bit Adressbus statt 64KB maximal 16MB raus holen lassen (bei 8 Bit Adressen). Schreibe an Adresse 12345, Controller setzt die Adressbits (oder eben CS Leitungen). Bei dem Vorteil 64KB zu 16MB kann man den Verlust der 256 Bytes wohl verkraften.

Wäre ja vielleicht auch für dich eine Möglichkeit.
 
So eine Aufgabe löst man zum Beispiel über das Karnaugh-Veitch-Diagram (kurz KV-Diagram).

Leider habe ich im Moment keine Zeit dies zu lösen. Falls es sonst niemand machen kann, schaue ich mir das diese Woche mal an.

Dirk :ciao:
 
Hi,

Der Adressbus ist 16 Bit breit, die oberen 3 Bit sollen und ich möchte folgendermaßen vorgehen:

Die oberen 3 Bit (Bit 14-16) kämen für die Chipauswahllogik in Frage.

Chip 1: Adressbereich $0000 - $7FFF, (Bitmuster 000) = 32 Kb
Chip 2: Adressbereich $8000 - $BFFF, (Bitmuster 100) = 16 Kb
Chip 3: Adressbereich $C000 - $DFFF, (Bitmuster 110) = 8 Kb
Chip 4: Adressbereich $E000 - $FFFF, (Bitmuster 111) = 8 Kb
na das ist ja nen Sammelsurium :rolleyes:
Also der 74139 hat ja 2x 2-zu-4-Demultiplexer drin. Der Z80 wird auch wegen dem geringen Systemtakt nicht grade Timingprobleme verursachen.

Also ich würde den ersten Demultiplexer nehmen um die 32er-Bereiche zu zerteilen und den zweiten um die oberen 8k-Bereiche zu zerlegen.

A15 an den ersten 1A0
GND an den ersten 1A1
/MREQ an den ersten 1E (Enable)
... damit ergibt sich ...
00 - 1Y0 - /MREQ unterer 32k-Bereich - /CSan den ersten 32k-Baustein
01 - 1Y1 - /MREQ oberer 32k-Bereich -- als Enable weiter an den zweiten 2E
10 - 1Y2 - wegen GND am 1A1 nicht verwendet
11 - 1Y3 - wegen GND am 1A1 nicht verwendet

A13 an den zweiten 2A0
A14 an den zweiten 2A1
1Y1 an den zweiten 2E (Enable
... hier ergibt sich nun ...
00 - 2Y0 - ---K-Diode-A----|<-- an /CS 16k-Baustein (mit PullUp am 16k-Baustein)
01 - 2Y1 - ---K-Diode-A----|<-- an /CS 16k-Baustein
10 - 2Y2 - /MREQ unterer 8k-Baustein - /CS erster 8k-Baustein
11 - 2Y3 - /MREQ oberer 8k-Baustein - /CS zweiter 8k-Baustein

Ich benötige für den jeweils zu aktivierenden Chip ein /CS-Signal (Chipselect, active low). Bei der Umsetzung hatte ich zunächst an den Multiplexer 74HC139 gedacht, da bin ich jedoch gescheitert. Es gibt ja neben den oben beschriebenen Zuständen weiter Zustände, die dazu führen würden, dass die /CS-Signalen für die genannten Adressbereiche nicht vorhanden wären:

Beispiele:

Bitmuster 001 = $2000 ff.
Bitmuster 010 = $4000 ff.
Bitmuster 011 = $6000 ff.
Bitmuster 101 = $A000 ff.

Ich glaube, es wäre wohl sinnvoll die "Zwischenmuster" im Ergebnis so aufzubereiten, dass diese entweder ausgeblendet werden oder alternativ so aufbereitet werden, dass die ersten dreiBitmuster an /CS des ersten Chips anliegen und das vierte Bitmuster an Chip 2.

Zu beachten ist noch, dass ich keinen Einfluss auf die Adressierung an sich habe. Ich habe einen Z80-Prozessor als Basis meines Projekts.

Und für diejenigen, die es interessiert, habe ich noch einen frühen Entwurf meines Projekts beigefügt (Nicht abgeschlossen! Nicht funktionsfähig!). Links oben im Schaltplan ist mein Ansatz mit dem 74HC139 zu erkennen.

Hat jemand eine Idee? Ich nämlich gerade nicht!

Beste Grüße
Uni

Anhang anzeigen 7184
sieh dir mal meine Lösung an. In alten Computern wurde immer viel mit Dioden rumgesaut um "Speziallösungen" zu schaffen :D Kannst ja wegen der Durchlaßspannung ne Schottky nehmen.

Lösung frei nach dem Motto: Wer nicht kommt zur rechten Zeit, der fährt übern Bürgersteig :cool:

Gruß
Dino
 
  • Like
Reaktionen: unilein
Allen herzlichen Dank für die Antworten!

@Dino: Deine Lösung scheint mir perfekt! Die werde ich mir genauer ansehen.

Ich habe tatsächlich tagelang gegrübelt, wie ich das am Besten umsetze und dabei lag die Lösung eigentlich ganz nah.
Dioden hatte ich in meinen Gedankengängen auch schon eingebaut, aber auf Schottky bin ich nicht gekommen.

An meinem Projekt kann ich erst am Mittwoch oder Donnerstag weiter arbeiten. Dann werde ich das Ganze mal in meinen
Schaltplan einbauen.(Nein, vorher ist nicht Fasching angesagt).

Gruß
Uni
 
Sowas mit ein paar NAND-Gattern aufzubauen wäre zu langsam? Ich käme so auf den ersten Blick auf sieben (wobei zwei je ein reines NOT ersetzen, und zwei zusammen ein AND.
Das ganze dann an A15..A13, und die 4 Ausgänge an die /CS der Speicher...
Link
 
  • Like
Reaktionen: unilein und Dirk
Hi,

Sowas mit ein paar NAND-Gattern aufzubauen wäre zu langsam? Ich käme so auf den ersten Blick auf sieben (wobei zwei je ein reines NOT ersetzen, und zwei zusammen ein AND.
Das ganze dann an A15..A13, und die 4 Ausgänge an die /CS der Speicher...
Link
maximal 4 NAND-Gatter pro IC. Damit hätte man dann 2 ICs statt einem 74139 :D

Die NAND-Gatter haben bestimmt ne geringere Durchlaufzeit aber bei den geringen Taktfrequenzen des Z80 ist das kein Problem.

Gruß
Dino
 
maximal 4 NAND-Gatter pro IC. Damit hätte man dann 2 ICs statt einem 74139 :D

Die NAND-Gatter haben bestimmt ne geringere Durchlaufzeit aber bei den geringen Taktfrequenzen des Z80 ist das kein Problem.

Dioden in Signalleitungen finde ich nicht so schön, auch wenn es hier wahrscheinlich funktionieren wird. Was für diese Lösung spricht: die 2-4 Decoder sind in der Bastelkiste. :D

Die Lösung von LotadaC finde ich besser, auch wenn man eventuell ein IC mehr benötigt. NAND Gatter haben den Vorteil, dass man damit jede beliebige logische Funktion aufbauen kann -> NAND ICs sollten ebenfalls in die Bastelkiste ;)
 
NAND's habe ich jede Menge. Dioden sind nicht schön, aber ich wage es trotzdem. Die Klapperbausteine, die ich hier benutzen will, nehmen einem sowieso nicht all zuviel krumm.
Letzten Endes ist der 2-4 Decoder ja auch eine NAND-Sammlung.

Ich stecke mal ein paar Möglichkeiten auf ein Breadboard und entscheide dann.
 
...ein Microcontroller im Spielmodul integriert war, der die (in dem Fall) Adressleitungen >16 anhand einer Speicheradresse umgeschaltet hat. Quasi Bank switching...
Hmm... vier Ausgänge (Speicher), 3 Eingänge (Adressleitungen), also reicht ein Achtbeiner nicht.
Also aus der 14er-Klasse (quasi aller Tiny24/44/84-Derivate (inklusive dem 441/841), und dem Tiny20.
Die 4 Ausgänge auf einen Port, die drei Eingänge auf einen gemeinsamen PCINT (-Interrupt).
Entweder man prüft in einer Endlosschleife die Eingänge, und schaltet die Ausgänge entsprechend, oder man verwendet den PCINT:
In vier Registern werden die vier /CS-Möglichkeiten "geparkt".
ZH wird mit einem sinnigen Offset geladen (0b00000001 ? )
Als Eingänge wählt man zB die Bits 3..1 eines Ports, also nicht Bit0
Im PCINT-Einsprungpunkt - also direkt in der IVT wird der Zustand der Eingänge (PIN-Register) nach ZL geladen (IN), und dann mit IJMP angesprungen.
In den möglichen Sprungzielen wird dann je die entsprechende geparkte /CS-Kombination auf den Ausgangsport gelegt (OUT), gefolgt von einem RETI (deswegen nicht Bit0).
Damit hätte man 'ne "Durchlaufzeit" von 4 (PCINT-IRQ) + 1 (IN ZL, PINregister) + 2 (IJMP) + 1 (OUT PORTregister, Parkregister) = 8 Takten.
Ändert sich der Zustand innerhalb dieser Zeit, kommts zu weiteren 4 Takten Verzögerung.
Kostet allerdings 'n Haufen Programmspeicher.
Ob man mit der Compare-Methode (CP) schneller käme, hab ich nicht durchgespielt...

So eine Aufgabe löst man zum Beispiel über das Karnaugh-Veitch-Diagram (kurz KV-Diagram).
Leider habe ich im Moment keine Zeit dies zu lösen...
Ich hatte meinen Vorschlag ja eher aus dem Kopf heraus ... ausprobiert...
Falls Du mal Zeit findest, kannst Du uns Elektroniklaien mal erklären (ggf in 'nem anderen Thema, bevor das zu OT wird), wie das Schritt für Schritt geht? Irgendwie schnall ich das nicht so recht
...Die NAND-Gatter haben bestimmt ne geringere Durchlaufzeit aber bei den geringen Taktfrequenzen des Z80 ist das kein Problem...
Wären aber auch einige NANDs im Gänsemarsch, was die Durchlaufzeit multipliziert, oder?
 
Falls Du mal Zeit findest, kannst Du uns Elektroniklaien mal erklären (ggf in 'nem anderen Thema, bevor das zu OT wird), wie das Schritt für Schritt geht?

Das kann ich bei Gelegenheit mal machen, aber es gibt sicherlich hierzu auch viele Infos im Netz.

Für den aktuellen Fall habe ich die vereinfachten Ausdrücke für CS4 bis CS1 erstellt. Diese Ausdrücke lassen sich dann noch so ändern, dass man nur NANDs hat.

Adressierung.png
 
Hi,

Das kann ich bei Gelegenheit mal machen, aber es gibt sicherlich hierzu auch viele Infos im Netz.

Für den aktuellen Fall habe ich die vereinfachten Ausdrücke für CS4 bis CS1 erstellt. Diese Ausdrücke lassen sich dann noch so ändern, dass man nur NANDs hat.
als Stichwort packe ich mal KV-Diagramm hier rein (Karnaugh-Veitch)

Gruß
Dino
 
als Stichwort packe ich mal KV-Diagramm hier rein (Karnaugh-Veitch)

Ja das KV-Diagramm hatte ich im Thema schon mal erwähnt.

Wenn man nun alles mit NAND-Gattern realisieren möchte, kann man bei den minimierten Ergebnis-Ausdrücken die Regel von DeMorgan anwenden, dann werden die OR zu AND.

Wären aber auch einige NANDs im Gänsemarsch, was die Durchlaufzeit multipliziert, oder?
Ja, das nennt sich Propagation Delay.

Dirk :ciao:
 
Hi,

und wenn man ein Signal am Anfang einmal invertiert weil man es an verschiedenen Stellen mal normal und mal invertiert benötigt, dann bekommt man Glitches :D Auch wegen der Durchlaufzeit und der dadurch verschiedenen Logikzustände an den Gattereingängen.

Gruß
Dino
 
...dann bekommt man Glitches :D Auch wegen der Durchlaufzeit und der dadurch verschiedenen Logikzustände an den Gattereingängen...
...heißt, es könnten kurzzeitig mehrere Speicher ge-chip-selected sein, oder ein falscher, oder gar keiner... oder wie?
nunja, solange keine Read-/Write-Strobes kommen, dürfte das (hier) ja kein Problem sein.
Grundsätzlich muß man sowas dann natürlich im Kopf behalten, insbesondere wenn irgendwelche "komplementären" Lasten etc. geschaltet werden (-> H-Brücke oder sowas).
 
Hi,

...heißt, es könnten kurzzeitig mehrere Speicher ge-chip-selected sein, oder ein falscher, oder gar keiner... oder wie?
jein :D

Glitches sind sehr kurze Impulse im Nanosekundenbereich.

Nehmen wir an du hast ein UND-Gatter. Wenn du nun beide Eingänge des UND-Gatters verbindest, dann sollte es am Ausgang eine 1 liefern wenn du am Eingang eine 1 anlegst und eine 0 am Ausgang wenn am Eingang eine 0 ist.

Wenn du nun aber vor einen der beiden Eingänge einen Inverter legst, dann dürfte das UND-Gatter nie eine 1 am Ausgang liefern weil du nie beide Eingänge auf 1 hast. Durch den Inverter ist immer einer der beiden Eingänge auf 0.

Durch die Durchlaufzeit des Inverters hast du allerdings sehr kurze Momente in denen der Eingang ohne den Inverter des UND-Gatters bereits eine 1 sieht und diese 1 noch nicht durch den Inverter gelaufen ist und am anderen zu einer 0 wurde. Genau in diesem Moment schaltet das UND-Gatter den Ausgang ganz kurz auf 1. Sowas nennt man Glitch. Dieser Augenblick ist so lamg wie die Durchlaufzeit des Signals durch den Inverter.

https://de.wikipedia.org/wiki/Glitch_(Elektronik)

Manchmal möchte man solche kurzen Glitches haben (zB als Speicherpuls für FlipFlops) und manchmal sind sie ungewollt und störend. Auch in FPGAs und CPLDs (programmierbare Logik) muß man schon bei der Programmierung der Logik auf solche Durchlaufzeiten im Gattergeflecht des Bausteins auf sowas achten. Aus dem Grund werden manche Logikfabriken zB mit einem synchronisierenden Takt betrieben.

Gruß
Dino
 
Kurzes Feedback, da mal wieder wenig Freizeit....

Also... Die Lösung mit dem 74HC139 habe ich mal gesteckt und getestet. Hat nicht funktioniert. Da hat die Logik Eingang zu Ausgang (noch) nicht gepasst. Ich habe sie mal beiseite gelegt (aber nicht verworfen).
Die NAND-Lösung von Lotadac habe ich ebenfalls probiert. Die funktioniert. Einziger (wirklich nur kleiner) Nachteil ist, dass eben ein weiterer Baustein benötigt wird.
Und den Gedanken von Lotadac, einen Tiny zu benutzen habe ich ebenfalls mal aufgegriffen und die erforderliche Logik einfach mal in ein paar Assemblerbefehle gepackt. Funktioniert ebenfalls.

Ich finde die Idee mit dem Tiny ziemlich cool. Schon deshalb, weil ich im Laufe meines Projekts die Möglichkeit habe, die Logik prinzipiell anzupassen (Daran hatte ich zuvor überhaupt nicht gedacht).

Danke für die hilfreichen Denkanstöße!

Gruß
Uni
 
Die Lorbeeren muß ich allerdings an Thomas weitergeben (der sich das wohl bei Sega abgeschaut hat (oder welchen Laden er auch immer meinte...))
Bei der wohl bekanntesten Handheld Spielekonsole (früher ebenfalls Z80) wurde es so gemacht dass ein Microcontroller im Spielmodul integriert war, der die (in dem Fall) Adressleitungen >16 anhand einer Speicheradresse umgeschaltet hat
 
  • Like
Reaktionen: TommyB
Die Lorbeeren muß ich allerdings an Thomas weitergeben (der sich das wohl bei Sega abgeschaut hat (oder welchen Laden er auch immer meinte...))

Oh... Ja stimmt....

Teilt sie Euch einfach. :)

Wenn ich keinen Tiny 24 benutze, sondern einen Mega 168 oder 328, hätte ich so viele Pins, dass ich darüber zusätzlich die komplette IO abwickeln könnte oder auch Bankswitching jenseits der 64 KB und und und.....

Aber ich denke erstmal die aktuellen Dinge zu Ende.

Grüße
Uni
 
Die Lorbeeren muß ich allerdings an Thomas weitergeben (der sich das wohl bei Sega abgeschaut hat (oder welchen Laden er auch immer meinte...))
Handheld Konsole. Ich meinte den GameBoy ;)
Wo ich damals von einem Spiel den ROM abgelötet und mit nem Sockel für EPROMS ausgetauscht hatte, zwecks Taschengeld einsparen und so :D

In dem Sinne *high five* @LotadaC :)
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)