forked from cores/microwatt
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.0 KiB
VHDL
45 lines
1.0 KiB
VHDL
5 years ago
|
library ieee;
|
||
|
use ieee.std_logic_1164.all;
|
||
|
use ieee.numeric_std.all;
|
||
|
|
||
|
library work;
|
||
|
use work.decode_types.all;
|
||
|
|
||
|
entity logical is
|
||
|
port (
|
||
|
rs : in std_ulogic_vector(63 downto 0);
|
||
|
rb : in std_ulogic_vector(63 downto 0);
|
||
|
op : in insn_type_t;
|
||
|
invert_in : in std_ulogic;
|
||
|
invert_out : in std_ulogic;
|
||
|
result : out std_ulogic_vector(63 downto 0)
|
||
|
);
|
||
|
end entity logical;
|
||
|
|
||
|
architecture behaviour of logical is
|
||
|
begin
|
||
|
logical_0: process(all)
|
||
|
variable rb_adj, tmp : std_ulogic_vector(63 downto 0);
|
||
|
begin
|
||
|
rb_adj := rb;
|
||
|
if invert_in = '1' then
|
||
|
rb_adj := not rb;
|
||
|
end if;
|
||
|
|
||
|
case op is
|
||
|
when OP_AND =>
|
||
|
tmp := rs and rb_adj;
|
||
|
when OP_OR =>
|
||
|
tmp := rs or rb_adj;
|
||
|
when others =>
|
||
|
tmp := rs xor rb_adj;
|
||
|
end case;
|
||
|
|
||
|
result <= tmp;
|
||
|
if invert_out = '1' then
|
||
|
result <= not tmp;
|
||
|
end if;
|
||
|
|
||
|
end process;
|
||
|
end behaviour;
|