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"