VHDL Fehlermeldung Simulation - Zähler

Gast #3451371
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.
Gast #3451396
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...
#3451430
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.
Gast #3451440
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,

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren