Forum: FPGA, VHDL & Co. Vhdl Konkatenation


von Pat R. (patrik)


Lesenswert?

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

von lkmiller (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.