Forum: FPGA, VHDL & Co. Schieberegister


von MarkusG (Gast)


Lesenswert?

Hallo zusammen,

ich habe folgendes Problem:

Ich habe ein Schiebregister mit Serieller Ein und Paralleler Ausgabe in
VHDL beschrieben. Im Simulator habe ich eine Zeichenfolge zur Seriellen
Eingabe mit Clocktakt erzeugt und das Shift Register arbeitet
einandfrei.

Nach der Synthese wird jedoch bei gleichen Eingangssignalen (wie bei
der Simulation) am Ende ein Bitmuster ausgegeben, das um eine Stelle
verschoben ist im vergleich zur simulation. Simulation und realität
passen also nicht. Was könnte denn da schief gelaufen sein ?

Grüsse

Markus

von FPGA-User (Gast)


Lesenswert?

Die Ursachen könnte sein:

Die erzeugten Stimuli in der Simulation entsprechen
nicht dem praktischen Betrieb.

In der praktischen Schaltung liegen die Daten
möglicherweise verzögert an?
Hast Du die Setup-Zeit berücksichtigt ?
(Daten müssen immer x ns vor der Taktflanke anliegen!
s. Datenblatt FPGA)

Wie werden die Daten denn praktisch generiert und
wie ist der Zeitpunkt zum Auslesen des SRG definiert?
Gibt es z.B. 8 aufeinanderfolgende Takte oder
gibt es noch ein Clock-Enable Signal ?

von MarkusG (Gast)


Angehängte Dateien:

Lesenswert?

Oha, also ich hab den Code mal angehängt vielleicht findet ihr den
Anfängerfehler g

von FPGA-User (Gast)


Lesenswert?

Hallo MarkusG,

nimm mal tmp und Unload aus der Sensitivity-List
des Prozesses heraus, also so :

process(C, Reset)
...

und simuliere jetzt nochmal. Ich gehe mal davon aus, dass
Unload ein synchrones Übernahme-Signal zum Speichern
des tmp-Wertes in die Ausgaberegister ist, damit gehört
es nicht oben in die Liste.

Unload muss synchron zum Clock sein und genau 1 Takt
lang aktiv sein. Es darf aber erst 1 Takt nachdem das letzte
Bit eingeschoben wurde aktiviert werden !
Also mit der Taktflanke 58 wird das letzte Bit eingeschoben, dann
muss Unload im Takt 59 aktiv sein, sonst speicherst Du zu früh ab.
Wenn Du nicht sicherstellen kannst, dass Unload nur 1 Takt aktiv ist,
dann nimm die Ausgaberegister aus dem Prozess heraus und
schreibe einen 2. Prozess mit Unload als Clock :

process(Unload, Reset)
...

Jetzt können die Ausgaberegister mit steigender oder fallender
Flanke von Unload gesetzt werden, musst aber mit dem Timing
mehr aufpassen, da die Sache jetzt asynchron ist.

von FPGA-User (Gast)


Lesenswert?

sorry, mit den Takten hatte ich mich verzählt.
es sind natürlich 59 und bei 60 muss Unload
aktiv werden

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.