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
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^^)
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...
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"
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....
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... ;-)
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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.