Forum: FPGA, VHDL & Co. Schieberegister- Frage zum Load


von Mario (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Mario (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von Mario (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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?

von Mario (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.