Fusion 27.10.2021
This commit is contained in:
parent
41b9dd9986
commit
51433deb4b
Binary file not shown.
|
@ -0,0 +1,62 @@
|
|||
$date
|
||||
Wed Oct 27 12:29:22 2021
|
||||
$end
|
||||
$version
|
||||
GHDL v0
|
||||
$end
|
||||
$timescale
|
||||
1 fs
|
||||
$end
|
||||
$var reg 1 ! shift_lsl $end
|
||||
$var reg 1 " shift_lsr $end
|
||||
$var reg 1 # shift_asr $end
|
||||
$var reg 1 $ shift_ror $end
|
||||
$var reg 1 % shift_rrx $end
|
||||
$var reg 5 & shift_val[4:0] $end
|
||||
$var reg 32 ' din[31:0] $end
|
||||
$var reg 1 ( cin $end
|
||||
$var reg 32 ) dout[31:0] $end
|
||||
$var reg 1 * cout $end
|
||||
$var reg 1 + vdd $end
|
||||
$var reg 1 , vss $end
|
||||
$scope module shift $end
|
||||
$var reg 1 - shift_lsl $end
|
||||
$var reg 1 . shift_lsr $end
|
||||
$var reg 1 / shift_asr $end
|
||||
$var reg 1 0 shift_ror $end
|
||||
$var reg 1 1 shift_rrx $end
|
||||
$var reg 5 2 shift_val[4:0] $end
|
||||
$var reg 32 3 din[31:0] $end
|
||||
$var reg 1 4 cin $end
|
||||
$var reg 32 5 dout[31:0] $end
|
||||
$var reg 1 6 cout $end
|
||||
$var reg 1 7 vdd $end
|
||||
$var reg 1 8 vss $end
|
||||
$upscope $end
|
||||
$enddefinitions $end
|
||||
#0
|
||||
0!
|
||||
0"
|
||||
0#
|
||||
1$
|
||||
0%
|
||||
b00010 &
|
||||
b00000000000000000111111110001110 '
|
||||
0(
|
||||
b10000000000000000001111111100011 )
|
||||
1*
|
||||
1+
|
||||
0,
|
||||
0-
|
||||
0.
|
||||
0/
|
||||
10
|
||||
01
|
||||
b00010 2
|
||||
b00000000000000000111111110001110 3
|
||||
04
|
||||
b10000000000000000001111111100011 5
|
||||
16
|
||||
17
|
||||
08
|
||||
#5000000
|
283
shifter.vhdl
283
shifter.vhdl
|
@ -0,0 +1,283 @@
|
|||
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;
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,49 @@
|
|||
library ieee;
|
||||
use ieee.math_real.all;
|
||||
use ieee.numeric_std.all;
|
||||
use ieee.std_logic_1164.all;
|
||||
|
||||
entity shifter_tb is
|
||||
end shifter_tb;
|
||||
|
||||
ARCHITECTURE Structurel OF Shifter_tb is
|
||||
signal shift_lsl : Std_Logic := '0';
|
||||
signal shift_lsr : Std_Logic := '0';
|
||||
signal shift_asr : Std_Logic := '0';
|
||||
signal shift_ror : Std_Logic := '0';
|
||||
signal shift_rrx : Std_Logic := '0';
|
||||
signal shift_val : Std_Logic_Vector(4 downto 0);
|
||||
signal din : Std_Logic_Vector(31 downto 0);
|
||||
signal cin : Std_Logic := '0';
|
||||
signal dout : Std_Logic_Vector(31 downto 0);
|
||||
signal cout : Std_Logic;
|
||||
signal vdd : bit := '1';
|
||||
signal vss : bit := '0';
|
||||
begin
|
||||
|
||||
shift: entity work.Shifter
|
||||
port map(
|
||||
shift_lsl => shift_lsl,
|
||||
shift_lsr => shift_lsr,
|
||||
shift_asr => shift_asr,
|
||||
shift_ror => shift_ror,
|
||||
shift_rrx => shift_rrx,
|
||||
shift_val => shift_val,
|
||||
din => din,
|
||||
cin => cin,
|
||||
dout => dout,
|
||||
cout => cout,
|
||||
vdd => vdd,
|
||||
vss => vss
|
||||
);
|
||||
process
|
||||
begin
|
||||
shift_ror <= '1';
|
||||
shift_val <= "00010";
|
||||
din <= std_logic_vector(to_unsigned(32654, 32));
|
||||
wait for 5 ns;
|
||||
report "dout = " & integer'image(to_integer(unsigned(dout)));
|
||||
WAIT;
|
||||
end process;
|
||||
|
||||
end Structurel;
|
|
@ -0,0 +1,7 @@
|
|||
v 4
|
||||
file . "shifter_tb.vhdl" "91f07b86fce3e94d1a78f6ff81549324e4c127b6" "20211027102922.006":
|
||||
entity shifter_tb at 1( 0) + 0 on 69;
|
||||
architecture structurel of shifter_tb at 9( 132) + 0 on 70;
|
||||
file . "shifter.vhdl" "19ae95a81c4d07ea688fa5629b00a8ab21404624" "20211027101726.934":
|
||||
entity shifter at 1( 0) + 0 on 53;
|
||||
architecture shifter_bhvr of shifter at 33( 791) + 0 on 54;
|
Loading…
Reference in New Issue