Anfänger braucht Hilfe

OP #2951019
Lesenswert?

Hab meine Fehler fast alle ausgemerzt...Jetzt bleiben nur noch drei, die 
jeweils das gleiche besagen. Bitte um Hilfe
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 hs IS
7
  PORT( 
8
      TagNacht      :IN STD_LOGIC;
9
      Test          :IN STD_LOGIC;
10
      Temperatur    :IN STD_LOGIC_VECTOR (5 DOWNTO 0);
11

12
      TempsensorNODE              :OUT STD_LOGIC_VECTOR (2 DOWNTO 0);      
13
      FensterHeizstrahlerFehler   :OUT STD_LOGIC_VECTOR (2 DOWNTO 0));
14

15
END hs;
16

17

18
ARCHITECTURE logic OF hs IS
19
    SIGNAL Tempsensor  :STD_LOGIC_VECTOR (2 DOWNTO 0);
20
BEGIN
21

22
PROCESS(Temperatur, Tempsensor)
23
BEGIN
24

25
    IF    Temperatur < "10010" THEN
26
           Tempsensor(2) <= '1';
27
           TempsensorNODE(2) <= Tempsensor(2);
28

29
    ELSIF Temperatur > "11010" THEN
30
           Tempsensor(1) <= '1';
31
           TempsensorNODE(1) <= Tempsensor(1);
32

33
    ELSIF Temperatur <= "11010" OR Temperatur >= "10010" THEN
34
           Tempsensor(0) <= '1';
35
           TempsensorNODE(0) <= Tempsensor(0);
36
    END IF;
37

38

39

40

41

42
 IF TagNacht = '1' THEN
43

44
  WITH Tempsensor SELECT                  //Hier ist der Fehler
45
    
46
    FensterHeizstrahlerFehler(0) <=
47
                      '1' WHEN "111",
48
                      '1' WHEN "110",
49
                      '1' WHEN "101",
50
                      '1' WHEN "011",
51
                      '1' WHEN "000",
52
                      '0' WHEN OTHERS;
53
  WITH Tempsensor SELECT                  //Hier ist der Fehler
54
                      
55
    FensterHeizstrahlerFehler(2) <=
56
                      '1' WHEN "001",
57
                      '0' WHEN OTHERS;
58
  WITH Tempsensor SELECT                  //Hier ist der Fehler
59
                      
60
    FensterHeizstrahlerFehler(1) <=
61
                      '1' WHEN "100",
62
                      '0' WHEN OTHERS;
63
ELSE
64
    FensterHeizstrahlerFehler <= "000";
65

66
END IF;
67
  
68
END PROCESS;
69
END logic;
Angehängte Dateien:
Moderator (Firma: Titel) Persönliche Seite #2951064
Lesenswert?

line44 schrieb:
> korrigiert mich, wenn ich falsch liege
Du liegst falsch.

Das Problem liegt darin, dass Concurrent-Syntaxelemente (nebenläufige 
Beschreibung) in einer sequentiellen Beschreibung (Prozess) verwendet 
werden:
with...select ist Concurrent und hat in einem Prozess nichts zu suchen.

So, damit ist der gemeldete Fehler behoben.

Ein Fauxpas ist auch noch drin, der für eine falsche Simulation sorgt:
1
PROCESS(Temperatur, Tempsensor)
2
BEGIN
3
:
4
:
5
IF TagNacht = '1' THEN
TagNacht fehlt in der Sensitivliste....

Was aber viel, viel schlimmer ist: das Design wird im echten Leben nie 
zuverlässig laufen!
Warum behaupte ich das und bin mir sogar noch sicher, dass ich Recht 
habe?
Sieh dir mal das hier an:
1
PROCESS(Temperatur, Tempsensor)
2
BEGIN
3

4
    IF    Temperatur < "10010" THEN
5
           Tempsensor(2) <= '1';
6
           TempsensorNODE(2) <= Tempsensor(2);
7

8
    ELSIF Temperatur > "11010" THEN
9
           Tempsensor(1) <= '1';
10
           TempsensorNODE(1) <= Tempsensor(1);
11

12
    ELSIF Temperatur <= "11010" OR Temperatur >= "10010" THEN
13
           Tempsensor(0) <= '1';
14
           TempsensorNODE(0) <= Tempsensor(0);
15
    END IF;
Und jetzt nehmen wir mal an, dass sich Temperatur von 11111 nach 00000 
ändert. Weil jetzt aber garantiert nicht alle Bits gleichzeitig 
umschalten, kann für einen kurzen Augenblick jeder beliebige Wert 
zwischen 11111 und 00000 auftreten. So auch 11011 oder 11000 
oderwasweißichauchimmer...
Und was wird jetzt diese Schaltung in diesen paar picoSekunden machen? 
Richtig: ein paar Speicherelemente bekommen mit, dass da was war, andere 
nicht und heraus kommt Müll. Nicht immer, aber einmal pro halbe Stunde 
oder einmal am Tag, oder jede Minute...
Kurz: diesen Fehler wirst du ewig suchen. Und viel dabei lernen!

So, und jetzt kommt der Fachbegriff zum Thema: du hast ein Latch gebaut. 
Eigentlich nicht nur eines, sondern viele....
OP #2951086
Lesenswert?

Viele Dank für die schnelle Antwort.
Die Funktionalität lassen wir mal außen vor, denn ich werde es nie 
benutzen.

Heißt das ich muss einfach vor dem With...select den Process schließen? 
Wenn ja, warum muss ich dann TagNacht in die Sensitivity list schreiben?
Könntest du mir den Code umschreiben?
Gast #2951111
Lesenswert?

Hi,

du wenn du quasi eine Fallunterscheidung innerhalb eines Prozesses 
machen willst, kannst du

case Tempsensor is

   when Fall1 => Fensterheizstrahler(1) <= '1';
   ... hier die Fälle aufzählen
   default: Wertzuweisung, wenn kein Fall auftritt

end case;


benutzen.

Vielleicht ist es das was du suchst

Gruß

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