- minor improvements for load/store shifter

Committed on the Free edition of March Hare Software CVSNT Server.
Upgrade to CVS Suite for more features and support:
http://march-hare.com/cvsnt/


git-svn-id: http://moon:8086/svn/vhdl/trunk@430 cc03376c-175c-47c8-b038-4cd826a8556b
This commit is contained in:
2009-04-15 13:21:39 +00:00
parent 1c5db27de0
commit a3c4ba6e82
+75 -79
View File
@@ -264,7 +264,7 @@ package mips_types is
end record; end record;
type cop0_ctrl_out_t is record type cop0_ctrl_out_t is record
RE : STD_LOGIC; EB : STD_LOGIC;
exc_inject : STD_LOGIC; exc_inject : STD_LOGIC;
exc_commit : STD_LOGIC; exc_commit : STD_LOGIC;
exc_pending : STD_LOGIC; exc_pending : STD_LOGIC;
@@ -454,56 +454,53 @@ package body mips_types is
function store_be(va : unsigned(1 downto 0); be_src, word2_en, word4_en, align_left, bypass : std_logic) return unsigned is function store_be(va : unsigned(1 downto 0); be_src, word2_en, word4_en, align_left, bypass : std_logic) return unsigned is
variable result : unsigned(3 downto 0); variable result : unsigned(3 downto 0);
begin begin
if bypass = '1' then result := (3 downto 0 => be_src);
result := (3 downto 0 => be_src); if bypass = '0' then
elsif word2_en = '1' then if word2_en = '1' then
case va is case va is
when "00" | "01" => when "00" =>
result := "00" & be_src & be_src; result := "00" & be_src & be_src;
when "10" | "11" => when "10" =>
result := be_src & be_src & "00"; result := be_src & be_src & "00";
when others => when others => null;
result := "0000"; end case;
end case; elsif word4_en = '1' then
elsif word4_en = '1' then case va is
case va is when "00" =>
when "00" => result := "000" & be_src;
result := "000" & be_src; when "01" =>
when "01" => result := "00" & be_src & '0';
result := "00" & be_src & '0'; when "10" =>
when "10" => result := '0' & be_src & "00";
result := '0' & be_src & "00"; when "11" =>
when "11" => result := be_src & "000";
result := be_src & "000"; when others => null;
when others => end case;
result := "0000"; elsif align_left = '1' then
end case; case va is
elsif align_left = '1' then when "00" =>
case va is result := be_src & be_src & be_src & be_src;
when "00" => when "01" =>
result := be_src & be_src & be_src & be_src; result := be_src & be_src & be_src & '0';
when "01" => when "10" =>
result := be_src & be_src & be_src & '0'; result := be_src & be_src & "00";
when "10" => when "11" =>
result := be_src & be_src & "00"; result := be_src & "000";
when "11" => when others => null;
result := be_src & "000"; end case;
when others => else
result := "0000"; case va is
end case; when "00" =>
else result := "000" & be_src;
case va is when "01" =>
when "00" => result := "00" & be_src & be_src;
result := "000" & be_src; when "10" =>
when "01" => result := '0' & be_src & be_src & be_src;
result := "00" & be_src & be_src; when "11" =>
when "10" => result := be_src & be_src & be_src & be_src;
result := '0' & be_src & be_src & be_src; when others => null;
when "11" => end case;
result := be_src & be_src & be_src & be_src; end if;
when others =>
result := "0000";
end case;
end if; end if;
return result; return result;
@@ -539,34 +536,33 @@ package body mips_types is
function load_be(va : unsigned(1 downto 0); align_left, bypass : std_logic) return unsigned is function load_be(va : unsigned(1 downto 0); align_left, bypass : std_logic) return unsigned is
variable result : unsigned(3 downto 0); variable result : unsigned(3 downto 0);
begin begin
if bypass = '1' then result := (3 downto 0 => '1');
result := (3 downto 0 => '1'); if bypass = '0' then
elsif align_left = '1' then if align_left = '1' then
case va is case va is
when "00" => when "00" =>
result := "1000"; result := "1000";
when "01" => when "01" =>
result := "1100"; result := "1100";
when "10" => when "10" =>
result := "1110"; result := "1110";
when "11" => when "11" =>
result := "1111"; result := "1111";
when others => when others => null;
result := "0000"; end case;
end case; else
else case va is
case va is when "00" =>
when "00" => result := "1111";
result := "1111"; when "01" =>
when "01" => result := "0111";
result := "0111"; when "10" =>
when "10" => result := "0011";
result := "0011"; when "11" =>
when "11" => result := "0001";
result := "0001"; when others => null;
when others => end case;
result := "0000"; end if;
end case;
end if; end if;
return result; return result;