Forum: FPGA, VHDL & Co. vhdl anfängerproblem


von freeed (Gast)


Angehängte Dateien:

Lesenswert?

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
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
entity main is
6
    port (
7
    clk         : in    std_logic;
8
    rst         : in    std_logic;
9
    sig1        : in    std_logic;
10
    sig2        : in    std_logic;
11
    sig_and     : out   std_logic;
12
    sig_or      : out   std_logic);
13
end main;
14
15
architecture standard of main is
16
begin
17
18
    gen_and : process (rst, clk)
19
    begin
20
        if rst = '1' then
21
            sig_and <= '0';
22
        elsif rising_edge(clk) then
23
            sig_and <= sig1 and sig2;
24
        end if;
25
    end process;
26
27
    sig_or <= sig1 or sig2;
28
29
end standard;
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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Welches Device verwendest du?
Welche maximale Taktfrequenz gibt das Synthesetool aus?
Mich wundert die Ausgangsverzögerung von über 10ns beim sig_or ein 
wenig...  :-/

von sgersten (Gast)


Lesenswert?

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.

von Duke Scarring (Gast)


Lesenswert?

Mach mal deinen Reset 100 ns lang. Die Modelle in der simprim-Bibliothek 
haben ihren eigenen Reset, der auch 100 ns dauert.

Duke

von freeed (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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.

von Daniel -. (root)


Lesenswert?

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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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:
1
OFFSET = IN 4 ns BEFORE "clk"  ;
2
OFFSET = OUT 3 ns AFTER "clk"  ;
3
NET "clk" TNM_NET = "clk";
4
TIMESPEC "TS_clk" = PERIOD "clk" 20 ns HIGH 50 %;

von m.rose (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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...

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.