Hallo zusammen,
bei der VHDL Synthese (Xilinx ISE WEBPACK 8.1 & Target: XC9500 Familie)
bekomme ich folgende Warnmeldungen:
WARNING:Xst:1780 - Signal <BUFFER_A<1:0>> is never used or assigned.
WARNING:Xst:1780 - Signal <BUFFER_B<1:0>> is never used or assigned.
zu diesem Code:
Variablen sollte man in VHDL meiden wo es nur geht - und hier ist
eigentlich kein Grund welche zu verwenden.
Grund: Soetwas wie eine Variable, die ihren Wert instantan ändert, gibt
es in Hardware nicht - die Synthese muss also irgendwie versuchen, das
in Hardware zu realisieren und das scheint hier nicht ganz zu
funktionieren.
PS: Ist der asynchrone Reset wirklich notwendig?
@Fpga Kuechle
Wenn man einem Signal einen Wert zuweist, dann wird der doch erst am
Ende des Prozesses aktualisiert? Damit wird verschiebt sich alles um
einen Takt/ Prozessaufruf...? hmmm..
@Jan M.
Dann stößt das Synthese Tool an seine Grenzen ? kann man sich die
Warnmeldung irgendwie erklären weil jetzt weiß ich ja dann nie wann man
Variablen verwenden darf und wann nicht ???
AlexW wrote:
> @Fpga Kuechle> Wenn man einem Signal einen Wert zuweist, dann wird der doch erst am> Ende des Prozesses aktualisiert? Damit wird verschiebt sich alles um> einen Takt/ Prozessaufruf...? hmmm..
Ja, du willst doch FF fuer Buffer_, FF sind nun mal um einen Takt
verzögert.
Und CHB_FILT schaltet auch nicht jeden takt sondern erst nach frühestens
4.
Also ist dieses Signal auch ein FF (mit Verzögerung).
@AlexW: Zeige uns deine RTL Schematic und du weißt, warum diese Warnung
kommt.
Zur Benutzung von Variablen:
1) Variablen benutzt man nicht.
2) Wenn es nicht ohne geht, tritt 1) in Kraft.
3) Wenn es wirklich nicht ohne geht, dann benutzt man sie.
Genau wie ein "after 10 ns" kann eine Variable halt nicht in Hardware
benutzt werden. Natürlich kann man sie irgendwie umschreiben. Bei
"after" kann die Synthese das gar nicht (obwohl es in den allermeisten
Fällen doch einen Weg gäbe, es zu tun) und bei Variablen kann sie es
häufig.
Variablen sind nichts mysteriöses. In diesem Fall gibt es für die
Synthese eigentlich keinen Grund sich so anzustellen, das ist
straightforward: daraus dass die Variable vor der ersten Zuweisung
gelesen wird ergibt sich ein FlipFlop; daraus dass der zugewiesene Wert
gleich weiterverarbeitet wird ergibt sich, dass die restliche Logik im
Prozess mit den FlipFlop-Eingängen arbeitet. Naja, warten wir mal auf
den schematic.
Naja, die Variable wird ja im Prinzip nicht gelesen, bevor sie
geschrieben wird, sondern sie wird gleichzeitig gelesen und beschrieben,
zumindestens Teile davon (2 downto 1). Das kann schon zur Irretierung
des Synthesetools führen. Was anders wäre es, wenn der Variable ein
anderes Objekt als sich selbst zugeweisen wird, da wäre alles klar.
@ T.M. (Gast)
>BUFFER_A (2 downto 0) := BUFFER_A (3 downto 1);>Naja, die Variable wird ja im Prinzip nicht gelesen, bevor sie>geschrieben wird, sondern sie wird gleichzeitig gelesen und beschrieben,>zumindestens Teile davon (2 downto 1). Das kann schon zur Irretierung>des Synthesetools führen.
Es irritiert nicht nur, es IST eine elementarer Unterschied in VHDL. UNd
weil man den immer wieder schwer verclickern kann, sollen vor allem
Anfängr die Finger von Variablen loassen? Wo ist das Problem?
MFG
Falk
Wieso sollte Ich ein Problem damit haben? Ich habe nur darauf
hingewiesen, würde Variablen selber so nicht verwenden. Wenn ich FFs
haben will, dann lese ich die Variable zuerst, bevor ich sie beschreibe,
aber beschreibe sie nicht mit (Teilen von) sich selbst, wie es hier
gemacht wurde.
@ T.M. (Gast)
>Wieso sollte Ich ein Problem damit haben?
Wer sagt denn das? Ich? Nein, das war indirekt an den OP und alle
Variablenfetischtisten gerichtet. ;-)
MfG
Falk
@Falk
> Es irritiert nicht nur, es IST eine elementarer Unterschied in VHDL.
Wo ist der Unterschied zwischen
a(2 downto 0) := a(3 downto 1);
und
temp := a(3 downto 1);
a(2 downto 0) := temp;
?
@Alexw: wenn ich ISE hier hätte hätte ich den Code auch selbst
synthetisieren können, poste doch lieber mal ein Bild.
IMHO entspricht das Problem dem unterschied zw.:
a(2 downto 0) := a(3 downto 1);
und
a(2 downto 0) := temp;
temp := a(3 downto 1);
also die lebensdauer einer variablen
@ Andreas Schwarz (andreas)
>> Es irritiert nicht nur, es IST eine elementarer Unterschied in VHDL.>Wo ist der Unterschied zwischen>a(2 downto 0) := a(3 downto 1);>und>temp := a(3 downto 1);>a(2 downto 0) := temp;
Ich meinte zwischen Variablen und Signalen.
MFG
Falk
Das Bit 0 im Register ist definitiv überflüssig, weil es bei der
Zuweisung sofort überschrieben wird. Das Schieberegister ist also nur 3
Bit lang. Bleibt nur noch die Frage warum auch das Bit 1 wegoptimiert
wird. Ich bin mir gar nicht mehr sicher dass es sich dabei um einen
Fehler handelt, siehe Anhang (ISE 9.2, selbe Warnung). Verdächtig ist,
dass CHA_FILT an das Netzwerk vor dem FlipFlop-Eingang zurückgeführt
wird. Könnte da doch noch das im richtige Verhalten rauskommen?
Jungs, die Frage ist ob Variablen nach Abarbeitung des Processes ihren
Wert
behalten oder nicht! IMHO tun sie es nicht, es sind einfach nur
Leitungen, keine Speicher.
Und so macht XST auch die Schaltung draus, es verbindet CHB direkt mit
BUFFER_B[3], und BUFFER_B[2] mit BUFFER_B[3].
Die unteren beiden bits der variable werden bei jedem Aufruf
(Taktflanke) neuinitialiert, entsprechen also offenen Leitungen. Also
fliegen sie aus der synthese.
Wie gesagt die lebensdauer einer Variable ist der Schlüssel zur Antwort.
Signale werden dagegen nur einmal initialisiert.
Variablen behalten schon ihren Wert, deshalb macht XST auch FlipFlops
daraus. So wie ich das gelernt habe wird eine Variable dann zum
FlipFlop, wenn sie in einem Prozess vor der ersten Zuweisung gelesen
wird (http://www.vhdl-online.de/~vhdl/tutorial/deutsch/t_216.htm).
Bisher hat das immer mit dem was ich als Syntheseergebnis gesehen habe
übereingestimmt.
@ FPGAküchle (Gast)
>behalten oder nicht! IMHO tun sie es nicht, es sind einfach nur>Leitungen, keine Speicher.
Irrtum, Variablen können auch zu FlipFlops werden. Allerdings kann das
bisweilen daneben gehen, weil die Unterscheidung in VHDL eben etwas
kniffelig ist. Aber wir drehen uns im Kreis. Nehmt Signale und gut ist.
MFG
Falk