Forum: Mikrocontroller und Digitale Elektronik 5 Volt Logik mit Pi Pico oder Teensy 4.1 ansteuern


von Chris K. (chris_k543)


Lesenswert?

Hallo! :-)

Ich würde gerne mit einem oder zwei (würde selbst ein schnelles, 
effizientes Protokoll für Kommunikation entwickeln) der modernen, 
benutzerfreundlichen Microcontroller (z.B. Pi Pico oder Teensy 4.1) die 
für PC-Betrieb relevanten Pins (hab das schon analysiert) eines 
8086-CPU-Sockels ansteuern. Alle 40 Pins sind es ja nicht, 8 (VCC, 
MN/MX, TEST, QS0, QS1, RQ/GT0, RQ/GT1, 1x GND) kann man sich ja sparen.

Hintergrund ist folgender:

Mein Ziel ist es, in einem alten Amstrad PC1640 als Experiment die CPU 
(8086 mit 8 MHz) sowie eine 8087 (würde ich in die CPU-Emulation direkt 
integrieren, deshalb kann ich mir auch 5 Pins sparen) emulieren. 
Emulator schreibe ich selbst (ALU ist bei der alten 8086 keine große 
Hexerei).

Meine zwei Fragen an Euch wären:

1. Ist einer der modernen Microcontroller schnell genug um die Pins I/O 
mit 8 MHz anzusteuern und vor allem auch mit jedem Clock-Tick einen 
Interrupt auszulösen?

2. Wie bekomme ich die 3.3V und 5V-Welten bei 8 MHz miteinander 
"verheiratet"? Für jeden Pin einen Hochfrequenzverstärker oder 
Spannungsteiler zu verbauen klingt mir doch eher SEHR aufwändig

von Jim M. (turboj)


Lesenswert?

Nuvoton hat ein paar Cortex-M4 µC im Angebot, die sowohl 5V 
Betriebsspannung vertragen als auch ein externes Bus Interface haben. Ob 
letzteres 8086-kompatibel ist, habe ich aber so schnell nicht nachlesen 
können.

Ohne Bus Interface dürfte man die meiste Zeit mit der I/O Ansteuerung 
verplempern (anstatt die CPU zu emulieren).

Für Teensy4.1 bräuchte man bidirektionale Pegelwandler, aber da ist IIRC 
das externe Speicher Interface nicht vollständig ausgeführt an die Pins. 
Pi Pico ist auch nur für 3,3V Ansteuerung.

Wünsche viel Glück, das braucht man bei so einem Projekt.

von Wolfgang (Gast)


Lesenswert?

Chris K. schrieb:
> 2. Wie bekomme ich die 3.3V und 5V-Welten bei 8 MHz miteinander
> "verheiratet"? Für jeden Pin einen Hochfrequenzverstärker oder
> Spannungsteiler zu verbauen klingt mir doch eher SEHR aufwändig

Hochfrequenzverstärker sind Analogbauteile und haben in der 
Digitaltechnik nichts zu suchen.

Um ein digitales 3.3V-Signal auf 5V anzuheben, eignen sich Gatter aus 
der 74HCT-Serie, z.B. 74HCT04 mit 6 Invertern pro IC [V_IH typ 2.0V (max 
1.6V), V_IL typ. 1.2V (max 0.8V)] oder 74HCT125 mit 4 Treibern pro IC.
Timing ist im Datenblatt angegeben.

von Frank K. (fchk)


Lesenswert?

zu 2. Das ist der einfachere Teil:
74LVC1T45 (1 Bit)
74LVC2T45 (2 Bit)
74LVC8T245 (8 Bit)
https://www.ti.com/lit/ds/symlink/sn74lvc8t245.pdf

zu 1. Du willst ein EBI (External Bus Interface) haben. Ansonsten wird 
das ganze eher langsam. Wenn der Prozessor in der Originalschaltung im 
Maximum-Modus läuft, wirst Du noch einiges an digitaler Logik brauchen, 
um die nötigen Steuersignale bereitzustellen. Dafür bietet sich ein CPLD 
oder FPGA an.

Als Basis würde ich jetzt einen STM32H743 oder sowas in der Richtung 
nehmen. 480 MHz, genug RAM, ein FMC (Flexible Memory Controller) für den 
externen Adress/Datenbus.

https://www.st.com/en/microcontrollers-microprocessors/stm32h743-753.html

