www.mikrocontroller.net

Forum: FPGA, VHDL & Co. sequentieller Addierer mit 32Bit Breite


Autor: noeppkes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgendes Problem:
Um die Slices zu reduzieren, möchte ich anstatt eines 32BIT Synchron 
Addierers einen 32Bit sequentiellen Addierer einsetzen.
Da ich mit bis zu 120 Mhz Takt und 20 usec. Zeit habe, reicht dies 
locker aus.

Wie würde nun der Aufruf aus meinem Programm heraus aussehen.
Bisher schreibe ich:

iw_i1 kommt alle 20 usec. mit einem neuen 11Bit-Wert
(Das 11. Bit ist das Vorzeichen)
Dieser Wert soll zum bisherigen Wert (mittelwert_i1) aufaddiert werden.


if (bclk and bclk'event = '1') then
...
mittelwert_i1 <= mittelwert_i1 + iw_iw;
...
end if;

Einen Fulladder habe ich im Internet gefunden.
entity FullAdder is
Port ( Cin : in STD_LOGIC;
A : in STD_LOGIC;
B : in STD_LOGIC;
Cout : out STD_LOGIC;
S : out STD_LOGIC);
end FullAdder;
...

Auch einen 4Bit FullAdder.
entity FullAdder is
Port ( Cin : in STD_LOGIC;
A : in STD_LOGIC;
B : in STD_LOGIC;
Cout : out STD_LOGIC;
S : out STD_LOGIC);
end FullAdder;

architecture dataflow of FullAdder is

begin

S <= (A and not B and not Cin) or (A and b and Cin) or
(not A and B and not Cin) or (not A and not B and Cin);
Cout <= (A and Cin) or (B and Cin) or (A and B);

end dataflow;

architecture structural of Adder4 is
signal Carry STD_LOGIC_VECTOR (2 downto 0);

component FullAdder
Port ( Cin : in STD_LOGIC;
A : in STD_LOGIC;
B : in STD_LOGIC;
Cout : out STD_LOGIC;
S : out STD_LOGIC);
end component
begin

U01: FullAdder PORT MAP (C,X(0),Y(0),Carry(0),R(0));
U02: FullAdder PORT MAP (Carray(0),X(1),Y(1),Carry(1),R(1));
U03: FullAdder PORT MAP (Carray(1),X(2),Y(2),Carry(2),R(2));
U04: FullAdder PORT MAP (Carray(2),X(3),Y(3),Carry(4),R(3));

end structural;

Jedoch werden diese über component eingebunden.
Ich will die Addition allerdings auf der Flanke haben.
Muss ich das dann über eine function lösen, wenn ja aber wie ?

Hierzu fehlt mit nun jeglicher Lösungsansatz.
Als 4Bit Addierer würd emir das ganze schon mal reichen.
Ich kann es dann selbst erhöhen.

Kann mir jemand helfen ?

noeppkes

Autor: R.D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Verwaltung für den sequenziellen Ablauf eines 4x8 Addierers ist doch 
10mal größer, als den Adder komplett einzubauen. 32Bit sind doch Krümel!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  R.D. (Gast)

>Die Verwaltung für den sequenziellen Ablauf eines 4x8 Addierers ist doch
>10mal größer, als den Adder komplett einzubauen. 32Bit sind doch Krümel!

Eben! So ziemlich alle FPGAs sind ja auf solche Sachen direkt 
vorbereitet und mittels Zusatzlogik in den Slices/LEs ist das optimal 
synthetisierbar!

MFG
Falk

Autor: noeppkes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die antworten,

ich habe allerdings 8 Addierer, die nicht unbedingt parallel laufen 
müssen.
Ich möchte gerne Slices einsparen, da der FPGA schon sehr voll ist und 
ich noch ein wenig was dazupacken muss.

Ein sehr guter Prof. sagte mir, dass ich die Addiere mit 4 * 8Bit 
Addierer aufbauen soll.
Das würde zwar auf die Geschwindigkeit gehen, würde aber Slices sparen.

Daher die Frage.

Ist das wirklich so, dass wenn ich 4 * 8Bit Addierer nehmen, das Design 
grösser wird ?

noeppkes ...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ noeppkes (Gast)

>ich habe allerdings 8 Addierer, die nicht unbedingt parallel laufen
>müssen.

Dann nimm einen Addierer und einen MUX.

>Ich möchte gerne Slices einsparen, da der FPGA schon sehr voll ist und
>ich noch ein wenig was dazupacken muss.

Der normale Addierer in FPGAs ist nicht mehr optimierbar, weder im 
Ressourcenverbrauch noch Geschwindigkeit (naja, vom Pipelining mal 
abgesehen).

>Ein sehr guter Prof. sagte mir, dass ich die Addiere mit 4 * 8Bit
>Addierer aufbauen soll.
>Das würde zwar auf die Geschwindigkeit gehen, würde aber Slices sparen.

Will ich sehen. Hose runter ;-)

