mikrocontroller.net

Forum: FPGA, VHDL & Co. 32-Bit parallel IO Pulse Generator mit FPGA lösbar?


Autor: Trick42 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe noch nie mit FPGA's gearbeitet und kenne mich dadurch auch mit 
den Performancemerkmalen nicht besonders gut aus.
Deshalb komme ich mit folgender Frage zu euch:

Ist mein Projekt lösbar:
Ich habe 32 Eingänge und 32 Ausgänge und brauche zusätzlich eine 
SPI-Schnittstelle um diverse Parameter zu konfigurieren, auf die ich 
nachher noch erläutere:

***            -----------
***   32       |         |       32
*** --/--------|         |-------/--
***  Inputs    |         |  Outputs
***            |         |
***            |         |
***            |         |-------- config CS
***            |         |-------- config SPI CLK
*** -----------|         |-------- config SPI MOSI
***  conf/work |         |-------- config SPI MISO
***            |         |
***            -----------

Jeder Eingang ist mit einem Ausgang durch folgende Logik verbunden:
Wenn ein Input eine High-Flanke auslöst(das Signal liegt 10µs an) das 
soll am zugehörigen Ausgang folgende Sequenz ablaufen:

Ein Erstimpuls wird am Ausgang geschaltet, danach folge eine zyklische 
Low-Zeit und eine zyklische High-Zeit (wie PWM, nur hat der 1. Highpegel 
eine andere Zeit). Nach einer gewissen Gesamtzeit soll der Ausgang 
wieder abgeschaltet werden. Wird zwischendurch ein neuer Input-Pegel 
erkannt wird dieser ignoriert.

Die zu konfigurierenden Parameter sind die einzelnen Zeiten, die sich am 
besten in 1µs - sonst bis max. 10µs auflösen lassen sollen. Die 
Gesamtdauer wird ca. 100µs-256ms sein, jeder Eingang muss parallel 
abgearbeitet werden können.

Da ich auf meinem Microcontroller diese Sequenz nur in 118 µs bei 88 MHz 
auflösen kann, ist es sicher eindeutig diefalsche Variante, hier eine 
CPU zu verwenden.

*** *)Ich denke, ein FPGA könnte das besser und auch schnell genug.
***   STIMMT DAS?
***
*** *)Wenn ja, wie schwer ist das in VHDL zu entwickeln?
***   Kann das ein FPGA/VHDL-Newbie in einem rel. kurzen Zeitrahmen
***   erlernen?



vielen Dank,
Alex

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> am besten in 1µs
Schön langsam also ;-)

> jeder Eingang muss parallel abgearbeitet werden können.
Genau das macht ein FPGA.

> Ich denke, ein FPGA könnte das besser und auch schnell genug.
> STIMMT DAS?
Ja.

> Wenn ja, wie schwer ist das in VHDL zu entwickeln?
> Kann das ein FPGA/VHDL-Newbie in einem rel. kurzen Zeitrahmen erlernen?
Was heißt hier kurz oder lang?
Du mußt am Anfang bei FPGAs eine andere Denkweise erlernen. Nicht mehr 
in sequentiellen Abläufen, sondern eher in Logik und Flipflops. Dann 
kannst du deine 2 Aufgaben bearbeiten:
1. die Zähler/Pulserzeuger und 2. das Config-Interface.
Ich würde da mal locker 3 Monate (Fulltime) ansetzen, bis das fehlerfrei 
läuft, wenn du vorher noch nie was mit programmierbarer Logik gemacht 
hast (und ich schätze gerne etwas knapp ;-)
Es ist klar, dass ich (und andere auch) das in einem kleinen Bruchteil 
dieser Zeit könnte, aber die 2 Monate und 27 Tage zum Kennenlernen des 
FPGAs habe ich vorher schon investiert (tatsächlich waren es etwas mehr 
und ich lerne immer noch ;-)

Autor: Patrick Sulimma (abaddon1979)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> *** *)Ich denke, ein FPGA könnte das besser und auch schnell genug.
> ***   STIMMT DAS?
> ***
> *** *)Wenn ja, wie schwer ist das in VHDL zu entwickeln?
> ***   Kann das ein FPGA/VHDL-Newbie in einem rel. kurzen Zeitrahmen
> ***   erlernen?

Ja das stimmt, sowas habe ich schon gebaut, halt nur für 4 Kanäle.
Die Hardware ist relativ einfach aber wegen den großen Zeiten sehr Flip 
Flop lastig.

Achte vorallem darauf die inputs zu syncronisieren.

Auch das SPI-Interface ist ziemlich schnell als State machine 
verwirklicht, es gibt aber auch jede menge IP cores zum downloaden.

