Hallo Leute, ich stehe vor scheinbar einfachem Problem, komme aber nicht weiter. Ich habe folgendes: signal a, b, c : std_logic_vector(3 downto 0); und möchte c:= 2*a + b berechnen. Die Multiplikation möchte ich durch einfache Linksverschiebung berechnen(ich kann sicherstellen dass a<=7 ist). Ich habe folgendes versucht: c <= (a & B"0") + b; Das was er berechnet ist c:= (2*a + b)/2. Aus der Addition kommen 5 Bit raus und er nimmt die 4 oberen und weisst sie c zu. Wenn ich c als (4 downto 0) deklariere und c <= ((a & B"0") + (B"0" & b) zuweise, dann rechnet er korrekt. Weisst jemand wie ich das Problem lösen kann ohne c als 5Bit deklarieren zu müssen? danke patrik
Geht nicht, bei der Multiplikation von 2 4-Bit-Werten kommt ein Wert mit 5 Bit raus, der muss händisch bearbeitet werden. Eine Möglichkeit ist der Zwischenschritt über eine Variable:
1 | process (a,b) |
2 | variable zw : std_logic_vector(4 downto 0); |
3 | begin
|
4 | zw := a & '0'; |
5 | c <= zw(3 downto 0) + b; |
6 | end process; |
Wenn das gilt:
>ich kann sicherstellen dass a<=7 ist
dann machs doch so:
1 | c <= a(2 downto 0)&'0' + b; |
Richtig wäre dann aber, schon die Deklaration von a so auszulegen, dass a zum Wertebereich passt. So gehts auch:
1 | c <= a+a+b; |
Das Synthese-Ergebnis: : Synthesizing Unit <muladd>. WARNING:Xst:647 - Input <a<3>> is never used. Found 4-bit adder for signal <c>. Summary: inferred 1 Adder/Subtractor(s). Unit <muladd> synthesized. : Also: der Synthesizer hat erkannt, dass a(3) nicht verwendet wird.
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.