Forum: FPGA, VHDL & Co. Anfänger braucht Hilfe


von Hannes K. (chgruber)


Angehängte Dateien:

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;

von line44 (Gast)


Lesenswert?

versuch mal statt
IF TagNacht = '1' THEN

IF TagNacht == '1' THEN

wenn ich mich recht entsinne ist = eine zuweisung und == die abfrage.

korrigiert mich, wenn ich falsch liege

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


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....

von Hannes K. (chgruber)


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?

von ... (Gast)


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ß

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.