Forum: FPGA, VHDL & Co. ALU in VHDL mit shift operation


von Barney S. (barneyjordi)


Lesenswert?

Hi,
ich versuche gerade ein ALU mit VHDL zu beschreiben, der besteht aus 2 
Eingänge plus ein Steuersignal, und 1 Ausgang. Der sollte 8 operationen 
durchführen, u.a. shiften (<<3). Leider verstehe ich nicht, wie man das 
shiften durchführen sollte.
So sieht meine Beschreibung grad aus:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity alu is

port (
a : in std_logic_vector(7 downto 0);
b : in std_logic_vector(7 downto 0);
s : in std_logic_vector(2 downto 0);
c : out std_logic_vector(7 downto 0)
);
end alu;

architecture five of alu is

signal one : std_logic_vector(7 downto 0);
signal three : std_logic_vector(7 downto 0);

begin

one <= "00000001";
three <= "00000011";

c <= "00000001" when s = "000" and (unsigned(a) > unsigned(b)) else
"00000000" when s = "000" and (unsigned(a) <= unsigned(b)) else
"00000001" when s = "001" and (unsigned(a) = unsigned(b)) else
"00000000" when s = "001" and (unsigned(a) /= unsigned(b)) else
std_logic_vector(signed(a) + signed(one)) when s = "010" else
std_logic_vector(signed(a) + signed(b)) when s = "011" else
a and b when s = "100" else
a or b when s = "101" else
std_logic_vector(b sla unsigned(three)) when s = "110" else
std_logic_vector(unsigned(a) mod unsigned(b)) when s = "111" else
"--------";
end five;

Die Zeile mit "std_logic_vector(b sla unsigned(three)) when s = "110"" 
ist mein Verscuh für den shift.

Hat jemand eine Idee, wie man dies so durchführen könnte? Wäre sehr sehr 
dankbar!

Viele Grüße,

Jordi

von dired (Gast)


Lesenswert?

Hi Jordi

sla (shift left arithmetik) wird nicht von allen Hertellern unterstützt. 
Meine auch gelesen zu haben, dass der Befehl aus der Lib entfernt worden 
ist.

Gruß dired

von Duke Scarring (Gast)


Lesenswert?

Barney Skinner schrieb:
> use ieee.numeric_std.all;
Schau Dir mal den Quelltext von der numeric_std an.
Da heißt die Funktion shift_left( <unsigned>, <natural>).

Duke

von Klaus (Gast)


Lesenswert?

Hi Jordi, dazu brauchst du keine library Funktion.
Das geht bei festen shift Werten direkt mit dem bit pattern.
Versuch mal

with s select c <=
    ...
    b(4 downto 0) & "000"   when "110"
    ...

von Jordi (Gast)


Lesenswert?

Vielen Dank!! Danke Klaus das war ein guter Tipp. Ich habe auch 
herausgefunden, dass der operanden shift_left(a,b) auch funtioniert, 
wobei a vom typ signed ist und b vom typ unsigned.

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.