Professional Documents
Culture Documents
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity barrel is
PORT(datain:in std_logic_vector(7 downto 0);
opcode:in std_logic_vector(2 downto 0);
count:in std_logic_vector(2 downto 0);
dataout:out std_logic_vector(7 downto 0)
);
end barrel;
dataout<=datain;
elsif opcode="001"then
dataout<=datain;
elsif opcode="010"then
dataout<=datain;
elsif opcode="100"then
dataout<=datain;
elsif opcode="101"then
dataout<=datain;
elsif opcode="110"then
dataout<=datain;
end if;
--this case indicates input data in shifted by 1 bit
when "001"=>
if opcode="000"then --shift right logical
dataout<="0"&datain( 7 downto 1);
elsif opcode="001"then --shift right arithmetic
dataout<=datain(7)& datain(7 downto 1);
elsif opcode="010"then --rotate right
dataout<=datain(0) & datain(7 downto 1);
elsif opcode="100"then --shift left logical
dataout<=datain(6 downto 0) &"0";
elsif opcode="101"then --shift left arithmetic
dataout<=datain(7)&datain(5 downto 0) &"0";
elsif opcode="110"then--rotate left
dataout<=datain(6 downto 0) & datain(7);
end if;
elsif opcode="110"then
dataout<=datain(4 downto 0 )&datain( 7 downto 5);
end if;
--this case indicates that input data is shifted by 4 bits
when "100"=>
if opcode="000"then
dataout<="0000" & datain(7 downto 4);
elsif opcode="001"then
dataout<=datain(7)&datain(7)&datain(7)&datain(7)&datain(7 downto 4);
elsif opcode="010"then
dataout<=datain(3 downto 0) &datain( 7 downto 4);
elsif opcode="100"then
dataout<=datain(3 downto 0) &"0000";
elsif opcode="101"then
dataout<=datain(7)&datain(2 downto 0) & "0000";
elsif opcode="110"then
dataout<=datain(3 downto 0)&datain( 7 downto 4);
end if;
--this case indicates that input data is shifted by 5 bits
when "101"=>
if opcode="000"then
dataout<="00000" &datain( 7 downto 5);
elsif opcode="001"then
dataout<=datain(7)&datain(7)&datain(7)&datain(7)&datain(7)&datain(7 downto 5);
elsif opcode="010"then
dataout<=datain(4 downto 0) & datain(7 downto 5);
elsif opcode="100"then
elsif opcode="010"then
dataout<=datain(6 downto 0)&datain(7);
elsif opcode="100"then
dataout<=datain(0) &"0000000";
elsif opcode="101"then
dataout<=datain(7)&"0000000";
elsif opcode="110"then
dataout<=datain(0)&datain( 7 downto 1);
end if;
end case;
end process;
end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY LOGICRIGHT IS
PORT(I:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
COUNT:in STD_LOGIC_VECTOR(2 DOWNTO 0);
Y:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END LOGICRIGHT;
COMPONENT MUX2_1 IS
port(A,B:IN STD_LOGIC;
SEL:IN STD_LOGIC;
MOUT:OUT STD_LOGIC
);
END COMPONENT;
BEGIN
--RIGHT SHIFT BY 4 BIT
MO:MUX2_1 PORT MAP ('0',I(7),COUNT(2),X(7));
M1:MUX2_1 PORT MAP ('0',I(6),COUNT(2),X(6));
M2:MUX2_1 PORT MAP ('0',I(5),COUNT(2),X(5));
M3:MUX2_1 PORT MAP ('0',I(4),COUNT(2),X(4));
M4:MUX2_1 PORT MAP (I(7),I(3),COUNT(2),X(3));
M5:MUX2_1 PORT MAP (I(6),I(2),COUNT(2),X(2));
M6:MUX2_1 PORT MAP (I(5),I(1),COUNT(2),X(1));
M7:MUX2_1 PORT MAP (I(4),I(0),COUNT(2),X(0));
--RIGHT SHIFT BY 2 BITS
M8:MUX2_1 PORT MAP ('0',X(7),COUNT(1),W(7));
M9:MUX2_1 PORT MAP ('0',X(6),COUNT(1),W(6));
M10:MUX2_1 PORT MAP (X(7),X(5),COUNT(1),W(5));
M11:MUX2_1 PORT MAP (X(6),X(4),COUNT(1),W(4));
ENTITY ROTATERIGHT IS
PORT(I:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
COUNT:in STD_LOGIC_VECTOR(2 DOWNTO 0);
Y:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END ROTATERIGHT;
COMPONENT MUX2_1 IS
port(A,B:IN STD_LOGIC;
SEL:IN STD_LOGIC;
MOUT:OUT STD_LOGIC
);
END COMPONENT;
BEGIN
--RIGHT SHIFT BY 4 BIT
MO:MUX2_1 PORT MAP (I(3),I(7),COUNT(2),X(7));
M1:MUX2_1 PORT MAP (I(2),I(6),COUNT(2),X(6));
M2:MUX2_1 PORT MAP (I(1),I(5),COUNT(2),X(5));
M3:MUX2_1 PORT MAP (I(0),I(4),COUNT(2),X(4));
M4:MUX2_1 PORT MAP (I(7),I(3),COUNT(2),X(3));
M5:MUX2_1 PORT MAP (I(6),I(2),COUNT(2),X(2));
M6:MUX2_1 PORT MAP (I(5),I(1),COUNT(2),X(1));
M7:MUX2_1 PORT MAP (I(4),I(0),COUNT(2),X(0));
--RIGHT SHIFT BY 2 BITS
M8:MUX2_1 PORT MAP (X(1),X(7),COUNT(1),W(7));
M9:MUX2_1 PORT MAP (X(0),X(6),COUNT(1),W(6));
M10:MUX2_1 PORT MAP (X(7),X(5),COUNT(1),W(5));
M11:MUX2_1 PORT MAP (X(6),X(4),COUNT(1),W(4));
M12:MUX2_1 PORT MAP (X(5),X(3),COUNT(1),W(3));
ENTITY ARITHMETICRIGHT IS
PORT(I:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
COUNT:in STD_LOGIC_VECTOR(2 DOWNTO 0);
Y:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END ARITHMETICRIGHT;
COMPONENT MUX2_1 IS
port(A,B:IN STD_LOGIC;
SEL:IN STD_LOGIC;
MOUT:OUT STD_LOGIC
);
END COMPONENT;
BEGIN
--RIGHT SHIFT BY 4 BIT
MO:MUX2_1 PORT MAP (I(7),I(7),COUNT(2),X(7));
M1:MUX2_1 PORT MAP (I(7),I(6),COUNT(2),X(6));
M2:MUX2_1 PORT MAP (I(7),I(5),COUNT(2),X(5));
M3:MUX2_1 PORT MAP (I(7),I(4),COUNT(2),X(4));
M4:MUX2_1 PORT MAP (I(7),I(3),COUNT(2),X(3));
M5:MUX2_1 PORT MAP (I(6),I(2),COUNT(2),X(2));
M6:MUX2_1 PORT MAP (I(5),I(1),COUNT(2),X(1));
M7:MUX2_1 PORT MAP (I(4),I(0),COUNT(2),X(0));
--RIGHT SHIFT BY 2 BITS
M8:MUX2_1 PORT MAP (X(7),X(7),COUNT(1),W(7));
M9:MUX2_1 PORT MAP (X(7),X(6),COUNT(1),W(6));
M10:MUX2_1 PORT MAP (X(7),X(5),COUNT(1),W(5));
M11:MUX2_1 PORT MAP (X(6),X(4),COUNT(1),W(4));
M12:MUX2_1 PORT MAP (X(5),X(3),COUNT(1),W(3));
ENTITY RIGHTROTSHT IS
PORT(I
);
--COUNT->AMOUNT TO BE SHIFTED OR ROTATED
END RIGHTROTSHT;
COMPONENT MUX2_1 IS
port(A,B:IN STD_LOGIC;
SEL:IN STD_LOGIC;
MOUT:OUT STD_LOGIC
);
END COMPONENT;
BEGIN
--TO decide whether to use logical or arithmetic
--sal->0 logical sal->1 arithmetic
M_D:MUX2_1 PORT MAP ('0',I(7),SAL,S);