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


von ffjaro (Gast)


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

von Falk B. (falk)


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

von ffjaro (Gast)


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

von Rick Dangerus (Gast)


Lesenswert?

OUT_ADD_int definieren, intern OUT_ADD_int verwenden und nach außen
1
OUT_ADD <= OUT_ADD_int;
 machen.

Rick

von ffjaro (Gast)


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

von ffjaro (Gast)


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

von Falk B. (falk)


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

von ffjaro (Gast)


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

von Falk B. (falk)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.