Hallo Leute!
Habe gerade angefangen VHDL zu lernen, aber wie es aussieht, schaffe ich
es nicht mal das kleinste Modell für ein FPGA zum Laufen zu bringen.
Hoffentlich kann mir jemand weiterhelfen! Hier mein (zugegebenermaßen
sinnfreies) Programm:
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.NUMERIC_STD.ALL;
4
5
entitymainis
6
port(
7
clk:instd_logic;
8
rst:instd_logic;
9
sig1:instd_logic;
10
sig2:instd_logic;
11
sig_and:outstd_logic;
12
sig_or:outstd_logic);
13
endmain;
14
15
architecturestandardofmainis
16
begin
17
18
gen_and:process(rst,clk)
19
begin
20
ifrst='1'then
21
sig_and<='0';
22
elsifrising_edge(clk)then
23
sig_and<=sig1andsig2;
24
endif;
25
endprocess;
26
27
sig_or<=sig1orsig2;
28
29
endstandard;
Die Behavioral Simulation liefert noch genau das Ergebnis, das ich
erwartet hätte, aber bei der Post-Place-And-Route Simulation wird das
Ausgabe-Signal sig_and falsch dargestellt (siehe angehängte gif-Datei).
Es treten keine Warnings und natürlich keine Errors auf (verwende
übrigens ISE WebPack). Kann es sein, dass ich ein Timing-Problem habe?
Hätte für den Test aber eine Periodendauer von 20ns, das müsste doch
leicht zu schaffen sein, oder?
Bin für jeden Hinweis dankbar!
Schöne Grüße
Welches Device verwendest du?
Welche maximale Taktfrequenz gibt das Synthesetool aus?
Mich wundert die Ausgangsverzögerung von über 10ns beim sig_or ein
wenig... :-/
Ich gehe hier von einem Timingproblem aus.
Bei 62 ns hast Du die Bedingung sig1 and sig2 erfüllt, die Clk-Flanke
zur Übernahme ist bei 65 ns (3 ns setup), das Signal wird jedoch nicht
übernommen. Die Lowbedingung bei den folgenden Flanken scheint jedoch
trotz 2-3 ns setup übernommen zu werden. Interessanterweise hast Du bei
125 ns auch nur in etwa 3 ns setup, dort scheint es jedoch auszureichen.
Der Ausgang des Flipflops wird jedoch erst ca. bei 132 ns high, d.h. 7
ns clk to output. Vielleicht kannst Du die Post P&R Simulation mal mit
geringerer Taktfrequenz machen.
Vielen Dank erstmal für die raschen Antworten!
Verwende ein Virtex5 LX50 FPGA (speed grade: -1) und erhalte bei der
Synthese folgende Timing-Richtlinien:
Minimum period: No path found
Minimum input arrival time before clock: 1.493ns
Maximum output required time after clock: 3.259ns
Maximum combinational path delay: 4.281ns
Beim Post-Place&Route Timing kommt zudem noch folgendes raus (alle
Angaben in ns):
Setup/Hold to clock clk:
source: sig1 --- setup to clk: 0.063 --- hold to clk: 1.977
source: sig2 --- setup to clk: 0.130 --- hold to clk: 1.915
Clock clk to Pad
destination: sig_and --- clk to pad: 7.339
Offset Table:
pad: sig_and --- out after clk: 7.339
Übrigens habe ich mit bei meinem ersten Post verschrieben: Mit einer
Periodendauer von 20ns funktioniert das Ganze noch, nicht jedoch mit
10ns. Aber 100MHz erscheinen mir eigentlich auch nicht so viel, oder
doch?
-------------
Habe gerade noch das mit dem 100ns langen Reset ausprobiert und es
funktioniert tatsächlich!!! (siehe gif) Cool! :)
Trotzdem wundere ich mich natürlich auch über die lange Verzögerung beim
sig_or Signal. Es dauert 5,7ns bis sig1 und sig2 miteinander verknüpft
wurden. Ist das normal?
> Es dauert 5,7ns bis sig1 und sig2 miteinander verknüpft wurden.> Ist das normal?
Wenn du den Designtools keine Einschränkungen und Wünsche (constraints)
vorgibst, ist jede Lösung gleich gut.
Wenn du in den Timing Constraints sagst, ich möchte hier maximal 3ns,
dann wird der P&R versuchen, das einzuhalten.
Ähnlich ist es, wenn du keine Pins vorgibst. Dann werden die Pins
irgendwo platziert. Hauptsache, die Anzahl der Ein- und Ausgänge passt.
Ich möchte nicht den Thread highjacken .. es knüpft inhaltlich
an den letzten Post, drum bitte ich um Nachsicht :)
Wie formuliere ich einen Constraint, der wie im aktuellen Fall,
drei Netze "sig1", "sig2", "sig_and" zeitlich in Relation setzt?
(Sagen wir mal, 3 ns später soll das Ergebnis da sein.)
Muss dieses Constraint zu den anderen nach *.ucf?
> Wie formuliere ich einen Constraint, der wie im aktuellen Fall,> drei Netze "sig1", "sig2", "sig_and" zeitlich in Relation setzt?
sig_and ist getaktet. Deshalb kannst du nicht einfach eine Beziehung
zwischen diesen 3 Signalen herleiten. Da ist der Takt dazwischen. Du
definierst also nicht eine Zeit, wie diese 3 Signale zueinander
stehen, sondern, wie sich diese Signale zum Takt verhalten.
Sind das "nur" interne Netze oder sind die an Pins angeschlossen?
Wenn du sonst nichts einzuschränken hast, nimm einfach die globalen
Constraints. In der UCF-Datei muß dann also etwa sowas stehen:
Es könnte am Quelltext liegen. Enheiten, die mit flankengetakteten
Latches arbeiten, MÜSSEN wie folgt beschrieben werden:
gen_and : process (rst, clk)
begin
if rst = '1' then
sig_and <= '0';
elsif (clk'event and clk ='1') then
sig_and <= sig1 and sig2;
end if;
end process;
Diese Beschreibung ist krisensicher und führt per Definition zu
flankengetakteter Logik.
Desweiteren kannst du auch die logischen Verknüpfungen durch eine
Tabelle ersetzen, indem du die case-Anweisung benutzt.
Wenn es auch dann nicht geht, liegt es nicht am Quelltext.
m.rose schrieb:> Diese Beschreibung ist krisensicher und führt per Definition zu> flankengetakteter Logik.
Allerdings ist sie nur dann krisensicher, wenn sig_1 und sig_2 synchron
zum Takt sind...
> Es könnte am Quelltext liegen.
...?
> Enheiten, die mit flankengetakteten Latches arbeiten
Flankengetaktete Latches gibt es nicht.
Was mit einer Flanke arbeitet heißt Flipflop.
BTW: das Problem dürfte sich nach 1 1/2 Jahren dann erledigt haben...