Forum: FPGA, VHDL & Co. VHDL Testbench funktioniert nicht


von Anil (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich habe angefangen VHDL zu programmieren und kenne mich nicht sehr gut 
aus.

Ich habe als Aufgabe bekommen eine Geschwindigkeitsmessung zu 
programmieren:

Also es wird mit einem Signal (Sender) gestartet zu zählen und dann mit 
einem Signal (Empfänger) die Distanz berechnet und ausgegeben.

Nun ich habe das Programm schon geschrieben sowie die Testbench, jedoch 
macht die Testbench genau NULL bei der Simulation.

Ich finde den Fehler leider nicht und würde die Hilfe von jemanden 
brauchen was ich falsch mache??? Bin schon am verzweifeln, schaue mir 
das fertige Programm schon seit 3 Stunden an.

Danke im Voraus

Im Anhang mein Programm

von Bumsfallera (Gast)


Lesenswert?

Anil schrieb:
> Hallo Leute,
>
> ich habe angefangen VHDL zu programmieren und kenne mich nicht sehr gut
> aus.
>
> Nun ich habe das Programm schon geschrieben sowie die Testbench, jedoch
> macht die Testbench genau NULL bei der Simulation.
>
> Ich finde den Fehler leider nicht und würde die Hilfe von jemanden
> brauchen was ich falsch mache??? Bin schon am verzweifeln, schaue mir
> das fertige Programm schon seit 3 Stunden an.


guck dir mal deine clock an! (btw: das ist ganz übles vhdl^^)

von Mustafa Y. (mustafa_y)


Lesenswert?

Bumsfallera schrieb:

> guck dir mal deine clock an! (btw: das ist ganz übles vhdl^^)

hab ich einen Fehler an meiner clock? war das eine feststellung oder 
eine vermutung von dir?

hab mir einige Bsp durchgeschaut und die clk war auch so wie bei mir...

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


Lesenswert?

Anil schrieb:
> jedoch macht die Testbench genau NULL bei der Simulation.
Wie sieht diese "NULL" aus?

Du hättest besser nur deine 3 VHDL Dateien hier angehängt, als das ganze 
ISE-Projekt, weil ich leider diese Meldung bekomme:
ERROR:ProjectMgmt - The software version (13) is older than
the version saved in the project file (14).
Opening newer project with older software releases is not supported.

Also, kurz ein neues Projekt aufgesetzt, und dann das:
1
Starting static elaboration
2
ERROR:HDLCompiler:439 - "mess_testbench.vhd" Line 17: Formal port rst of mode inout cannot be associated with actual port rst of mode in
3
ERROR:HDLCompiler:439 - "mess_testbench.vhd" Line 18: Formal port start of mode inout cannot be associated with actual port start of mode in
4
ERROR:HDLCompiler:439 - "mess_testbench.vhd" Line 21: Formal port empfaenger of mode inout cannot be associated with actual port empfaenger of mode in
5
ERROR:Simulator:777 - Static elaboration of top level VHDL design unit mess_testbench in library work failed
inout Port? Nachgeschaut: du verwendest ausschliesslich inout-Ports? 
Sogar der rst, der sicher niemals nichts auszugeben hat.
Warum? Ich weiß: Schreibfaulheit. Du findest es geschickt, keine lokalen 
Signale anlegen zu müssen, weil inout-Ports rücklesbar sind.
Fazit: setzen, sechs.

Die Ursache dieser Fehlermeldungen:
Die component in der Testbench hat andere Ports als deine entity.
1
-- messung.vhd
2
entity messung is
3
    Port ( rst : inout  STD_LOGIC;
4
           start : inout  STD_LOGIC;
5
           clk : in  STD_LOGIC;
6
           sender : inout  STD_LOGIC;
7
           empfaenger : inout  STD_LOGIC;
8
           ovfw : inout  STD_LOGIC;
9
           mess_lauft : inout  STD_LOGIC;
10
           distanz : inout  STD_LOGIC_VECTOR (15 downto 0));
11
end messung;
12
 
13
-- mess_testbench.vhd
14
    COMPONENT messung
15
    PORT(
16
         rst : IN  std_logic;
17
         start : IN  std_logic;
18
         clk : IN  std_logic;
19
         sender : INOUT  std_logic;
20
         empfaenger : IN  std_logic;
21
         ovfw : INOUT  std_logic;
22
         mess_lauft : INOUT  std_logic;
23
         distanz : INOUT  std_logic_vector(15 downto 0)
24
        );
25
    END COMPONENT;



Nächster Schritt: was soll passieren, wenn du die Simulation mal 
geschafft hast? Soll das mal auf einem FPGA laufen? Das wird so nix.
Damit man weiß wovon geredet wird hier mal der Monsterprozess korrekt 
formatiert. Dann wird vieles einfacher:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
use work.constanten.all;
6
7
entity messung is
8
    Port ( rst : inout  STD_LOGIC;
9
           start : inout  STD_LOGIC;
10
           clk : in  STD_LOGIC;
11
           sender : inout  STD_LOGIC;
12
           empfaenger : inout  STD_LOGIC;
13
           ovfw : inout  STD_LOGIC;
14
           mess_lauft : inout  STD_LOGIC;
15
           distanz : inout  STD_LOGIC_VECTOR (15 downto 0));
16
end messung;
17
18
architecture Behavioral of messung is
19
20
begin
21
22
   messen: process (clk, rst, empfaenger, sender, ovfw, mess_lauft, distanz)
23
   variable bit_cnt : integer;                                -- Echtzeit Bitcounter für Anzeige
24
   variable takt : integer;                                   -- Takt
25
   
26
   begin
27
      if rst = ACTIVE then
28
         takt := 0;                                           -- Initialisieren diverser Parameter
29
         bit_cnt := 1;
30
         sender <= ACTIVE;
31
         ovfw <= not ACTIVE;
32
         mess_lauft <= not ACTIVE;
33
         distanz <= (others => '0');
34
      else
35
         if clk'event and clk = '0' and start = ACTIVE then   -- mit der ersten fallenden Flanke wird Ultraschallsignal
36
            mess_lauft <= ACTIVE;                             -- ausgesendet; operate zeigt an, dass Prozess läuft
37
            sender <= not ACTIVE;
38
         end if;
39
         if clk'event and clk = '1' and mess_lauft = ACTIVE then
40
            takt := takt+1;
41
         end if;
42
         if takt = T and mess_lauft = ACTIVE then             -- Wenn Takt (µs) = Impulsdauer T
43
            sender <= ACTIVE;                                 -- Ultraschallsender wird nach T abgeschaltet
44
         end if;
45
         if takt = (bit_cnt * (ts/(V*5))) and mess_lauft = ACTIVE then   -- Zähler Dauer halbe Wegstrecke
46
            distanz <= conv_std_logic_vector(bit_cnt, 16);   -- sowie der Umwandlung ins Binärformat findet statt
47
            bit_cnt := bit_cnt + 1;
48
         end if;
49
         if takt > (((MAXDIST / V) * ts) + T) then           -- Überwachung der maximalen Laufzeit
50
            ovfw <= ACTIVE;                                  -- Wenn Ereignis eintrifft wird 
51
            mess_lauft <= not ACTIVE;                        -- Overflow signalisert, der Takt auf 0 gesetzt
52
            takt := 0;                                       -- Das Operationssignal erlischt und die
53
            distanz <= (others => '0');                      -- Binärdarstellung zeigt '0000000000000000'
54
         end if;
55
         if empfaenger = ACTIVE then                         -- Monitor Signaleingang
56
            mess_lauft <= not ACTIVE;                        -- und State1 (senden fertig) gesetzt,
57
         end if;
58
      end if;                                 
59
   end process messen;
60
61
end Behavioral;

Eines ist auf Anhieb klar: hier muss ein Softie Hardware beschreiben. 
(jetzt bitte den Begriff Softie nicht allzu persönlich nehmen!
Siehe den Beitrag "Re: Unerwartetes Syntheseergebnis (??)")

1. soll das ein Universalprozess sein?
Frag dich mal: warum machen alle Anderen das anders?

2. warum diese unnötige Verwendung von speichernden(!) Variablen?
Beitrag "Variable vs Signal"

3. das hier ist eine kombinatorische Schleife
1
            bit_cnt := bit_cnt + 1;
Siehe 
http://www.lothar-miller.de/s9y/archives/42-Kombinatorische-Schleifen.html

Punkt 3 kommt übrigens vom Punkt 1 zusammen mit deiner verwirrenden 
Formatierung...

4. nimm die numeric_std
Dazu der Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"

von Mustafa Y. (mustafa_y)


Lesenswert?

wow das war mal ziemlich viel Kritik hätte ich jetzt nicht 
erwartet...ist aber auch gut so mir ist klar muss mich mehr 
anstrengen...

zu deinen fragen:

ich habe rst usw. nicht als inout definiert sondern das habe ich in den 
letzten versuchen bei der simulation gemacht in der hoffnung dass der 
fehler dort liegt....

weiters soll das nur simuliert werden und nicht auf einem fpga 
laufen....

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


Lesenswert?

Mustafa Y. schrieb:
> nicht auf einem fpga laufen....
Das hört sich ja mal ziemlich unsinnig an. Wofür sollte VHDL denn sonst 
gut sein? Es ist schliesslich eine Hardwarebeschreibungssprache. Warum 
machst du solche mentalen Trockenübungen, die dir fürs reale Leben 
nichts bringen? Für welche Schule brauchst du das?

> wow das war mal ziemlich viel Kritik hätte ich jetzt nicht erwartet.
Das hättest du dann aber vorher sagen müssen... ;-)

von Mustafa Y. (mustafa_y)


Lesenswert?

ich studiere elektronik und das ist nur eine Aufgabe die zu lösen 
haben....

auch wenn es mir im realen Leben nicht viel nützen wird denke ich mal 
das es ein Anfang ist :-)

von Schnarcho (Gast)


Lesenswert?

Im realen Leben könnte es auch helfen, sich zumindest Mühe bei der 
Rechtschreibung zu geben.

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.