Vhdl Konkatenation

#925561
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
Gast #925637
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren