Addierer-Ergebnis im nächsten Takt wieder addieren

Gast #925394
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
#925405
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.
1
process (CLOCK)
2
begin
3
   if (clock'event and clock='1') then
4
     OUT_ADD <=OUT_ADD + IN_ADD;
5
  end if;
6
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
Gast #925421
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
Gast #925435
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?
1
process (CLOCK)
2

3
begin
4
   if (clock'event and clock='1') then
5
  
6
  OUT_ADD_int <=OUT_ADD + IN1_ADD;
7
  OUT_ADD <=OUT_ADD_int ;
8
  
9
  end if;
10
end process;


VIelen Dank

mfG
Gast #925475
Lesenswert?
• ▲
▼
Hab das jetzt mit einer Variable versucht zu machen :
1
process (CLOCK)
2
variable OUT_ADD_int : std_logic_vector(31 downto 0);
3
begin
4
   
5
         if (clock'event and clock='1') then
6
  
7
  OUT_ADD_int :=OUT_ADD + IN1_ADD;
8
  OUT_ADD <=OUT_ADD_int; 
9
  
10
  end if;
11
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
#925497
Lesenswert?
• ▲
▼
@ ffjaro (Gast)

>Hab das jetzt mit einer Variable versucht zu machen :

LASS DIE FINGEER VON VARIABLEN!

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

3
signal OUT_ADD_int : std_logic_vector(31 downto 0);
4

5
-- den process nach begin
6

7
process (CLOCK)
8
begin
9
   
10
  if (clock'event and clock='1') then
11
  
12
    OUT_ADD_int <=OUT_ADD_int + IN1_ADD;
13
  
14
  end if;
15
end process;
16

17
-- parallele (concurrent) Anweisung
18

19
  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
Gast #925509
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

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.