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

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