www.mikrocontroller.net

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


Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;


entity FullAdder is
    Port ( X : in  STD_LOGIC;
           Y : in  STD_LOGIC;
           Cin : in  STD_LOGIC;
           Cout : out  STD_LOGIC;
           S : out  STD_LOGIC);
end FullAdder;

architecture Behavioral of FullAdder is
  signal temp : std_logic_vector (2 downto 0); --Hilfssignal, auf das die folgende Case-Abfrage erfolgt
  begin
    temp <= X & Y & Cin;  -- Verkettung  der Eingangssignale zu einem Vektor
    Volladdierer : process (X,Y,Cin)
    begin
      case temp is
        when "000" =>    Cout <= '0'; S <='0';
        when "001" =>    Cout <= '0'; S <='1';
        when "010" =>    Cout <= '0'; S <='1';
        when "011" =>    Cout <= '1'; S <='0';
        when "100" =>    Cout <= '0'; S <='1';
        when "101" =>    Cout <= '1'; S <='0';
        when "110" =>    Cout <= '1'; S <='0';
        when others =>   Cout <= '1'; S <='1';
      end case;
    end process Volladdierer;
end Behavioral;

Autor: Ottmar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
    Verkettung : process (X,Y,Cin)
    begin
        temp <= X & Y & Cin;  -- Verkettung der Eingangssignale zu einem Vektor
    end process;

    Volladdierer : process (X,Y,Cin)
    begin
      case temp is
        when "000" =>    Cout <= '0'; S <='0';
        when "001" =>    Cout <= '0'; S <='1';
        when "010" =>    Cout <= '0'; S <='1';
        when "011" =>    Cout <= '1'; S <='0';
        when "100" =>    Cout <= '0'; S <='1';
        when "101" =>    Cout <= '1'; S <='0';
        when "110" =>    Cout <= '1'; S <='0';
        when others =>   Cout <= '1'; S <='1';
      end case;
    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:
     Volladdierer : process (X,Y,Cin)
     begin
       case X & Y & Cin is  -- Verkettung  der Eingangssignale zu einem Vektor
       :
       :

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
architecture Behavioral of FullAdder is
  signal temp : std_logic_vector (2 downto 0); --Hilfssignal, auf das die folgende Case-Abfrage erfolgt
  begin
    Volladdierer : process (X,Y,Cin)
    begin
      temp <= X & Y & Cin;  -- Verkettung  der Eingangssignale zu einem Vektor
      case temp is

...
..

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

Autor: Mathi (Gast)
Datum:

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

Autor: Mathi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder:
Volladdierer : process (X,Y,Cin, temp)
    begin
      temp <= X & Y & Cin;  -- Verkettung  der Eingangssignale zu einem Vektor
      case temp is

...


Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mathi (Gast)
Datum:

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

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, genauso hatte ich es jetzt auch gemacht. Danke nochmals :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.