Ich habe keine Ahnung wie gut du in VHDL bist oder wie deine Lernkurve 
ist, deswegen will ich hier nicht beurteilen wie schnell du das umsetzen 
kannst.

Wenn es dir hilft, kann ich dir ja mal einen Blockplan für einen Kanal 
schicken.

Autor: Guy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und das soll sich nicht auf einem µController lösen lassen?

Autor: Alex Tricktronic (tricktronic1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle und gute Antwort.
genau das wollte ich wissen!

Alex

Autor: Alex Tricktronic (tricktronic1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@guy:
ich habs schon am Microcontroller: 88,6 MHz, ein Durchlauf braucht ca. 
118µs. Das wurde Quick und Dirty programmiert, lässt sich sicher noch 
die eine oder andere µSekunde rausholen ;-).
Oder kennst du einen Microcontroller mit 32 timern und 32 ext. 
interrupts? Dann ginge das natürlich viel schneller!

@Patrick:
*** Wenn es dir hilft, kann ich dir ja mal einen Blockplan für einen 
Kanal
*** schicken.
Ja, wäre sehr nett.
trick42 (et) gmail.com


Wegen der Lernkurve: ich bin seit 10 jahren eingefleischter 
C-Programmierer und tu mir da sehr leicht.
VHDL kann ich gar nicht abschätzen, aber ich denke ich bin lernfähig - 
das muss man ja als Entwickler eh immer sein - gerade in der 
Steuerungsbranche!

Danke,
Alex

Autor: Martin Kohler (mkohler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alex Tricktronic wrote:
> Wegen der Lernkurve: ich bin seit 10 jahren eingefleischter
> C-Programmierer und tu mir da sehr leicht.
Und genau da sitzt am Anfang das Problem.
FPGAs und C-Programmieren sind zwei völlig unterschiedliche Welten.
Das ist die andere Denkweise, die Lothar angesprochen hat. Beim FPGA 
läuft alles parallel, gleichzeitigt (und synchron, hoffentlich).
Im Gegensatz zum uC, wo alles sequenziell abläuft ist das ein völlig 
anderer Ansatz.

Falls du dich für FPGAs interessierst wäre das aber wohl ein gutes 
Projekt, um dich mal damit zu befassen, falls du die Zeit (und den 
Geldgeber) dazu hast.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wegen der Lernkurve: ich bin seit 10 jahren eingefleischter
> C-Programmierer und tu mir da sehr leicht.
Ja, dann hast du auch die C-Denkweise verinnerlicht.
Ich habe auch 10 Jahre C programmiert (und tu das heute noch).
Dann habe ich mit FPGAs begonnen und lerne seit 7 Jahren ;-)

Ich habe das ernst gemeint mit den 3 Monaten.

Natürlich wirst du einen Prototypen deines Designs schon früher am 
laufen haben, dabei aber die klassischen Anfängerfehler (mit asynchronen 
Übergängen und wirren Zurücksetzen der FFs) machen, die dann solche 
sporadischen 1 mal pro Tag auftretenden Fehler ergeben. Und diese Fehler 
zu finden, zu beheben und daraus zu lernen, das dauert.

Autor: Chef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Und diese Fehler zu finden, zu beheben und daraus zu lernen, das 
dauert."
Oder es kostet gar keine Zeit, wenn man korrekt designed hat und eine 
ordentliche Verifikation möglichen Fälle vorgenommen hat. Leider wird da 
in den Ausbildungen an FH und Uni immer noch kaum etwas wertbares 
gemacht.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Oder es kostet gar keine Zeit, wenn man korrekt designed hat und eine
> ordentliche Verifikation möglichen Fälle vorgenommen hat.
Ja, aber das korrekte Designen muß ja auch erst mal gelernt werden.
Und eine ordentliche Testbench schreibt sich auch nicht von allein.

@ Alex
Mein Tipp: tricks das noch einmal mit Software im uC hin. Ein uC mit 
88MHz sollte die Bearbeitung von 32 Zählerregistern schneller 
hinbekommen als in 120us.
Und mach dich parallel mal mit der Toolchain zur FPGA-Entwicklung 
bekannt. Ein gutes EVAL-Board, brauchbare Literatur und dann gehts los.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey, das schaffe ich sogar mit einem 8bit Pic, würde für die Aufgabe 
aber ein 32bit Prozessor nehmen, und der Pic ist langsam.
Das Zauberwort heißt, wenn kein Interrupt on change,
x0^x1 = pin-change,  x0 ist aktuelle, x1 ist vorheriger Portstatus.
(x0^x1)&~x1 = pin-change, nur steigende Flanke
(x0^x1)& x1 = pin-change, nur fallende Flanke
sowie für die Timer, die Verwendung von vertical counters oder ein SW
counter sowie Xor der timings, je nach Aufgabenstellung, was schneller 
ist.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.