www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Zur Laufzeit konfigurierbarer SPI Master in VHDL


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe aktuell folgende Anwendung mit einem Spartan-3E FPGA:
Ich spreche mittels SPI mehrere Bausteine (DACs, ADCs, digitale 24V IOs) 
an und habe für jeden notwendige Wortbreite einen eigenen SPI Block 
Instanziiert.

Ähnlich wie hier bei Lothar:
http://www.lothar-miller.de/s9y/archives/51-Konfig...

habe auch ich einen SPI Master beschrieben, der mittels Generics 
einstellbare Frequenz und Wortbreite habe. Jedoch möchte ich nun gerne 
EIN SPI Modul nutzen, dass ich zur Laufzeit anpassen kann.

Lothar schreibt dazu "Eine Änderung der Taktfrequenz, der Protokolllänge 
und der Delays könnte problemlos auch zur Laufzeit implementiert 
werden." jedoch bekomme ich das ganze nicht so umgesetzt wie ich mir das 
vorstelle.

Es läuft entweder gar nicht oder nur mittels Unterbrechung des SPIs um 
eine kleinere Wortbreite zu realisieren.

Freue mich über eure Tipps!

Grüße
Sebastian

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

Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:
> Es läuft entweder gar nicht oder nur mittels Unterbrechung des SPIs um
> eine kleinere Wortbreite zu realisieren.
Lass mal deinen Code sehen.

Autor: Sebastian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das ist die synthetisierbare Version mit den Generics

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

Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:
> Lothar schreibt dazu "Eine Änderung der Taktfrequenz, der Protokolllänge
> und der Delays könnte problemlos auch zur Laufzeit implementiert
> werden."
Ich hatte mich auf meinen Code bezogen... ;-)

> jedoch bekomme ich das ganze nicht so umgesetzt wie ich mir das vorstelle.
Bei deinen Modulen tu ich mich auf die Schnelle da auch ein wenig 
schwer...
Da brauch ich mal ein paar ruhige Minuten.

Aber der erste Schritt weg von den Generics, ist, erstmal die nötigen 
Generics zu Ports zu machen. Und dann dort zu den richtigen Zeitpunkten 
passende Signale anzulegen. Das sollte natürlich nicht passieren, 
solange eine Übertragung aktiv ist.

BTW:
Der Kommentar stimmt nicht
spi_s_data_out <= spi_p_data_in(pointer); -- data is shifted out serial
Da wird nichts geshiftet, das ist ein Multiplexer...

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, dass Du Dich damit befasst!

Bisher ist es so, dass eine State Machine nach einer Übertragung den 
aktuellen SPI deaktiviert und den nächsten aktiviert.
Diese State Machine würde ich gerne nutzen um das " Zur Laufzeit 
konfigurierbarer SPI Master"-Modul mit neuen Werten zu füttern...

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

Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:
> Diese State Machine würde ich gerne nutzen um das " Zur Laufzeit
> konfigurierbarer SPI Master"-Modul mit neuen Werten zu füttern...
Richtig, so mache ich das auch...
Und wie gesagt: der erste Schritt ist, die Generics in Ports 
umzuwandeln, damit du darüber Parameter in Hardware übergeben kannst.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb
> ...der erste Schritt ist, die Generics in Ports
> umzuwandeln, damit du darüber Parameter in Hardware übergeben kannst.

Damit im FPGA aber klar ist wieviele Ressourcen benötigt werden ist es 
demnach notwendig, den "größten" notwendigen SPI ins Design zu nehmen 
und diesen dann zur Laufzeit "abzuspecken".

Eigentlich stelle ich mir das nicht so kompliziert vor - "einfach" ein 
SPI mit 32 Bits beschreiben und wenn nur 16 benötigt werden, dann soll 
der halt nur bis 16 Zählen und dann die Klappe halten :)

Nur mit der zu sendenden und empfangenen Wortbreite habe ich noch 
Schwierigkeiten, denn die wird ja weiterhin 32 Bit breit sein und dort 
greife ich dann nur die untersten 16 ab, wenn ich nur auf 16 Zähle - 
soweit klar. Nur wie mache ich das dynamisch, dass ich nicht vorher die 
Wortbreite wissen muss. Da hängt es gerade bisschen.

Grüße

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

Bewertung
0 lesenswert
nicht lesenswert
Sebastian schrieb:
> Nur wie mache ich das dynamisch, dass ich nicht vorher die
> Wortbreite wissen muss. Da hängt es gerade bisschen.
Natürlich mußt du vor dem Senden wissen, wieviele Bits du zu senden 
hast. Deine Controller FSM, die ja auch die Daten breitstellt und 
abholt, muß deinem SPI dann also gleichzeitig sagen, wiviele Bits zu 
versenden sind. und der Rest ist nur eine entsprechende Berechnung des 
Index für deinen Multiplexer.

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.