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
Ein Zähler? Im Rom (RAM) sind die Werte... irgendwie verstehe ich Dich nicht ;-) Gruß Kest
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
@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
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
>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;
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.
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.