Forum: FPGA, VHDL & Co. FPGA I2C ohne Taktgeber?


von Martin (Gast)


Lesenswert?

Hallo,

das Thema FPGA ist für mich ziemlich neu, ich habe mir ein kleines 
Lattice testboard besorgt und ein paar 7 Segment LEDs.
Jetzt würde ich diesen gerne via I2C ansprechen, gibt es eigentlich eine 
Möglichkeit I2C ohne zusätzlichen Taktgeber zu implementieren? (I2C 
Write würde ausreichen um einen Wert zu setzen und diesen dann am 
7-Segment LED auszugeben, I2C Read würde nicht benötigt werden in dem 
Fall).
Hat jemand eine Idee wie ich so etwas realisieren könnte? Ich seh den 
Wald vor lauter Bäumen nicht.. stehe absolut am Anfang damit.

von Marius W. (mw1987)


Lesenswert?

I2C hat doch einen Takt. Nimm halt SCL als Takt, damit sollte es gehen.

Gruß
Marius

von Martin (Gast)


Lesenswert?

Ich habe mir ein paar Beispiele angesehen, die hatten aber alle einen 
Systemtakt vorausgesetzt, ich denke das war jetzt nicht SCL wenn es mich 
nicht täuscht.
Hat denn schon jemand I2C (I2C write) ohne weiteren Taktgeber 
implementiert?

Bei I2C read kann ich es mir schon eher vorstellen das so etwas benötigt 
wird da die Antwort ja vom FPGA kommen würde, das brauche ich in dem 
7seg-LED Test aber nicht.

von Max D. (max_d)


Lesenswert?

Bei I²C wird für jedes Bit im Byte SCL einmal getaktet (und dann noch 
ein 9. Mal um das ACK vom Slave zu kriegen).
Man dürfte also rel. einfach die Daten einlesen können (ich könnte mir 
sogar vorstellen, dass das irgendein gelangweilter Jemand schonmal 
diskret mit Schieberegs gebaut hat (ich kenn zwar akut nix, es ist aber 
einfach genug dafür).
Man hat so etwa den Flow:
Start-bedingung (SDA fällt während SCL high ist, sehr einfach zu 
detektieren); hier kann man ja einen Reset rausholen -> Slave Adresse 
ins Schiebereg rattern lassen, nach 8 takten (3 bit-Zähler ist da dein 
freund) vergleichen (XOR und (N)OR), Status anpassen (lesen , schreiben 
oder nicht angesprochen, du hast ja nur schreiben oder garnix)) -> 
ersten datenbyte reinrattern lassen und wenn fertig in das Zielreg 
schieben (ich denk mal du hast nur eins) -> ACK oder NAK senden (je 
nachdem was du vorhast legst du halt den SDA low oder nicht) -> 
Stop-Befehl vom Master -> alles tristate

von Grendel (Gast)


Lesenswert?

Martin schrieb:
> gibt es eigentlich eine
> Möglichkeit I2C ohne zusätzlichen Taktgeber zu implementieren?

Was meinst Du mit "zusätzlich"?
Welchen anderen verwendest Du denn schon?

von Martin (Gast)


Lesenswert?

Grendel schrieb:
> Was meinst Du mit "zusätzlich"?
> Welchen anderen verwendest Du denn schon?

noch keinen ich arbeite mich gerade ein in das Thema.
Das Problem das ich auch sehe ist ein eventueller stall von der ganzen 
State Maschine.
Lattice hat dort ein I2C Beispiel, ich werde die kommenden Tage mal 
damit rumspielen, aber ich bin schon mal für jede Hilfe dankbar :-)

von Max D. (max_d)


Lesenswert?

Ich hab grade gelesen, dass du ein LED-Disp hast, wenn du das muxxen 
willst brauchst du eh einen dauerhaften Takt.....

von Martin (Gast)


Lesenswert?

Nein ich habe solche hier:
http://www.ebay.de/itm/5x-7-Segment-Anzeigen-rot-13mm-gebraucht-gepruft-sehe-Foto-/111234869097?pt=Bauteile&hash=item19e61d6769

Dazu brauch ich keinen zusätzlichen Taktgeber soviel weiss ich ja 
mittlerweile schon :-)

von Max D. (max_d)


Lesenswert?

