Forum: FPGA, VHDL & Co. VHDL Fehlermeldung Simulation - Zähler


von Kaffeetasse (Gast)


Lesenswert?

Hallo,
ich bin noch relativ neu im Thema VHDL und stehe nun vor einem Problem:
Bei der Simulation eines eigentlich einfachen Zählers taucht eine für 
mich nicht verständliche Warnung im ModelSim auf:

# ** Warning: There is an 'U'|'X'|'W'|'Z'|'-' in an arithmetic operand, 
the result will be 'X'(es).
#    Time: 100 ns  Iteration: 1  Instance: /testbench_zaehler/t1

Folgender Code liegt vor:

>Zaehler
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
6
ENTITY zaehler IS
7
  PORT (clk, en    : IN STD_LOGIC ; 
8
        q          : OUT STD_LOGIC_VECTOR (3 downto 0)); 
9
END zaehler; 
10
11
ARCHITECTURE behav OF zaehler IS
12
  
13
  SIGNAL q_s : STD_LOGIC_VECTOR (3 DOWNTO 0); 
14
  
15
  BEGIN
16
   
17
    p1 : PROCESS (clk) 
18
    
19
    BEGIN 
20
      
21
      IF ( clk'EVENT AND clk = '1' AND clk'LAST_VALUE = '0') THEN  
22
      IF (en = '1') THEN q_s <= q_s + "0001"; END IF;         
23
      IF (en = '1' AND q_s = "1001")  THEN   q_s <="0000";   END IF ; 
24
      END IF ; 
25
     
26
      END PROCESS p1 ;     
27
      
28
      q <= q_s;    
29
     
30
END behav ;

>Stimulus
1
LIBRARY IEEE; 
2
USE IEEE.STD_LOGIC_1164.ALL; 
3
4
ENTITY stimulus_zaehler IS
5
PORT( clk, en : OUT STD_LOGIC ); 
6
END stimulus_zaehler ; 
7
8
ARCHITECTURE behav OF stimulus_zaehler IS
9
SIGNAL clk_s: STD_LOGIC:='0';    
10
BEGIN 
11
  clk_s <= NOT clk_s AFTER 100 ns;   
12
  clk <= clk_s ; 
13
  en <= '0', '1' AFTER 80 ns, '0' AFTER 3000 ns, '1' AFTER 3500 ns; 
14
15
END behav ;

>Testbench
1
LIBRARY IEEE; 
2
USE IEEE.STD_LOGIC_1164.ALL; 
3
4
ENTITY testbench_zaehler IS
5
PORT(q_g: OUT STD_LOGIC_VECTOR (3 downto 0)); 
6
END testbench_zaehler; 
7
8
ARCHITECTURE behav_testbench_zaehler OF testbench_zaehler IS
9
10
SIGNAL en_g, clk_g: STD_LOGIC;
11
12
COMPONENT zaehler 
13
PORT (clk, en    : IN STD_LOGIC ; 
14
      q          : OUT STD_LOGIC_VECTOR (3 downto 0));  
15
END COMPONENT; 
16
17
COMPONENT stimulus_zaehler 
18
PORT (clk, en : OUT STD_LOGIC );  
19
END COMPONENT; 
20
21
BEGIN
22
  t1: zaehler PORT MAP (clk=>clk_g, en=>en_g, q=>q_g);
23
  t2: stimulus_zaehler PORT MAP (clk=>clk_g, en=>en_g);  
24
END behav_testbench_zaehler;

Für Hinweise wo der Fehler zu finden ist bin ich sehr dankbar!

Vielen Dank!

LG K.

von PittyJ (Gast)


Lesenswert?

Was ist denn der Initialwert von q_s ?

von Oswaldo (Gast)


Lesenswert?

Kaffeetasse schrieb:
> q_s <= q_s + "0001"

was steht denn deiner meinung nach zum ersten takt (nach 100ns) in q_s? 
Das müsste dich auf die Spur bringen:-)

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


Lesenswert?

> q_s <= q_s + "0001";
Welchen Wert hat denn q_s nach den Start der Simulation?
Und was gibt "UUUU" + "0001"?


>  clk'EVENT AND clk = '1' AND clk'LAST_VALUE = '0'
Andere schreiben da einfach rising_edge(clk), weil es sich leichter 
liest...

Noch was:
Beitrag "IEEE.STD_LOGIC_ARITH.ALL obsolete"

von Kaffeetasse (Gast)


Lesenswert?

heho, ja vielen dank das es wahrscheinlich an q_s="UUUU" liegt hab ich 
schon herrausgefunden - doch wie kann ich das vorbelegen ohne das der 
zaehlwertbeim hochzaehlen ständig von startwert (den er bis jetzt nicht 
hat) überschrieben wird? da ist mir noch keine idee gekommen...

von Robert B. (rsb89)


Lesenswert?

Mach einen Reset-Prozess in dem du q_s mit 0000 initialisierst.

von Kaffeetasse (Gast)


Lesenswert?

@robert
könntest du das bitte etwas genauer ausformulieren?!

von Kaffeetasse (Gast)


Lesenswert?

also meien Änderung welche zum erfolg geführt hat:
1
SIGNAL q_s : STD_LOGIC_VECTOR (3 DOWNTO 0):= "0000";

von Robert B. (rsb89)


Lesenswert?

Schon einmal gut, dass du eine Lösung gefunden hast! :)

Trotzdem sollte man sich angewöhnen mit einem rst-Signal zu arbeiten (so 
habe ich es jedenfalls gelernt). Der Reset kann synchron sein (wird im 
clk-Prozess überprüft ob rst 1 ist oder 0) oder asynchron (eigener 
Prozess der das rst-Signal in der Sensitivitylist hat, also unabhängig 
von clk). Wird ein Reset ausgelöst muss dann (allen) Signalen ein 
definierter wert zugewiesen werden.

von Fpgakuechle K. (Gast)


Lesenswert?

Robert B. schrieb:

> Trotzdem sollte man sich angewöhnen mit einem rst-Signal zu arbeiten (so
> habe ich es jedenfalls gelernt).

> von clk). Wird ein Reset ausgelöst muss dann (allen) Signalen ein
> definierter wert zugewiesen werden.

Noe, da sieht man heute anders, globaler reset sollte vermieden werden:

http://www.xilinx.com/support/documentation/white_papers/wp272.pdf

MfG,

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


Lesenswert?


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.