>Ist das wirklich so, dass wenn ich 4 * 8Bit Addierer nehmen, das Design
>grösser wird ?

Ja.

MfG
Falk

Autor: Kuckuck (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also in einem slice stecken FF und die passenden Addierer (Carry-chain),
nutz du das FF als register für die summanden, hasst du den adder gratis
dazu, erst wenn du das FF sparen willst lohnt es sich auch die 
adderlogik zu sparen. Das stammt aus aktueller xilinx erfahrung, 
vielleicht gibt es ja
FPGA Architekturen bei denen der adder nicht gratis in der grundzelle 
steckt.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Kuckuck (Gast)

>vielleicht gibt es ja
>FPGA Architekturen bei denen der adder nicht gratis in der grundzelle
>steckt.

In uralten FPGAs vielleicht. Neue haben das alle, weil das eine 
Grundfunktion ist.

MFG
Falk

Autor: Haarspalter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auch Quicklogic (Anti-Fuse FPGA) ? und Atmel (?)

Autor: noeppkes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Falk,

danke für deine Antwort.

Das mit dem MUX habe ich schon probiert.
Jedoch keinerlei Einsparung bzgl. Slices.

Im Moment schreibe ich einfach:

if (blablabla) then
  a1_gesamt <= a1_gesamt + b1;
  a2_gesamt <= a2_gesamt + b2;
  ...
  a8_gesamt <= a8_gesamt + b8;
end if;

Wie bewege ich den FPGA nun dazu, dass er jeweils den gleichen Addierer 
für die Additionen nimmt.
Das würde doch slices sparen wenn ich nur noch einen 32 Bit Addierer 
habe  oder ?
Ich habe es probiert mit einer State Machine und den Addierer als 
Unterprogramm (function) geschrieben.
Jedoch hat das auch nichts gebracht.

Hier die function und der Aufruf.

   function addition
    (wert1 : STD_LOGIC_VECTOR (11 downto 0);
     wert2 : STD_LOGIC_VECTOR (31 downto 0);
     reset : STD_LOGIC)
     return STD_LOGIC_VECTOR  is
      variable result : STD_LOGIC_VECTOR (31 downto 0);
   begin
     if (reset = '0') then
       result := wert1 + wert2;
     else
       result := ("00000000000000000000000000000000");
     end if;
     return (result);
   end addition;


Der jeweilige Aufruf dazu:
if (blablabla) then
  case state
    when 1 => a1_gesamt <= addition (b1,   a1_gesamt,'0');
    when 2 => a2_gesamt <= addition (b2,   a2_gesamt,'0');
    ...
    when 8 => a8_gesamt <= addition (b8,   a8_gesamt,'0');
    when others =>
  end case;
end if;

noeppkes ...

Autor: noeppkes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja,

XC2S200 (Der hat gleiche ich keine so gute Ausstattung bzgl 32Bit 
Addierer. !

noeppkes ...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  noeppkes (Gast)

>Das mit dem MUX habe ich schon probiert.
>Jedoch keinerlei Einsparung bzgl. Slices.

Naja, sooo einfach isses nicht.

>Wie bewege ich den FPGA nun dazu, dass er jeweils den gleichen Addierer
>für die Additionen nimmt.

Du musst deine State-Machine so ändern, dass nur eine Addition drin ist.

>Das würde doch slices sparen wenn ich nur noch einen 32 Bit Addierer
>habe  oder ?

Naja, der 4:1 32 Bit MUX ist auch nicht umsonst. Kann ich jetzt nicht 
sagen. Muss man probieren.

>Ich habe es probiert mit einer State Machine und den Addierer als
>Unterprogramm (function) geschrieben.
>Jedoch hat das auch nichts gebracht.

Unterprogramme in VHDL ist nicht Unterprogramme wie in normalen 
Programmiersprachen. Deren Aufruf erzeugt immer wieder neue Logik.

>XC2S200 (Der hat gleiche ich keine so gute Ausstattung bzgl 32Bit
>Addierer. !

???
Den Satz formulieren wir nochmal neu.

@ Haarspalter (Gast)

>auch Quicklogic (Anti-Fuse FPGA) ? und Atmel (?)

Weiss ich nicht. Wahrscheinlich.

MFG
Falk

Autor: noeppkes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Falk,

danke für deine Hilfe.
Gerade bzgl. der StateMachine.
Das habe ich verstanden.
Ich werde mal versuchen nur einen Addierer einzusetzen und die Werte zu 
"muxen".

Melde mich noch einmal, sobald ich den "neuen Slice Verbrauch" habe.

noeppkes ...

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.