Forum: FPGA, VHDL & Co. Volladdierer, Probleme mir Simulation


von chris (Gast)


Lesenswert?

Hallo,

ich habe hier den Code eines Volladdierers (ich weiß, es geht einfacher. 
aber es soll mit process und case Anweisung realisiert werden)
Ich bin der Meinung, dass der Code in Ordnung ist. Die Simulation 
liefert aber unsinnige Werte. Wäre nett, wenn mal jemand drauf gucken 
könnte
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
7
entity FullAdder is
8
    Port ( X : in  STD_LOGIC;
9
           Y : in  STD_LOGIC;
10
           Cin : in  STD_LOGIC;
11
           Cout : out  STD_LOGIC;
12
           S : out  STD_LOGIC);
13
end FullAdder;
14
15
architecture Behavioral of FullAdder is
16
  signal temp : std_logic_vector (2 downto 0); --Hilfssignal, auf das die folgende Case-Abfrage erfolgt
17
  begin
18
    temp <= X & Y & Cin;  -- Verkettung  der Eingangssignale zu einem Vektor
19
    Volladdierer : process (X,Y,Cin)
20
    begin
21
      case temp is
22
        when "000" =>    Cout <= '0'; S <='0';
23
        when "001" =>    Cout <= '0'; S <='1';
24
        when "010" =>    Cout <= '0'; S <='1';
25
        when "011" =>    Cout <= '1'; S <='0';
26
        when "100" =>    Cout <= '0'; S <='1';
27
        when "101" =>    Cout <= '1'; S <='0';
28
        when "110" =>    Cout <= '1'; S <='0';
29
        when others =>   Cout <= '1'; S <='1';
30
      end case;
31
    end process Volladdierer;
32
end Behavioral;

von Ottmar (Gast)


Lesenswert?

Es könnte sein das der process nicht wie erwartet reagiert da du auf die 
eigentlichen eingangssignale (X,Y,Cin) sensitiv bist und nicht auf das 
zusammengesetzte temp signal was in deinem process verarbeitet wird.

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


Lesenswert?

Das würde ich auch sagen. Denn der Prozess Volladierer wird neu 
berechnet, wenn sich die Ursprungssignale ändern. Und das passiert 
gleichzeitig mit der Berechnung des Wertes von temp, denn dessen 
Concurrent-Zuweisung könnte auch in einen Prozess geschrieben werden:
1
    Verkettung : process (X,Y,Cin)
2
    begin
3
        temp <= X & Y & Cin;  -- Verkettung der Eingangssignale zu einem Vektor
4
    end process;
5
6
    Volladdierer : process (X,Y,Cin)
7
    begin
8
      case temp is
9
        when "000" =>    Cout <= '0'; S <='0';
10
        when "001" =>    Cout <= '0'; S <='1';
11
        when "010" =>    Cout <= '0'; S <='1';
12
        when "011" =>    Cout <= '1'; S <='0';
13
        when "100" =>    Cout <= '0'; S <='1';
14
        when "101" =>    Cout <= '1'; S <='0';
15
        when "110" =>    Cout <= '1'; S <='0';
16
        when others =>   Cout <= '1'; S <='1';
17
      end case;
18
    end process Volladdierer;
Das ist funktional genau gleich wie die ursprüngliche Beschreibung, 
jetzt werden aber die zeitlichen Abläufe klarer: wenn sich z.B. X 
ändert, werden beide Prozess gleichzeitig neu berechnet. Der Volladierer 
nimmt aber den alten Wert von temp für seine Berechnungen.
Ein klarer Fall einer falschen, unvollständigen Sensitivliste :-o

Am einfachsten wäre eine Verkettung im Prozess:
1
     Volladdierer : process (X,Y,Cin)
2
     begin
3
       case X & Y & Cin is  -- Verkettung  der Eingangssignale zu einem Vektor
4
       :
5
       :

von chris (Gast)


Lesenswert?

>Denn der Prozess Volladierer wird neu berechnet, wenn sich die
>Ursprungssignale ändern. Und das passiert gleichzeitig mit der Berechnung
>des Wertes von temp,...

aaargh.., ich Depp. Stimmt natürlich. Hatte ich übersehen. Vielen Dank 
für die schnelle Hilfe!

von chris (Gast)


Lesenswert?

@Lothar: Wenn ich die von dir vorgeschlagene Variante probiere erhalte 
ich beim Syntaxcheck eine Fehlermeldung

  "Can not determine the type of the selector & "

Eine Verkettung im Prozess wie z.B.
1
architecture Behavioral of FullAdder is
2
  signal temp : std_logic_vector (2 downto 0); --Hilfssignal, auf das die folgende Case-Abfrage erfolgt
3
  begin
4
    Volladdierer : process (X,Y,Cin)
5
    begin
6
      temp <= X & Y & Cin;  -- Verkettung  der Eingangssignale zu einem Vektor
7
      case temp is
8
9
...
10
..

funkioniert auch nicht aus den gleichen Gründen wie zu Beginn. Das 
Einzige was hier wohl hilft ist temp als Variable zu definieren.

von Mathi (Gast)


Lesenswert?

Nein, schreib einfach temp in die Sensitivitätsliste des Prozesses und 
schon wirds gehen.
1
    temp <= X & Y & Cin;  -- Verkettung  der Eingangssignale zu einem Vektor
2
    Volladdierer : process (temp)
3
    begin
4
      case temp is
5
        when "000" =>    Cout <= '0'; S <='0';
6
        when "001" =>    Cout <= '0'; S <='1';
7
        when "010" =>    Cout <= '0'; S <='1';
8
        ...

von Mathi (Gast)


Lesenswert?

Oder:
1
Volladdierer : process (X,Y,Cin, temp)
2
    begin
3
      temp <= X & Y & Cin;  -- Verkettung  der Eingangssignale zu einem Vektor
4
      case temp is
5
6
...

von chris (Gast)


Lesenswert?

@Mathi: Dein erster Vorschlag sollte funkionieren. Dein zweiter 
Vorschlag funktioniert nur, wenn temp eine Variable ist. So hab ich's 
jetzt auch und es passt.

von Mathi (Gast)


Lesenswert?

Nein, der Zweite funktioniert mit temp als Signal. Du solltest wirklich 
mal lernen was Signale sind und was eine Sensitivitätsliste macht...

von chris (Gast)


Lesenswert?

Stimmt. Die zweite Version funktioniert auch. Ich hatte das temp in der 
Sensitivitätsliste übersehen. Allerdings ist diese Version 
"umständlich", da der Prozess 2 mal durchlaufen wird.

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


Lesenswert?

Für solche Fälle wäre tatsächlich eine Variable praktisch ;-)
1
  begin
2
    Volladdierer : process (X,Y,Cin)
3
    variable temp : std_logic_vector (2 downto 0); -- Hilfssignal, auf das die folgende Case-Abfrage erfolgt
4
    begin
5
      temp := X & Y & Cin;  -- Verkettung  der Eingangssignale zu einem Vektor
6
      case temp is
7
      :

von chris (Gast)


Lesenswert?

Ja, genauso hatte ich es jetzt auch gemacht. Danke nochmals :)

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.