projet-vlsi/shifter.vhdl

284 lines
11 KiB
VHDL

library ieee;
use ieee.math_real.all;
use ieee.numeric_std.all;
use ieee.std_logic_1164.all;
entity Shifter is
port(
shift_lsl : in Std_Logic;
shift_lsr : in Std_Logic;
shift_asr : in Std_Logic;
shift_ror : in Std_Logic; -- rotation sans extension
shift_rrx : in Std_Logic; -- avec extension
shift_val : in Std_Logic_Vector(4 downto 0);
din : in Std_Logic_Vector(31 downto 0);
cin : in Std_Logic;
dout : out Std_Logic_Vector(31 downto 0);
cout : out Std_Logic;
-- global interface
vdd : in bit;
vss : in bit );
end Shifter;
-- TODO:
-- changer les "000" et "temp_dout(31)& temp_dout(31)& ..." par la synthaxe
-- (n1 downto n0 => '0') ou (n1 downto n0 => '0')
architecture Shifter_bhvr of Shifter is
begin
process(shift_lsl, shift_lsr, shift_asr, shift_ror, shift_rrx,shift_val,
din, cin, vdd, vss)
variable temp_dout : Std_Logic_Vector(31 downto 0);
variable temp_cout : Std_Logic;
begin
temp_dout := din;
temp_cout := cin;
-- LSL -------------------------------------------------------------
-- 1
if(shift_lsl='1' and shift_val(0)='1')
then
temp_cout := temp_dout(31);
temp_dout := (temp_dout(30 downto 0)&'0');
else NULL;
end if;
-- 2
if(shift_lsl='1' and shift_val(1)='1')
then
temp_cout := temp_dout(30);
temp_dout := (temp_dout(29 downto 0)&"00");
else NULL;
end if;
-- 4
if(shift_lsl='1' and shift_val(2)='1')
then
temp_cout := temp_dout(28);
temp_dout := (temp_dout(27 downto 0)&"0000");
else NULL;
end if;
-- 8
if(shift_lsl='1' and shift_val(3)='1')
then
temp_cout := temp_dout(24);
temp_dout :=(temp_dout(23 downto 0)&"00000000");
else NULL;
end if;
-- 16
if(shift_lsl='1' and shift_val(4)='1')
then
temp_cout := temp_dout(16);
temp_dout :=
(temp_dout(15 downto 0)&"0000000000000000");
else NULL;
end if;
-- LSR -------------------------------------------------------------
-- 1
if(shift_lsr='1' and shift_val(0)='1')
then
temp_cout := temp_dout(0);
temp_dout := ('0'&temp_dout(31 downto 1));
else NULL;
end if;
-- 2
if(shift_lsr='1' and shift_val(1)='1')
then
temp_cout := temp_dout(0);
temp_dout := ("00"&temp_dout(31 downto 2));
else NULL;
end if;
-- 4
if(shift_lsr='1' and shift_val(2)='1')
then
temp_cout := temp_dout(0);
temp_dout := ("0000"&temp_dout(31 downto 4));
else NULL;
end if;
-- 8
if(shift_lsr='1' and shift_val(3)='1')
then
temp_cout := temp_dout(0);
temp_dout :=("00000000"&temp_dout(31 downto 8));
else NULL;
end if;
-- 16
if(shift_lsr='1' and shift_val(4)='1')
then
temp_cout := temp_dout(0);
temp_dout :=
("0000000000000000"&temp_dout(31 downto 16));
else NULL;
end if;
-- ASR -------------------------------------------------------------
-- 1
if(shift_asr='1' and shift_val(0)='1')
then
temp_cout := temp_dout(0);
temp_dout := (temp_dout(31)
&temp_dout(31 downto 1));
else NULL;
end if;
-- 2
if(shift_asr='1' and shift_val(1)='1')
then
temp_cout := temp_dout(0);
temp_dout :=
( temp_dout(31)& temp_dout(31)
&temp_dout(31 downto 2));
else NULL;
end if;
-- 4
if(shift_asr='1' and shift_val(2)='1')
then
temp_cout := temp_dout(0);
temp_dout :=
( temp_dout(31)& temp_dout(31)
&temp_dout(31)& temp_dout(31)
&temp_dout(27 downto 0));
else NULL;
end if;
-- 8
if(shift_asr='1' and shift_val(3)='1')
then
temp_cout := temp_dout(0);
temp_dout :=
( temp_dout(31)&temp_dout(31)&temp_dout(31)
&temp_dout(31)&temp_dout(31)&temp_dout(31)
&temp_dout(31)&temp_dout(31)
&temp_dout(23 downto 0));
else NULL;
end if;
-- 16
if(shift_asr='1' and shift_val(4)='1')
then
temp_cout := temp_dout(0);
temp_dout :=
( temp_dout(31)& temp_dout(31)&
temp_dout(31)& temp_dout(31)&
temp_dout(31)& temp_dout(31)&
temp_dout(31)& temp_dout(31)&
temp_dout(31)& temp_dout(31)&
temp_dout(31)& temp_dout(31)&
temp_dout(31)& temp_dout(31)&
temp_dout(31)& temp_dout(31)&
temp_dout(15 downto 0));
else NULL;
end if;
-- ROR -------------------------------------------------------------
-- 1
if(shift_ror='1' and shift_val(0)='1')
then temp_dout := (temp_dout(0)
&temp_dout(31 downto 1));
temp_cout := temp_dout(0);
else NULL;
end if;
-- 2
if(shift_ror='1' and shift_val(1)='1')
then temp_dout :=
(temp_dout(1 downto 0)
&temp_dout(31 downto 2));
temp_cout := temp_dout(1);
else NULL;
end if;
-- 4
if(shift_ror='1' and shift_val(2)='1')
then temp_dout :=
(temp_dout(3 downto 0)
&temp_dout(31 downto 4));
temp_cout := temp_dout(3);
else NULL;
end if;
-- 8
if(shift_ror='1' and shift_val(3)='1')
then temp_dout :=
(temp_dout(7 downto 0)
&temp_dout(31 downto 8));
temp_cout := temp_dout(7);
else NULL;
end if;
-- 16
if(shift_ror='1' and shift_val(4)='1')
then temp_dout :=
(temp_dout(15 downto 0)
&temp_dout(31 downto 16));
temp_cout := temp_dout(15);
else NULL;
end if;
-- RRX -------------------------------------------------------------
-- 1
if(shift_rrx='1' and shift_val(0)='1')
then temp_dout := (temp_cout
&temp_dout(31 downto 1));
temp_cout := temp_dout(0);
else NULL;
end if;
-- 2
if(shift_rrx='1' and shift_val(1)='1')
then temp_dout :=
(temp_cout
&temp_dout(0)
&temp_dout(31 downto 2));
temp_cout := temp_dout(1);
else NULL;
end if;
-- 4
if(shift_rrx='1' and shift_val(2)='1')
then temp_dout :=
(temp_cout
&temp_dout(2 downto 0)
&temp_dout(31 downto 4));
temp_cout := temp_dout(3);
else NULL;
end if;
-- 8
if(shift_rrx='1' and shift_val(3)='1')
then temp_dout :=
(temp_cout
&temp_dout(6 downto 0)
&temp_dout(31 downto 8));
temp_cout := temp_dout(7);
else NULL;
end if;
-- 16
if(shift_rrx='1' and shift_val(4)='1')
then temp_dout :=
(temp_cout
&temp_dout(14 downto 0)
&temp_dout(31 downto 16));
temp_cout := temp_dout(15);
else NULL;
end if;
cout <= temp_cout;
dout <= temp_dout;
end process;
end Shifter_bhvr;