Hallo zusammen,
ich versuche für meine Bachelorarbeit Butterfly Zellen (zwei
Rückgekoppelte D-Latches mit Preset und Reset) auf einen Altera Cyclone
II FPGA zu implementieren. Dafür verwende ich Quartus II Version 13.0.
Aber das Porgramm optimiert immer meine Butterfly Zellen weg und legt
die Pins, die mit den Ausgang der Zellen verbunden sind, auf GND. Weiß
jemand, wie man diese Optimierung abschalten kann?
Mit einen Spartan3e FPGA von Xilinx konnte ich die Butterfly Zellen mit
denselben vhdl-Dateien implementieren.
Im Anhang findet ihr mein Quartus II Projekt. Ich freue mich auf eure
Antworten.
Gruß
Johannes
Johannes R. schrieb:> Im Anhang findet ihr mein Quartus II Projekt.
Damit kann ich mangels Software leider nichts anfangen, aber welche
Fehlermeldungen/Warnungen/Infos bekommst du denn?
> Im Anhang findet ihr mein Quartus II Projekt.
Könntest du nicht einfach die paar VHDL-Datein einzeln hier anfügen?
Dann hätten auch die mit Handy eine Chance, dir zu helfen.
> und legt die Pins, die mit den Ausgang der Zellen verbunden sind, auf> GND. Weiß jemand, wie man diese Optimierung abschalten kann?
Ich vermute, das hängt irgendwie mit der sehr eigenwilligen Beschreibung
des Flipflops zusammen...
Und auch die rustikale Takterzeugung mit dem slow_clock wird so in einem
FPGA nicht gemacht. Da sollte eine Warnung zum Thema "clock skew" ganz
hell aufleuchten. Korrekterweise nimmt man da einen Clockmanager her,
die hat man schließlich beim Kauf des FPGAs auch bezahlt.
Oder besser noch: sieh dir das Thema "Taktteilung mit Clock Enables" an.
> Ich freue mich auf eure Antworten.
Ein Thread zum Thema reicht eigentlich... Welchen soll ich löschen?
Johannes R. schrieb:> Aber das Porgramm optimiert immer meine Butterfly Zellen weg und legt> die Pins, die mit den Ausgang der Zellen verbunden sind, auf GND. Weiß> jemand, wie man diese Optimierung abschalten kann?
So wie ich das sehe, verschwinden deine Flipflops schlicht deswegen,
weil ihr Clock-Eingang nicht getaktet wird.
Was soll ohne Takt passieren?
C. A. Rotwang schrieb:> Johannes R. schrieb:>> Aber das Porgramm optimiert immer meine Butterfly Zellen weg und legt>> die Pins, die mit den Ausgang der Zellen verbunden sind, auf GND. Weiß>> jemand, wie man diese Optimierung abschalten kann?>> Das Thema wurde zuletzt im Sommer hier diskutiert, die Lösung liegt in> der Verwendung des richtigen (Synthese)-Attributes:> Beitrag "Verilog attribut "keep" in Quartus"> Beitrag "Altera SignalTap: Wegoptimieren von Signalen verhindern"
Ich denke, das ist bloß die halbe Miete.
Der TO sollte sich zunächst mal anschauen, wie man in HDL ein Register
beschreibt. So, wie er das bislang versucht hat, kommt da - wenn
überhaupt - lediglich kombinatorische Logik raus.
C. A. Rotwang schrieb:> die Lösung liegt in der Verwendung des richtigen (Synthese)-Attributes
Das wäre bestenfalls ein böser Work-Around.
Die Lösung liegt (neben dem wegen der statisch anliegenden '1' durch
"xAlwaysTrue" fehlenden Takt) darin, das Flipflop so zu beschreiben,
dass der Synthesizer was damit anfangen kann. Wie das für die jeweilige
Toolchain aussehen muss, das steht im Handbuch zum Synthesizer.
Aber sobald man ein Flipflop anders beschreibt als der Rest der Welt,
wird die Portierbarkeit leiden.
Hier kommt noch dazu, dass D eigentlich nicht in die Sensitivliste
gehört:
1
architectureBehavioralofD_FlipFlopis
2
begin
3
process(CLK,PRE,CLR,D)
4
begin
5
if(CLR='1')then
6
Q<='0';
7
elsif(PRE='1')then
8
Q<='1';
9
elsif(CLK='1')then
10
Q<=D;
11
endif;
12
endprocess;
13
endBehavioral;
Es "schadet" zwar nicht, es deutet aber drauf hin, dass der, der das
gemacht hat, noch Verständnisprobleme hat... ;-)
Wenn ich etwas "CLK" nenne, heißt das noch lange nicht, daß das deswegen
auch eine ist .
Entsprechend erzeugt der Prozeß (ohne clk'event) auch kein Flipflop,
sondern bloß (ziemlich unnütze) Kombinatorik.
Markus F. schrieb:> Entsprechend erzeugt der Prozeß (ohne clk'event) auch kein Flipflop,> sondern bloß (ziemlich unnütze) Kombinatorik.
Richtig, da fehlt ja das 'event. Böse, böse. Aber Johannes will ja
(obwohl das Konstrukt irreführend "Flipflop" heißt") tatsächlich Latches
haben, denn
Johannes R. schrieb:>>> ich versuche für meine Bachelorarbeit Butterfly Zellen>>> (zwei Rückgekoppelte D-Latches mit Preset und Reset)
Allein, ich vermute, dass das Design dadurch grundlegend zum Scheitern
verurteilt ist. So ein Hingebastel habe ich vor langer Zeit mal zufällig
gemacht. Das Resultat: eine kombinatorische Schleife...
Ich habe die paar VHDL-Dateien nochmal angeschaut: darf ich die als
schlechte Beispiele für meine
Praktikanten/Studenten/Abschlussarbeitschreibende hernehmen?
1
process(Fast_Clock)
2
variableiCount:integer:=0;
3
begin
4
if(Fast_Clock'eventandFast_Clock='1')then
5
iCount:=iCount+1;
6
endif;
7
if(iCount>24999)then
8
Slow_Clock<='1';
9
else
10
Slow_Clock<='0';
11
endif;
12
if(iCount=49999)then
13
iCount:=0;
14
endif;
15
endprocess;
Ein getakteter Prozess mit einem kombinatorischen Ende. Wo lernt man
denn sowas? :-O
Johannes R. schrieb:> Mit einen Spartan3e FPGA von Xilinx konnte ich die Butterfly Zellen mit> denselben vhdl-Dateien implementieren.
Glaube ich nicht.
Mit genau dieser Beschreibung wird einfach der "Excite" Eingang auf
den Augang gemappt. Denn dq_1 ist immer '0'. Und dq_2 ist entweder dq_1
(also '0'), wenn Excite '0' ist. Und es ist wegen PRE ='1' ebenfalls
'1', wenn Excite '1' ist.
Was soll dieser ganze irreführende Konstrukt denn letztlich tun?
Die "Buttterfly"s haben übrigens ihren Namen genausowenig verdient wie
die "D-Flipflops".
Lothar M. schrieb:> Hier kommt noch dazu, dass D eigentlich nicht in die Sensitivliste> gehört:
Genaugenommen doch. Wenn CLR und PRE 0 sind und CLK 1, ändert sich Q mit
jeder Änderung von D. Ohne D in der Liste sieht es in der Simulation
sonst wirklich aus, als wäre es getaktet (auf beide Flanken). Für sich
genommen stimmt da alles. Ob es gewollt ist, ist die andere Frage. ;-)
Dussel schrieb:> Wenn CLR und PRE 0 sind und CLK 1, ändert sich Q mit jeder Änderung von D
Korrekt. In dieser Beschreibung eines Latches durchaus. Nur darf das
Ding dann wie schon einige Male erwähnt nie&nimmer "D-Fiplflop" heißen.
Dussel schrieb:> Ob es gewollt ist, ist die andere Frage. ;-)
Irgendwie habe ich da so einen Verdacht, dass wir das nicht herausfinden
werden...
Lothar M. schrieb:> C. A. Rotwang schrieb:>> die Lösung liegt in der Verwendung des richtigen (Synthese)-Attributes> Das wäre bestenfalls ein böser Work-Around.
Nicht, wenn man den TO beim Wort nimmt, das das Konstrukt bei Xilinx
Spartan-3E das gewünschte "rückgekoppelte D-Latch" liefert.
Was die Goldenen Regel " only fools and real experts uses latches" im
Falle des TO bedeutet, soll der TO mal besser selbst herausfinden. So
ist der Lerneffekt am grössten und nachhaltige Erkenntniss am ehesten zu
erwarten.
C. A. Rotwang schrieb:> Nicht, wenn man den TO beim Wort nimmt, das das Konstrukt bei Xilinx> Spartan-3E das gewünschte "rückgekoppelte D-Latch" liefert.
Das würde mich sehr wundern.
C. A. Rotwang schrieb:> Nicht, wenn man den TO beim Wort nimmt, das das Konstrukt bei Xilinx> Spartan-3E das gewünschte "rückgekoppelte D-Latch" liefert.
Wobei "Flipflop" bei mir mental diametral zum "Latch" angeordnet ist...
;-)
> Nicht, wenn man den TO beim Wort nimmt, das das Konstrukt bei Xilinx> Spartan-3E das gewünschte "rückgekoppelte D-Latch" liefert.
Tut es tatsächlich. Zusammen mit der Warnung:
1
WARNING:Xst:737 - Found 1-bit latch for signal <Q>.
2
Latches may be generated from incomplete case or if statements.
3
We do not recommend the use of latches in FPGA/CPLD designs,
4
as they may lead to timing problems.
Allerdings ist genau dieses Bauteil überaus herstellerspezifisch. Mich
würde doch sehr interessieren, was Quartus daraus macht. Vermutlich
packt der das Ganze in zwei LUTs (oder gar nur eine) und fertig.
Denn ich kann ohne die explizite Verwendung von Latches das ganze Design
funktionell auf zwei Zeilen reduzieren:
1
dq_1<=dq_2whenExcite='0'else'0';
2
dq_2<=dq_1whenExcite='0'else'1';
Das macht auch Quartus, denn mit dieser Beschreibung kommt auch Xilinx
zum Ergebnis, dass dq_1 entfällt und dq_2 fest auf '1' gelegt wird.
Die Verwendung des Keep-Attribus hilft da auch nicht viel weiter, denn
mit
1
signaldq_1,dq_2:std_LOGIC;
2
attributeKEEP:string;
3
attributeKEEPofdq_1:signalis"true";
4
attributeKEEPofdq_2:signalis"true";
wird dann Kombinatorik und eine kombinatorische Schleife (mit der
passenden WARNING:Xst:2170 - Unit Butterfly : the following signal(s)
form a combinatorial loop: dq_2, dq_1) daraus.
Ob man letzlich das "Oszillieren" dieser Kombinatorik für einen
sinnvollen "Fußabdruck" verwenden kann, lässt sich in Frage stellen...
Markus F. schrieb:> Mit CLK = xAlwaysTrue steht da eigentlich> ....> und das ist kein Latch.
Nein, diese Beschreibung wird nur dazu zweckentfremdet, dass der
Synthesizer erkennt, dass da so ein spezielles Latch verwendet werden
soll. Quartus erkennt ein solches "Xilinx-Latch" natürlich nicht.
Entweder muss das für Quartus ganz anders beschrieben sein, oder das
FPGAkann gar keine Latches, weil es keine hat.
Danke für die vielen Antworten.
Ja, man sollte ein Latch eigentlich auch Latch nennen und nicht
FlipFlop. Das werde ich noch anpassen.
Danke für den Tipp mit den Clockmanager. Das habe ich nicht gewusst.
Lothar M. schrieb:> Nein, diese Beschreibung wird nur dazu zweckentfremdet, dass der> Synthesizer erkennt, dass da so ein spezielles Latch verwendet werden> soll. Quartus erkennt ein solches "Xilinx-Latch" natürlich nicht.> Entweder muss das für Quartus ganz anders beschrieben sein, oder das> FPGA kann gar keine Latches, weil es keine hat.
Ja, das kann sein. Ich habe in einem Projekt in einem Schematic File
einmal ein D-Latch mit PRE und CLR aus der Quartus Bibliothek verwendet
und geschaut, wie es auf dem FPGA umgesetzt wird. Das Latch wird
tatsächlich mit einfachen Logik-Gattern nachgebildet (siehe Bilder)
Tja, das kommt davon, wenn man das billigste FPGA Board auf dem Markt
kauft...
Gruß
Johannes
Markus F. schrieb:> Mit CLK = xAlwaysTrue steht da eigentlich> process(CLK, PRE, CLR, D)> begin> if (CLR = '1') then> Q <= '0';> elsif PRE = '1' then> Q <='1';> else> Q <= D;> end if;> end process;>> und das ist kein Latch.
Das ist die Kernfrage "Was ist ein Latch?" . Da sich die Lehrbücher
darin auch nicht einig sind (Im "Seifart" ist eine vom Taktimpuls
gesteuerte 1 bit speicherzelle ein data Latch, FF und Latch werden also
gleich benutzt - ich sehe allerdings ein Latch auch eher "diametral" zum
FF) mal hier ne umgangssprachliche Beschreibung von Latch:
Wird der Schalter "Eins" gedrückt wird der Ausgang "Eins"
wird dieser schalter losgelassen bleibt der Ausgang auf "Eins"
Wird der Scahlt "Null" gedrückt wird der Ausgang "Null"
wird dieser schalter losgelassen bleibt der Ausgang auf "Null"
-> das Latch speichert also den vorher Gesetzten Zustand. Zu
Transitorzeiten hat man das wohl "bistabiler Multivibrator" genannt
Der TO spricht des weiteren von einer rückkopplung also verbindung von
Ausgang Q mit Eingang D . Damit wird das oben genannte schon zum Latch,
es wird asynchron ein 1-bit wert eingespeichert.
>Du kannst jedes andere kaufen. Nur Xilinx hat Flipflops, die sich zu>Latches umschalten lassen. Im Handbuch des Cyclone II>(https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature>/hb/cyc2/cyc2_cii5v1.pdf)>findest du dann auch den Aufbau einer Logikzelle und die Fähigkeiten der>darin enthaltenen Speicherelemente. Ein Latch ist da nicht dabei.
Ich stimme zu, das bei Xilinx "Latch" explizit genannt wird, bei Altera
dagegen nicht. Schaut man sich Fig 2-3 auf p.30 von
https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/hb/cyc2/cyc2_cii5v1.pdf
an, könnte man zumindest ein "Latch" realisieren, das bei Aktivierung
vom CLRN den Ausgang asynchron auf '0' schaltet und nach Aktivierung
dort belässt (wenn der clock disabled) ist. Das wäre wenigstens m.E. ein
"halbes Latch", das man auch zum "Einfangen" kurzer Pulse verwenden,
-die typische Anwendung für Latches- benutzen kann.
C. A. Rotwang schrieb:> an, könnte man zumindest ein "Latch" realisieren, das bei Aktivierung> vom CLRN den Ausgang asynchron auf '0' schaltet und nach Aktivierung> dort belässt (wenn der clock disabled) ist.
Das ist doch ein übliches Flipflop mit asynchronem Reset.
Ein Latch ist beim "nichtspeichernden" Pegel des Latch-Enable-Eingangs
transparent, und behält beim "speichernden" Pegel den letzten Zustand:
http://ranger.uta.edu/~carroll/cse2341/summer99/html%20files/chapter_6/sld029.htm> Im "Seifart" ist eine vom Taktimpuls gesteuerte 1 bit speicherzelle> ein data Latch, FF und Latch werden also gleich benutzt
Das ist eine sprachliche Unsauberkeit. Denn natürlich kann man
umgangssprachlich auch mit Flipflops etwas "latchen", so werden auch
heute noch z.Adressen oder auch Daten oft mit D-Flipflops "gelatcht".
Das kommt aber daher, dass diese "Latch"-Flipflops ursprünglich wirklich
kombinatorische Latches waren (weil so ein Latch mit weniger
Siliziumfläche realisierbar war als ein D-Flipflop).
> Damit wird das oben genannte schon zum Latch, es wird asynchron ein> 1-bit wert eingespeichert.
Richtig, aber für diese Speicherfunktion ist eben kein Latch-Baustein
nötig. Deshalb hat Altera/Intel sowas gar nicht als eigenes Bauteil,
sondern setzt die Funktion direkt in einer rückgekoppelten LUT um.
Lothar M. schrieb:> Deshalb hat Altera/Intel sowas gar nicht als eigenes Bauteil,> sondern setzt die Funktion direkt in einer rückgekoppelten LUT um.
So sehe ich das auch. Und deswegen auch keinen Grund, warum sich die
"PUF-Funktionalität" damit nicht genauso implementieren lassen sollte?
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang