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
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!
@ 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
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 ...
@ 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
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.
@ 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
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 ...
Ach ja, XC2S200 (Der hat gleiche ich keine so gute Ausstattung bzgl 32Bit Addierer. ! noeppkes ...
@ 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
@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 ...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.