Hallo VHDL Gemeinde Ich möchte mit I2C, Werte und Zustände in einem FPGA ändern aber auch auslesen können. Hauptsächlich sind das Werte von VARIABLEn bzw. SIGNALen. Also müsste ja der FPGA als Slave arbeiten und der I2C Controller der Master sein. Ich habe aber keine Idee wie ich den FPGA und desen Inhalt ansprechen kann. Kann mir da jemand nen Tip geben bitte. Sers :)
Sigi schrieb: > Werte und Zustände in einem FPGA ändern aber auch auslesen können. > Hauptsächlich sind das Werte von VARIABLEn bzw. SIGNALen. > Ich habe aber keine Idee wie ich den FPGA und desen Inhalt > ansprechen kann. Was ist denn überhaupt dein Problem? Im FPGA gibt es keine Signale und keine Variablen. Dort gibt es nur Register und Logik... > Also müsste ja der FPGA als Slave arbeiten und der I2C Controller der > Master sein. > Kann mir da jemand nen Tip geben bitte. Du wirst einen I2C Slave ins FPGA hacken müssen, wenn du da irgendwas hin- und herbewegen willst... Aber das ist vorerst noch schwieriger, als du dir vorstellen kannst. Welche Erfahrung hast du mit VHDL und FPGAs?
Lothar Miller schrieb: > Welche Erfahrung hast du mit VHDL und FPGAs? ...sagen wir mal Basiswissen ist vorhanden. Die Aufgaben die ich in VHDL lösen musste habe ich bis jetzt immer "hinbekommen". Lothar Miller schrieb: > Dort gibt es nur Register und Logik... Ich meinte Zustände in FF und Registern ändern :). Da habe ich mich flasch ausgedrückt. Also müsste ich ja erstmal wissen wie die Hardwareadressen der Register sind wo die Werte gespeichert sind?
Sigi schrieb: > Also müsste ich ja erstmal wissen wie die Hardwareadressen der Register > sind wo die Werte gespeichert sind? Klar weißt du das. Du selber schreibst das ja hin: signal meinregister : std_logic_vector(7 downto 0); Und genau das meinregister mußt du über den I2C zurücksenden, wenn jemand "draussen" diesen Wert wissen will, und das dann über I2C anfragt. Es gibt nicht (wie z.B. in einem uC) irgendwelche "Registersätze" im FPGA, die über irgendwelche "Adressen" angesprochen werden. Diese Denkweise ist grundsätzlich falsch!
Lothar Miller schrieb: > Diese Denkweise ist grundsätzlich falsch! ...das hör ich immer wieder. Ich verfalle immer wieder in das C-Denken. Also ist der Name des SIGNAls / der VARIABLen gleichzeit der Registername. Also muss ich mit I2C auch diesen "Namen" ansprechen?
Sigi schrieb: > Also muss ich mit I2C auch diesen "Namen" ansprechen? Du kannst da nichts "ansprechen" (schon wieder diese Pointer-Denkweise). Du mußt das hart und explizit "verdrahten": Wenn z.B. ein Bitmuster "00010110" als I2C-Adresse auftauchen sollte, dann wird meinregister an den I2C Master zurückgegeben (das ist jetzt meine Definition, deine wird logischerweise anders aussehen). Und in der Hardware wird das letztlich als Multiplexer abgebildet.
Hmmm...ok. Ich glaube das wird mir noch Kopfschmerzen machen :). Danke erstmal.
Das macht nicht nur dir Kopfschmerzen ,-) Herr Miller und einige andere auch sind hier aber sehr hilfbereit und haben i.d.R. gute Ratschläge. Frage ist denke ich natürlich ob bei dir was professionelles rauskommen soll oder so ein gesundes 'hab ich grob verstanden' wie bei mir ausreicht. Persönlich würde ich mir die Verwirrung wirklich konkret vorstellen, nämlich als 74er Grab, was kreuz und quer wild gefädelt wird. Da sind dann 8 FF da steht ein Aufkleber "meinregister" drauf. Soll das in ein Senderegister, muss( bzw 'kann' ist ja auch praktisch irgendwie) das bit für bit an dieses Senderegister gefädelt werden. Also nicht über eine Adresse, einen Bus oder sonstwas angesprochen werden. Man möge dieses Bild gerne korrigieren wenns dann doch zu naiv ist.
Sag uns doch erst mal, wozu das gut sein soll. Meistens werden hier Probleme erörtert, die gar keine sind. Soll das zum Debuggen sein? Wenn ja, das geht sowieso überhaupt nicht mal ansatzweise so, wie beim einem µC. FPGAs werden durch Simulation verifiziert. Für ganz haarige Sachen hilft auch mal ChipScope, Problem dabei ist aber, dass der aktiv Teil des Systems ist und nicht einfach unabhängig vom Rest der Logik agiert.
Ich habe einen FPGA auf dem eine Videobearbeitung und Funkübertragung läuft. Nun möchte ich per I2C gewisse Werte ändern. Auflösung, Modulation...etc. Habe gerade ein I2C Slave für den FPGA gefunden. Und siehe da, auf einmal machte es klick wie ich das programmieren muss. Habe wieder mal erlebt wie schön und hilfreich Kommentare zu den Befehlen sein können. Das Teil "verdrahtet" mit dem anderen VHDL "Zeug"...und läuft. Jetzt muss ich mich nur noch um die Programmierung des uC kümmern..."nur noch" ;)
http://www.fpga4fun.com/I2Cslave1.html Hier gibt's eine Verilog-Implementierung. Muss man noch nach VHDL übersetzen, ist sicher viel einfacher als alles neu zu erfinden. MfG
...ach was seh ich da... unten auf der genannten Seite gibt's ne VHDL-Implementierung runterzuladen.
dr.schmock schrieb: > unten auf der genannten Seite gibt's ne > VHDL-Implementierung runterzuladen. Mit solchen Konstrukten:
1 | -- stop condition detection
|
2 | process (RST, SCL, SDA_IN, START) |
3 | begin
|
4 | if RST = '0' or SCL = '0' or START='1' then |
5 | STOP <= '0'; |
6 | elsif SCL = '1' and SDA_IN = '1' and SDA_IN'event then |
7 | STOP <= '1'; |
8 | end if; |
9 | end process; |
Ein asynchroner kombinatorischer Reset mit nicht einsynchronisierten externen Signalen... :-o Für ein CPLD lasse ich das noch mal durchgehen. Aber ich würde /sehr empfehlen/, dieses Design vor der Serienauslieferung auf Herz&Nieren zu testen!
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.