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


von Sebastian (Gast)


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-Konfigurierbarer-SPI-Master.html

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

Das ist die synthetisierbare Version mit den Generics

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

von Sebastian (Gast)


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...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Sebastian (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

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.