mikrocontroller.net

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


Autor: freeed (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity main is
    port (
    clk         : in    std_logic;
    rst         : in    std_logic;
    sig1        : in    std_logic;
    sig2        : in    std_logic;
    sig_and     : out   std_logic;
    sig_or      : out   std_logic);
end main;

architecture standard of main is
begin

    gen_and : process (rst, clk)
    begin
        if rst = '1' then
            sig_and <= '0';
        elsif rising_edge(clk) then
            sig_and <= sig1 and sig2;
        end if;
    end process;

    sig_or <= sig1 or sig2;

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...  :-/

Autor: sgersten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Duke Scarring (Gast)
Datum:

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

Duke

Autor: freeed (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel -------- (root)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: m.rose (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

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

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.