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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.