Die üblichen Demoboards haben leider nur die 100-Pin Version, was etwas 
knapp werden könnte, um alle benötigten Funktionen auf die Pins zu 
bekommen. Das Problem ist eben, dass Du nicht jede Funktion auf jeden 
beliebigen Pin bekommst, sondern nur bestimmte Kombinationen 
funktionieren. Bei fertigen Demoboards kann es sein, dass diese Pins 
bereits durch Onboard-Peripherie verwendet werden. Es ist daher 
wahrscheinlich, dass Du Dir eine eigene Platine von Null auf designen 
musst. Das ist kein prinzipielles Problem, ich mache das tagtäglich in 
meinem Job, aber man muss eben das Know-How und die Ausrüstung haben.

fchk

: Bearbeitet durch User
von Chris K. (chris_k543)


Lesenswert?

Jim M. schrieb:
> Nuvoton hat ein paar Cortex-M4 µC im Angebot, die sowohl 5V
> Betriebsspannung vertragen als auch ein externes Bus Interface haben. Ob
> letzteres 8086-kompatibel ist, habe ich aber so schnell nicht nachlesen
> können.
>
> Ohne Bus Interface dürfte man die meiste Zeit mit der I/O Ansteuerung
> verplempern (anstatt die CPU zu emulieren).
>
> Für Teensy4.1 bräuchte man bidirektionale Pegelwandler, aber da ist IIRC
> das externe Speicher Interface nicht vollständig ausgeführt an die Pins.
> Pi Pico ist auch nur für 3,3V Ansteuerung.
>
> Wünsche viel Glück, das braucht man bei so einem Projekt.

Hi, danke! Bidirektionale Pegelwandler klingt gut, ich denke, ich werde 
es damit versuchen.

In der Tat werde ich das Bus-Interface (die "BIU") komplett via 
Bitbanging emulieren müssen, wobei ich inzwischen schon ziemlich viel an 
Voranalysen gemacht habe.

Die 8086-CPU hat, pro I/O, 4 Zustände am Bus (ein Zugriff dauert 4 
Taktzyklen), die sind im "BIU-Microcontroller" pro Zugriffsbefehl bzw. 
pro Interrupt von außen eigentlich in C/C++ ganz gut abbildbar.

Bedeutet für mich aber auch, daß ich ca. 2 Millionen x 4 Byte pro 
Sekunde vom ALU-Controller an den BIU-Controller (und zurück) schicken 
muß, das muß ich noch erforschen, das wird evtl. auf ein eigenes 
Protokoll mit, wieder einmal, Bitbanging hinauslaufen (SPI ist dafür 
wohl viel zu langsam).

Von der Vorstellung, nur einen einzigen Controller zu verwenden, habe 
ich mich bereits getrennt, das geht sich von den Pins her nicht aus.

Also die Idee wäre in etwa so:

ALU-Controller (z.B. Teensie, weil der hat ordentlich Rechenleistung) <- 
eigenes Protokoll -> BIU-Controller (z.B. Pi Pico) <- Pegelwandler -> 
8086-Sockel

Ausnahmen:

* RESET und CLK gehen an ALU UND BIU
* Die 2x GND direkt an Masse
* INTR, NMI und LOCK gehen an ALU
* TEST, RQ/GT0 und RQ/GT1 "gnadenhalber" an High (FPU) - ist aber nur 
erste Vermutung
* QS0, QS1 floating (FPU) - ebenfalls nur Vermutung derzeit

Alles andere ist nur mit dem BIU-Controller verbunden (möglicherweise 
brauche ich zwei davon, aber die sind zum Glück spottbillig), der banged 
da die Bits rein und raus und kümmert sich um das gesamte Busprotokoll, 
bekommt dazu kompakt codierte Kommandos vom ALU-Controller, z.B. so:

4 Bit Instruction Code + 4 Bit Segment Access + 4 Bit sonstiger Status + 
20 Bit Adresse + 16 Bit Daten (bei Writes, Reads kommen ohne die 
Datenbits, 8 Bit I/O entsprechend nur 8 Bit)

Sind dann 48 Bit pro Befehl im Maximalfall, das halt 2 Millionen Mal pro 
Sekunde.

Bislang mein größtes privates Projekt, und mein erstes echtes 
Hardwareprojekt. Zum Glück bin ich Softwareentwickler von Beruf.