Wenn du für jedes Digit einen Pin hast, dann ja.
Nur wenn man z.b. eine Uhr mit 4 Stellen hat würdest du so 7*4 = 28 I/Os 
brauchen.
Deswegen multiplext man das (man zeigt die einzelnen Zeichen so schnell 
hintereinander an, dass es für einen Mensch statisch aussieht). Das 
braucht dann 7(Segemente)+4(Digits) = 11 I/Os und halt einen Takt. Und 
das Gefälle wird noch größer wenn man mehr Stellen hat. Für alles was 
mehr als zwei Stellen hat ist die statische Ansteuerung eigtl. 
daneben...

von Martin (Gast)


Lesenswert?

Ja jedes Segment hat in dem Fall ein Pin.

von Falk B. (falk)


Lesenswert?

@ Martin (Gast)

>Ich habe mir ein paar Beispiele angesehen, die hatten aber alle einen
>Systemtakt vorausgesetzt, ich denke das war jetzt nicht SCL wenn es mich
>nicht täuscht.

das wird wohl so sein.

>Hat denn schon jemand I2C (I2C write) ohne weiteren Taktgeber
>implementiert?

Kann man machen, ist aber nicht so günstig und ggf. gefährlich. Denn I2C 
benötigt einen ROBUTEN Glitchfilter am Takteingang, sonst läuft das 
nicht stabil. Ein heutiges FPGA ist mehr als hundertmal schneller als 
I2C, darum ist der Takt SCL als Takt für ein FPGA nur mit Bauchschmerzen 
zu verwenden. Siehe Taktung FPGA/CPLD.

Darum nimmt man für I2C im FPGA besser einen hochfrequenten Takt, so 10 
MHz oder so, sampelt damit SCL und SDA und macht dann eine Auswertung 
der Signale. Dabei kann man noch sehr gut filtern und kann Fehler besser 
abfangen. Denn was machst du, wenn SCL aus einen bestimmten Grund nicht 
mehr taktet? Dann steht alles!

von Martin (Gast)


Lesenswert?

Falk Brunner schrieb:
> Denn was machst du, wenn SCL aus einen bestimmten Grund nicht
> mehr taktet? Dann steht alles!

Wenn SCL nicht mehr taktet dann kann ich den FPGA in so einen Fall 
sowieso nicht mehr ansprechen denn dann wäre ja die Master -> Slave 
Kommunikation hinüber?
Übersehe ich da jetzt irgendetwas?

von Falk B. (falk)


Lesenswert?

@ Martin (Gast)

>Wenn SCL nicht mehr taktet dann kann ich den FPGA in so einen Fall
>sowieso nicht mehr ansprechen denn dann wäre ja die Master -> Slave
>Kommunikation hinüber?

Sicher, aber darum allein geht es nicht. Wenn man etwas komplexere Logik 
als nur ein paar statische LED-Ausgänge hat, will man ja meist bei 
Fehlern auf dem I2C Bus was machen, dafür braucht es einen dauerhaften 
Takt.

von Lattice User (Gast)


Lesenswert?

Martin schrieb:
>
> ich habe mir ein kleines Lattice testboard besorgt

Welches?
Wenn es das MachXO2 Breakoutboard ist gibt es Möglichkeiten einen Takt 
zu bekommen:

1) Oscillator nachbestücken
2) Den MachXO2 internen Oscillator benutzen (OSCH Primitive)

von Max D. (max_d)


Lesenswert?

Vlt. sagt der OP mal was er plant zu tun :D
Wenn das nur eine "Machbarkeitsstudie" ist, dann ist das was anderes als 
ein Produktiv-System.
Ich denk mal dass das mehr als Experiment gedacht ist, da man an jeder 
Ecke I²C-Displaytreiber für <5€ hinterher geworfen bekommt :D

von Martin (Gast)


Lesenswert?

Einen I2C Client mit dem ich ein 7 Segment Display ansteuern kann (wobei 
ich für jedes Segment in dem Fall einen Pin zur Ansteuerung verwenden 
möchte). Es geht um's Verständnis von dem Ganzen.

von Sigint 112 (sigint)


Lesenswert?

Wenn es dir um's Verständniss geht, dann setzt dich hin und überlege, 
wie du das Problem mit normalen Logikgattern lösen würdest. Das sollte 
dann auch so mit einem FPGA möglich sein. Du musst es halt passend in 
VHDL beschreiben.
Der Grundgedanke bei FPGAs ist aber sequentielle Logik und das geht nur 
mit Takt. Im Endeffekt ist das wohl auch einfacher.

Gruß,
  SIGINT

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.