mikrocontroller.net

Forum: FPGA, VHDL & Co. viele Daten per SPI senden (vhdl)


Autor: Ssss Ssssss (sssssss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Der Titel ist ein bisschen blöd, mir ist nichts
aussagekräftigeres eingefallen :-\

Mal angenommen ich implementiere SPI auf einem FPGA in vhdl.
Die Implementierung an sich ist kein Problem.

Jetzt möchte ich aber irgendeinen slave der am Bus hängt ansteuern.

Also wenn ich zb 50 byte senden möchte:
0xAB senden
0xCD senden
... jetzt noch 48 andere Befehle senden

Wie mache ich das am besten bzw Ressourcensparsam ?

Mein Ansatz wäre jetzt eine Statemachine
die 50 Zustände hat und jeweils den tx buffer mit dem wert lädt
(gesteuert durch clock und txdone flag oder so).

Aber das muss doch auch irgendwie sparsamer gehen oder ?
Gibts da nen Trick ?

Danke & Gruss,
Simon

Autor: Kest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Zähler? Im Rom (RAM) sind die Werte... irgendwie verstehe ich Dich
nicht ;-)

Gruß
Kest

Autor: Ssss Ssssss (sssssss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah danke! g
Ich schnapp mir also einfach nen Block-Ram (xilinx spartan3)
und und benutze das quasi als ROM.
Hatte da viel zu kompliziert gedacht ;)

Hab bis jetzt nie internes ram gebraucht (hab nen großes externes sram
dran).
Werd mir mal die appnote durchlesen :)
( http://www.xilinx.com/bvdocs/appnotes/xapp463.pdf )

Danke :)

Muss mir nur noch was überlegen wie man das dann lesbar/verständlich in
vhdl initialisiert (geht ja laut appnote per INIT_xx).

Gruss, Simon

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde auch den BLOCKRAM verwenden. Total easy.

Sebastian

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@simon

block-rams sind die einfachste und bequemste variante.
ich benutze die dinger recht exzessiv :-)) für
- vga-text-interface
- dsp-micro/makro-code
(und demnächst für einen multi-uart)

also nicht lange denken. einfach nutzen :-)) die dinger sind echt
komfortabel (vor allem die dual-port-variante *ggg) und mit nem
core-generator sinds nur ein paar klicks

gruß
rene

Autor: Ssss Ssssss (sssssss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich kämpf grad mit dem core generator (webpack8.1/linux)..
nach dem klick auf generate passiert nix und wenn ich dann nochmal auf
customize klicke sagt er "A dialog is already open. Please close it
before continuing"
Davon seh ich aber nix g
Installier jetzt erstmal das update, hoffe mal dass es dann geht.

Bye, Simon

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Muss mir nur noch was überlegen wie man das dann lesbar/verständlich
>in vhdl initialisiert (geht ja laut appnote per INIT_xx).


Das INIT_xx kannst Du Dir sparen.

Definiere einen Array-Typ, deklariere ein Signal dieses Typs und
schreib Initialisierungswerte rein:


  type ram_t is array (0 to 49) of std_logic_vector(7 downto 0);

  signal ram : ram_t :=
  (
    "00000011",
    "01010010",
    etc...
  );


Und dann im Leseprozess so darauf zugreifen:


  process(clk)
  begin

    if(rising_edge(clk)) then
      if(read = '1') then
        data_reg <= ram(conv_integer(addr));
      end if;
    end if;

  end process;

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

Falls Du das Blockram mit dem Coregenerator machen willst,
das kannst Du Dir auch sparen.

Schreib es einfach so wie ich es oben geschrieben habe, dann erkennt
der Synthesizer das automatisch als Blockram.

Autor: Ssss Ssssss (sssssss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ah super. das ist mir natürlich noch lieber (da besser lesbar).

Der coregen geht jetzt nach dem update übrigends auch :)

Danke!

Bye, Simon

Autor: sneed devil (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Simon,

kannst Du nicht mal ein HowTo für die SPI-Neulinge schreiben, die auch
versuchen ein Bauteil per SPI anzu steuern ?

Gruss
Sneed

Autor: Ssss Ssssss (sssssss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Sorry hab dazu leider keine Zeit :-\
Aber guck dir einfach mal zb von irgendeinem SPI Bauteil die Waveform
Diagramme an.

Da siehste dann was du wann/wie senden/lesen musst.

Das dann in VHDL umzusetzen ist nicht allzu schwer ;)

Bye, Simon

Autor: Uwe Bonnes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe fuer eine aehnliches Problem folgenden Ansatz gewaehlt. CS
rahmt einen Zugriff. Als erstes Byte sendet der Controller eine
Registeraddresse, dann sendet er ggf Daten, das Sklave antwortet ggf
mit seinen Daten. Wenn CS weggeht, wird der Zugriff beendet, der
naechste Zugriff muss eine neue Adresse schreiben. Um grosse Bloecke zu
lesen habe ich ein "Continue" Register Adresse definiert, das den
letzten Zugiff an der unterbrochennen Stelle weiterfuehrt.

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.