von Chris K. (chris_k543)


Lesenswert?

Frank K. schrieb:
>...
> fchk

Wow, danke! :-)

Ja, läuft im Maximum-Modus... wobei ich mich da aber jetzt frage, ob 
nicht Bitbanging ausreicht um den Bus zu emulieren? Der 8086-Bus ist 
zwar, auch wegen des Multiplexings, recht komplex, aber doch gut 
dokumentiert.

von c-hater (Gast)


Lesenswert?

Chris K. schrieb:

> 1. Ist einer der modernen Microcontroller schnell genug um die Pins I/O
> mit 8 MHz anzusteuern und vor allem auch mit jedem Clock-Tick einen
> Interrupt auszulösen?

Wieso bei jedem Clock-Tick? Eigentlich reicht doch ein Interrupt bei 
jedem Buszyklus (natürlich an einer Stelle, an der man schon entscheiden 
kann, was passieren muss).

Für das nötige Businterface sind die PIOs des RasPi Pico wie geschaffen 
und auch locker schnell genug. Ob allerdings die Antwortzeit des (eines 
der) MCU-Kerne (jederzeit) ausreichend wäre, kann man nicht so einfach 
feststellen. Das hängt auf jeden Fall vom Gesamtprogramm auf dem Pico 
ab.

> 2. Wie bekomme ich die 3.3V und 5V-Welten bei 8 MHz miteinander
> "verheiratet"? Für jeden Pin einen Hochfrequenzverstärker oder
> Spannungsteiler zu verbauen klingt mir doch eher SEHR aufwändig

Level-Shifter, ggf. bidirectional, wäre die sichere Lösung. Wurde im 
Thread ja bereits genannt.

von Frank K. (fchk)


Lesenswert?

Chris K. schrieb:

> Hi, danke! Bidirektionale Pegelwandler klingt gut, ich denke, ich werde
> es damit versuchen.

Vorsicht! Ja, du brauchst auch bidirektionale Pegelwandler. Da gibts 
aber welche mit manueller Umschaltung über einen DIR-Pin, wie die 
74LVC-T Serie, die ich Dir genannt habe, und es gibt welche mit 
automatischer Richtungsumschaltung wie z.B. TXB0108 oder so. Die 
letzteren solltest Du tunlichst dann und nur dann nehmen, wenn es gar 
keine andere Möglichkeit gibt, denn die automatische 
Richtungsumschaltung lässt sich sehr leicht durcheinander bringen. Ein 
falscher Pullup reicht. Außerdem ist bei vielen die Treiberleistung vor 
allen gegen VCC recht gering. Die Wandler mit manueller 
Richtungsumschaltung hingegen sind idiotensicher, solange Du das 
Richtungssignal korrekt bedienst.

fchk

von Frank K. (fchk)


Lesenswert?

Nochmal so als Inspiration:

https://github.com/captain-amygdala/pistorm

https://www.hackster.io/news/hands-on-with-the-pistorm-the-ultimate-raspberry-pi-powered-accelerator-for-your-commodore-amiga-449ef0634f3e

Das geht in die gleiche Richtung, in die Du gehen willst, ist aber für 
68k und Amiga. Der Trick, warum das Projekt so funktioniert, ist das 
CPLD, das die Prozessorsignale synthetisiert. Der Pi alleine könnte das 
Timing so nicht hinbekommen.

In eine ähnliche Richtung wirst Du auch gehen müssen, ob mit Pi oder 
einem STM32H743 oder gar einem STM32H747, der noch einen zweiten 
Prozessor und Grafik eingebaut hat.

Kannst Dir ja mal anschauen.

fchk

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Frank K. schrieb:

> Das geht in die gleiche Richtung, in die Du gehen willst, ist aber für
> 68k und Amiga. Der Trick, warum das Projekt so funktioniert, ist das
> CPLD, das die Prozessorsignale synthetisiert. Der Pi alleine könnte das
> Timing so nicht hinbekommen.

Der Pi Pico könnte das dank PIO sehr wohl. Die langweilt sich dabei 
sogar deutlich. Diese "Problem" kann man aber natürlich leicht dadurch 
lösen, dass man die PIO halt so langsam laufen lässt, dass sie den Job 
gerade noch leisten kann.

Ich denke: Du musst langsam mal wieder ein bissel was Neues lernen...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.