Hallo, ich beschäftige mich noch nicht sehr lange mit VHDL und FPGAs und habe eine Frage an euch, bei der mir hoffentlich geholfen werden kann. Hintergrund: Ich möchte ein 8Bit Schieberegister in VHDL realisieren, mit dem ich bei steigender Taktflanke schiebe und bei fallender Flanke alle 8 Takte das Register mittels parallelem LOAD laden kann, damit ich über SPI viele Daten am Stück ohne Unterbrechnung senden kann. Den Load bei fallender Flanke sehe ich als Notwendigkeit, damit neue Daten jeweils rechtzeitig vor dem Schieben anliegen. Ich habe von ausserhalb einen festen Takt mit der ich die Schaltung betreiben möchte, der aber gleichzeitig auch der spiclk sein soll. Die Frage: Nun weiß ich leider nicht wie ich den Load des Registers realisieren soll, weil meines Wissens nach ein Prozess nur auf fallende ODER steigende Flanke des Clk Signals prüfen darf. Zudem kann ich den Trick, auf fallende Flanke zu prüfen indem ich mir 2 Hilfssignale erstelle nicht nutzen, weil wie oben erwähnt clk=spiclk ist. Kann ich sonst 2 Prozesse schreiben, wobei ich mit dem 1. schiebe (rising_edge()) und mit dem zweiten das register parallel lade (falling_edge())? Oder hat jemand eine andere Idee? Mit freundlichen Grüßen, Mario
Mario schrieb: > Kann ich sonst 2 Prozesse schreiben, wobei ich mit dem 1. schiebe > (rising_edge()) und mit dem zweiten das register parallel lade > (falling_edge())? Das kannst du schon schreiben und simulieren, aber es gibt leider kein Bauteil, auf das diese Beschreibung abgebildet werden könnte... :-/ > Ich habe von ausserhalb einen festen Takt mit der ich die Schaltung > betreiben möchte, der aber gleichzeitig auch der spiclk sein soll. Das ist eine Einschränkung, aber kein Problem. Aber wehe, du hast in deinem Design noch einen 2. Takt!!! Warum übernimmst du nicht einfach mit jeden 8. Takt die neuen Daten? Die müssen ja sowieso an einem FF herauskommen... So etwa:
1 | process (sclk) begin |
2 | if rising_edge(sclk) then |
3 | sr <= sr(6 downto 0) & '0'; |
4 | if (cnt<7) then |
5 | cnt <= cnt+1; |
6 | else
|
7 | cnt <= 0; |
8 | sr <= NeueDaten; |
9 | end if; |
10 | end if; |
11 | end process; |
12 | |
13 | miso <= sr(7); |
> Ich möchte ein 8Bit Schieberegister in VHDL realisieren, mit dem ich bei > steigender Taktflanke schiebe und bei fallender Flanke alle 8 Takte das > Register mittels parallelem LOAD laden kann, damit ich über SPI viele > Daten am Stück ohne Unterbrechnung senden kann. Du mußt auf der untersten Hardwareebene nicht immmer in 8-Bit-Granularitäten denken: warum nimmst du nicht einfach ein 64-Bit Schieberegister? > Oder hat jemand eine andere Idee? Hast du einen Slave-Select und wie verwendest du ihn? Sieh dir mal meinen SPI-Slave an: http://www.lothar-miller.de/s9y/categories/26-SPI-Slave
Lothar Miller schrieb: >Aber wehe, du hast in deinem Design noch einen 2. Takt!!! Wie genau meinst du das? Ich muss mir einen zweiten Takt "generieren" mittels Multiplexer, weil ich einen Mode 0 konformen SPI Master entwickeln möchte und das spiclk Signal, selbst wenn es gleichschnell sein soll wie das ursprüngliche CLK Signal im Idle Zustand 0 sein muss. Ich weiß, dass es da von Xilinx sogenannte BufGMux gibt die ich dann wohl benutzen muss. Evtl. werde ich auch den Takt einmal halbbieren müssen mittels Counter und CE. >Warum übernimmst du nicht einfach mit jeden 8. Takt die neuen Daten? Die >müssen ja sowieso an einem FF herauskommen... Mit jedem 8. Takt neue Daten übernehmen habe ich vor, ich dachte mir jedoch, dass es eventuell Probleme geben könnte, wenn ich bei steigender Flanke gleichzeitig schiebe und das Register parallel Lade, so wie du es in deinem Code-Beispiel aufzeigst. Anscheinend habe ich da wohl einen Denkfehler?! >Du mußt auf der untersten Hardwareebene nicht immmer in >8-Bit-Granularitäten denken: warum nimmst du nicht einfach ein 64-Bit >Schieberegister? ich möchte große Mengen an Daten, die auch 64Bit bei weitem übersteigen in einem Stück senden und das bei möglichst wenig Stromverbrauch. Und ein 8 Bit SR habe ich mir deshalb überlegt, weil ich vorher mir eine Schnittstelle gebastelt habe die die Daten à 8 Bit Häppchen zur Verfügung stellt. Ich habe mir mal dein SPI Master Beispiel angeschaut (die einfachere Variante). Da hast du ja auch einen Mode 0 konformen SPI Master entwickelt. Einlesen der Daten bei fallender Flanke, auf den seriellen Datenausgang schreiben bei Steigender. Wie könnte ich das realisieren, wenn mein ursprüngliches CLK Signal nicht sehr viel schneller ist als mein SPICLK signal? MfG
Beschreib doch mal das ganze Drumrum. Ich blinzle hier durchs Schlüsselloch und sehe nichts Ganzes... :-/ Willst du einen SPI-Master machen? Oder einen Slave, der mit Daten gefüttert wird? Auf welchem Baustein soll das realisiert werden? Wie kommen die Daten in den Baustein? Woher kommen die fortlaufenden Daten? > Ich weiß, dass es da von Xilinx sogenannte BufGMux gibt die ich dann > wohl benutzen muss. Das sieht nach FPGA aus... Welches? Welcher externe Takt liegt da an?
Okay dann hole ich mal etwas weiter aus: >Willst du einen SPI-Master machen? Ja genau, glaube das habe ich oben aber auch schon geschrieben. Mode 0 konform. für meinen Controller habe ich einen festen 4Mhz Takt vorgegeben. Über SPI soll anfangs mit 2 Mhz und später mit 4 Mhz in die Register eines RF Transceivers Moduls geschrieben werden um z.B. Kalibirierungswerte zu ändern. Dabei sollen über SPI mittels meines Controllers auch Nutzdaten die ich Parallel von einem anderen Controller bekomme über SPI in ein FIFO des RF Bausteins geschrieben werden, der die dann bei entsprechend vielen Daten an eine Basisstation mittels elektromagnetischer Wellen weiterleitet. Mein Controller für den RF Baustein soll auf einem Xilinx Spartan3 FPGA laufen. MfG
Mario schrieb: > soll auf einem Xilinx Spartan3 FPGA laufen. > für meinen Controller habe ich einen festen 4Mhz Takt vorgegeben. Du schließt extern so einen niedrige Taktfrequenz ans FPGA an? Ich würde da im FPGA eher 16MHz vorsehen, damit kannst du dann ohne Handstände die 2MHz und 4MHz SPI-CLK ableiten. Mario schrieb: > Da hast du ja auch einen Mode 0 konformen SPI Master entwickelt. > Einlesen der Daten bei fallender Flanke, auf den seriellen Datenausgang > schreiben bei Steigender. Wie könnte ich das realisieren, wenn mein > ursprüngliches CLK Signal nicht sehr viel schneller ist als mein SPICLK > signal? Du verwendest einen DFS, um eine höhere interne Taktfrequenz zur Verwendung zu haben. Damit kannst du aus deinen 4MHz z.B. die o.a. 16 MHz machen. BTW: Hast du noch andere Takte im selben FPGA?
Okay dann werde ich als Takt für die Schaltung 16Mhz benutzen. Die Umsetzung ist mir dann auch klar, ich dachte nur dass es auch eine Möglichkeit gibt das alles mit 4Mhz aufzubauen. >BTW: >Hast du noch andere Takte im selben FPGA? Nein, es soll jeder Controller im FPGA mit dem selben Takt laufen. MfG
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.