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


von Ssss S. (sssssss)


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

von Kest (Gast)


Lesenswert?

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

Gruß
Kest

von Ssss S. (sssssss)


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

von Sebastian (Gast)


Lesenswert?

Ich würde auch den BLOCKRAM verwenden. Total easy.

Sebastian

von TheMason (Gast)


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

von Ssss S. (sssssss)


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

von Xenu (Gast)


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;

von Xenu (Gast)


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.

von Ssss S. (sssssss)


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

von sneed devil (Gast)


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

von Ssss S. (sssssss)


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

von Uwe Bonnes (Gast)


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.

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.