viele Daten per SPI senden (vhdl)

#388337
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
#388339
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
Gast #388341
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
#388342
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
Gast #388343
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;
Gast #388344
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.
Gast #388348
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren