Volladdierer, Probleme mir Simulation

Gast #1625327
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;
Gast #1625340
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.
Moderator (Firma: Titel) Persönliche Seite #1625356
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
       :
Gast #1625384
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!
Gast #1625446
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.
Gast #1625457
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
        ...

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