mikrocontroller.net

Forum: FPGA, VHDL & Co. Addierer-Ergebnis im nächsten Takt wieder addieren


Autor: ffjaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,


ich habe einen Addierer mit 2Eingängen.
Der eine Eingang bekommt von Außen neue Daten, der andere soll das 
Ergebnis der vorherigen Addition sein.

WIe implementiere ich das in VHDL?

process (CLOCK)
begin
   if (clock'event and clock='1') then

  OUT_ADD <=IN1_ADD + TEMP;
  TEMP:=OUT_ADD;
  end if;
end process;

so gehts nicht. Bekomme da Syntax fehler.
Wie mache ich das genau, damit das funktioniert?
Als was muss ich TEMP deklarieren?
Ich brauche ja irgendwie nen Zwischenspeicher, geht das mit Variablen?
Bin neu in VHDL und ist keine leichte Umstellung von C auf VHDL. Allein 
die Denkweise ist ja ne komplett andere



Vielen Dank


mfG

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ ffjaro (Gast)

>ich habe einen Addierer mit 2Eingängen.
>Der eine Eingang bekommt von Außen neue Daten, der andere soll das
>Ergebnis der vorherigen Addition sein.

Das nennt man Akkumulator.
process (CLOCK)
begin
   if (clock'event and clock='1') then
     OUT_ADD <=OUT_ADD + IN_ADD;
  end if;
end process;

>Bin neu in VHDL und ist keine leichte Umstellung von C auf VHDL. Allein
>die Denkweise ist ja ne komplett andere

Nicht wahr?! Parallel Denken und Arbeiten. Das was Frauen angeblich so 
gut können . . . ;-)

MfG
Falk

Autor: ffjaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

danke für die Antwort.

Wenn ich das so versuche, dann bekomme ich diesen Fehler:

"Parameter OUT_ADD of mode out can not be associated with a formal 
parameter of mode in."






Wenn ich das auf "inout" stelle ist dieser Fehler weg, jedoch an der 
Stelle wo PORT MAP gemacht wird kann ich dann den Ausgang nicht mehr an 
meinen Ausgang der übergeordneten Komponente zuordnen.


Und nu?



mfG


Vielen Dank

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OUT_ADD_int definieren, intern OUT_ADD_int verwenden und nach außen
OUT_ADD <= OUT_ADD_int;
 machen.

Rick

Autor: ffjaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dankeschön für die schnelle Antwort.


Als was muss ich es denn definieren?
Als Variable ?

Und an welcher Stelle im Quellcode muss das stehen?

process (CLOCK)

begin
   if (clock'event and clock='1') then
  
  OUT_ADD_int <=OUT_ADD + IN1_ADD;
  OUT_ADD <=OUT_ADD_int ;
  
  end if;
end process;



VIelen Dank

mfG

Autor: ffjaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab das jetzt mit einer Variable versucht zu machen :

process (CLOCK)
variable OUT_ADD_int : std_logic_vector(31 downto 0);
begin
   
         if (clock'event and clock='1') then
  
  OUT_ADD_int :=OUT_ADD + IN1_ADD;
  OUT_ADD <=OUT_ADD_int; 
  
  end if;
end process;

Bekomme jetzt aber folgende Fehlermeldung:


Parameter OUT_ADD of mode out can not be associated with a formal 
parameter of mode in.



Wie bekomme ich das zum laufen, so dass er wie oben beschrieben 
arbeitet?


Vielen Dank


mfG

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ ffjaro (Gast)

>Hab das jetzt mit einer Variable versucht zu machen :

LASS DIE FINGEER VON VARIABLEN!

http://www.mikrocontroller.net/articles/VHDL
-- oben vor begin als normales signal deklarieren

signal OUT_ADD_int : std_logic_vector(31 downto 0);

-- den process nach begin

process (CLOCK)
begin
   
  if (clock'event and clock='1') then
  
    OUT_ADD_int <=OUT_ADD_int + IN1_ADD;
  
  end if;
end process;

-- parallele (concurrent) Anweisung

  OUT_ADD <=OUT_ADD_int; 


>Wie bekomme ich das zum laufen, so dass er wie oben beschrieben
>arbeitet?

Indem du dir mal ein paar Grundlagen anschaust, anstatt planlos 
rumzustochern. Ports vom Typ out kann man nicht lesen, nur schreiben. 
Inout ist bidirektional und geht hier meist schief. Buffer war mal dafür 
vorgesehen, sollte aber aus diversen anderen Gründen nicht verwendet 
werden. Die saubere Lösung heisst, ein Signal in der Entity deklariern, 
nutzen und einfach auf den out Port zuweisen.

MFG
Falk


mfG

Autor: ffjaro (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die ausführliche Antwort.


Hatte es mit Variablen hinbekommen. Kam das gleiche raus.

Was ist denn der Grund Variablen nicht zu benutzen?
In deinem Link ist mir das nicht so ersichtlich geworden.

Vielen Dank

mfG

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ ffjaro (Gast)

>Hatte es mit Variablen hinbekommen. Kam das gleiche raus.

Nochmal extra für dich.

LASS DIE FINGER VORERST VON VARIABLEN!!!

>Was ist denn der Grund Variablen nicht zu benutzen?
>In deinem Link ist mir das nicht so ersichtlich geworden.

http://www.mikrocontroller.net/articles/VHDL

Ist dort jetzt hoffentlich besser beschrieben.

MFG
Falk

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.