Forum: FPGA, VHDL & Co. Statemaschin mit Tristate


von Andreas H. (forrester)


Angehängte Dateien:

Lesenswert?

Hallo,

ich hab eine "Statemaschine" geschrieben, um später eine Firmware auf 
ein BE, über ein FPGA zu laden.

Kurz zur Erklärung des Programmcodes:

Über ADDR werden die indirekten Adressen ausgewählt und mittels HDATA 
wird den Adressen ein Wert zugewiesen.

Zunächst werden 2 Register ("PLL_HI" und "PLL_LO") beschrieben um danach 
in einen Wartezustand zu gehen.

Dann werden weitere Register beschrieben, bis irgendwann ein Register 
"EIRQFLG" abgefragt wird (ob Bit 10 = 1 ist) usw.

Die Zustände "wait" musste ich reinsetzen, da ansonsten ModelSim 
gleichzeitig lesen und schreiben wollte.

Das "Problem" an der ganzen Sache ist das HDATA ein Tristate sein muss, 
da:

1. verschiedene Register über HDATA abgefragt werden
2. Das BE bei erfolgreichen Laden der Firmware , ein Signal 
zurückliefert und die "Statemaschine" dann erst weiterläuft.

Nach einigen hin und her hab ich das ganze eigentlich auch zum laufen 
bekommen (dachte ich).

Die "Behavioral Simulation" funktioniert auch wie gewollt --> wave1.do

Wenn ich allerdings das ganze mittels "Post-Rout Simulation" durchlaufen 
lasse, macht die "Statemaschine" was sie will. ---> wave2.do

Wenn die "Statemaschine" in bestimmten Zuständen ist, liegen die 
Adressen nicht an bzw. die Daten werden über HDATA bereits geschrieben 
bevor überhaupt die Adresse anliegt.

Daher meine Frage.

Was mach ich falsch? Ich hab in verschieden Foren u.a. auch hier 
gelesen, dass man Tristates, bevor man diese lesen möchte erst mit 'z' 
"hochohmisch" machen muss.

Das ganze läuft wie gesagt bei der "normalen" Simulation ohne Probleme, 
allerdings bei dieser "Post-Route" Simulation überhaupt nicht.

Ich bedanke mich schonmal im vorraus für die Hilfe.

Gruss

Andreas

von Falk B. (falk)


Lesenswert?

@ Andreas Hofmann (forrester)

>Was mach ich falsch? Ich hab in verschieden Foren u.a. auch hier
>gelesen, dass man Tristates, bevor man diese lesen möchte erst mit 'z'
>"hochohmisch" machen muss.

Logisch, denn sonst treibt dein FPGA ja die Ports, und du liest die 
Werte zurück, die du ausgibst.

>Das ganze läuft wie gesagt bei der "normalen" Simulation ohne Probleme,
>allerdings bei dieser "Post-Route" Simulation überhaupt nicht.

Vergiss die "Post-Rout" Simulation. Zeitverschwendung. Ein sauberes 
synchrones Design braucht nur die Behavioural Simulation.

MFG
Falk

von Mark (Gast)


Lesenswert?

sm_adv212_encode.vhd
Zeile 85 : counter ist vom Typ std_logic- wieso ist das ein counter?

Zeile 102 : wieso schreibst Du start in die Sensitivity-Liste?
Zeile 103 : warum nimmst Du eine Variable ???

Zeile 155: warum nicht others=> ?

Zeile 406: keine Konstanten direkt reincoden! 422, 429, 433 ebenso

Deine FSM ist der Hammer!

Leider ist das ganze Design asynchron.
Bsp.: immer noch sm_adv212_encode.vhd:
Zeile 451:
if (VALID = '1') and (HOLD = '0') then
Abfrage eines externen Signals in der FSM -> asynchron, da nicht
eingetaktet.

Und übrigens, alle Signale die in Deiner FSM generiert werden laufen
teilweise über riesige Kombinatorik bis sie zum Ausgang gelangen.
Ich würde dringend raten sämtliche Signale nochmal über Register zu 
führen.

von Andreas H. (forrester)


Lesenswert?

@Mark

Zeile 85: counter ist einfach nur ein Signalname oder worauf willst du 
hinaus?

Zeile 102: Start steht deshalb in der Sensitivitätsliste, da es in einen 
anderen Process gesetzt wird und somit der process "zaehler" gestartet 
wird, d.h. wäre es nicht darin würde i nie hochgezählt werden.

Zeile 103: hab ich mittlerweile zum Signal gemacht, allerdings das selbe 
Ergebnis

> Zeile 155: warum nicht others=> ?
>
> Zeile 406: keine Konstanten direkt reincoden! 422, 429, 433 ebenso
>

Warum in Zeile 155 others=>?

Hab es mittlerweile als extra Zustand eingefügt, leider immer noch das 
selbe Ergebnis

Warum darf man keine festen Hex-Werte reinschreiben? Wäre mir neu

Ich weiss, das es asynchron läuft, ist so gewollt.

Das die Kombinatorik riesig ist, hab ich auch bereits festgestellt. Da 
allerdings die Register vom BE vorgegeben sind und ich direkt auf diese 
schreiben muss, weiss ich nicht was es bringen soll erst andere Register 
zu beschreiben.

von Mark (Gast)


Lesenswert?

Hi Andreas,

OK, ich muss also weiter ausholen:

"Ich weiss, das es asynchron läuft, ist so gewollt."

Tut mir leid, an der Stelle brauch ich eigentlich nicht weiter 
schreiben,
da Dein Design so vermutlich nie funktionieren wird.
Ich versuchs trotzdem.
1) counter hat bei Dir genau 1 Bit. Ein Marketing-Experte würde 
natürlich
sein Flip-Flop als Counter verkaufen, ich finde aber das das hier nicht 
passt.

2) bei 'start' liegst Du daneben. Du hast nicht verstanden was ein 
Prozeß
ist und wie er funktioniert.

3) Zeile 155: wenn sich HDATA mal um 1 bit ändert (Datenbreite) musst Du 
hier Deinen Code ändern, mit others=>'Z' hast Du das ein für allemal 
erledigt

4) klar kannst Du Konstanten direkt reinschreiben, aber dann frage ich 
mich warum Du Dir die Mühe gemacht hast ein wunderschönes Package zu 
schreiben?

5) der letzte Punkt:
wenn ich Dich richtig verstanden habe, sollen die Signale ADDR, RD, WE, 
CS
usw. an Pins des FPGAs geführt werden und zu einem externen Bauelement 
gehen. Wie willst Du mit Deiner VHDL-Beschreibung das Timing einhalten?
Bei 1 MHz Takt ist das sicher alles unproblematisch aber wenns mehr 
wird?
Hast Du mal die Laufzeit von den FFs Deiner FSM zu den PADs gemessen?
Es wäre ziemlich clever, ADDR, HDATA und die CTRL-Signale am Ende 
nochmal
durch Flip-Flops zu jagen. Warum? Du hast dann das Timing mit nur einem 
CLock-Constraint im Griff. Und wenn die besagten Register alle im IOB 
liegen haben sogar alle Signale garantierte und gleiche Clock- to 
-Output
Zeiten an den FPGA-Pins! Ist das nichts?

von Mark (Gast)


Lesenswert?

und was ist eigentlich im State <wait0_s> mit dem start-Signal?
Das fehlt hier. Was soll das Synthesetool nun machen?
Ein Latch?!

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.