Digital-Test/vhdl/operators.vhd
2023-08-24 11:58:55 +08:00

86 lines
3.3 KiB
VHDL

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
entity operators is
generic (
g_and : std_logic_vector(1 downto 0) := "11" and "10";
g_or : std_logic_vector(1 downto 0) := "11" or "10";
g_nand : std_logic_vector(1 downto 0) := "11" nand "10";
g_nor : std_logic_vector(1 downto 0) := "11" nor "10";
g_xor : std_logic_vector(1 downto 0) := "11" xor "10";
g_xnor : std_logic_vector(1 downto 0) := "11" xnor "10";
g_not : std_logic_vector(1 downto 0) := not "10"
);
port (
clk_i : in std_logic
);
end entity operators;
architecture rtl of operators is
constant c_and : std_logic_vector(1 downto 0) := "11" and "10";
constant c_or : std_logic_vector(1 downto 0) := "11" or "10";
constant c_nand : std_logic_vector(1 downto 0) := "11" nand "10";
constant c_nor : std_logic_vector(1 downto 0) := "11" nor "10";
constant c_xor : std_logic_vector(1 downto 0) := "11" xor "10";
constant c_xnor : std_logic_vector(1 downto 0) := "11" xnor "10";
constant c_not : std_logic_vector(1 downto 0) := not "10";
signal s_op1 : std_logic_vector(1 downto 0);
signal s_op2 : std_logic_vector(1 downto 0);
signal s_res : std_logic_vector(1 downto 0);
signal s_int : integer;
signal s_sig : signed(7 downto 0);
signal s_uns : unsigned(7 downto 0);
begin
test_i: process(clk_i)
variable v_op1 : std_logic_vector(1 downto 0);
variable v_op2 : std_logic_vector(1 downto 0);
variable v_res : std_logic_vector(1 downto 0);
begin
if rising_edge(clk_i) then
if
(s_op1="11" and s_op2="00") or
(s_op1="11" or s_op2="00") or
(s_op1="11" nand s_op2="00") or
(s_op1="11" nor s_op2="00") or
(not (s_op1="11"))
then
s_res <= s_op1 and s_op2;
s_res <= s_op1 or s_op2;
v_res := v_op1 nand v_op2;
v_res := v_op1 nor v_op2;
s_res <= s_op1 xor s_op2;
v_res := v_op1 xnor v_op2;
s_res <= not s_op1;
s_int <= abs(s_int);
s_sig <= abs(s_sig);
s_sig <= s_sig sll 2;
s_sig <= s_sig srl to_integer(s_sig);
s_uns <= s_uns sll to_integer(s_uns);
s_uns <= s_uns srl 9;
s_sig <= shift_left(s_sig,2);
s_sig <= shift_right(s_sig,to_integer(s_sig));
-- s_uns <= s_uns ror 3; -- Not yet implemented
-- s_uns <= s_uns rol to_integer(s_uns); -- Not yet implemented
-- s_uns <= rotate_right(s_uns,3); -- Not yet implemented
-- s_uns <= rotate_left(s_uns,to_integer(s_uns)); -- Not yet implemented
s_sig <= s_sig rem s_int;
s_sig <= s_sig mod s_int;
end if;
if
s_sig = signed(s_uns) or unsigned(s_sig) /= s_uns or s_sig < "101010101" or
s_sig <= signed(s_uns) or unsigned(s_sig) > s_uns or s_sig >= "00000101"
then
s_sig <= s_sig + s_sig;
s_sig <= s_sig - s_sig;
s_sig <= s_sig * s_sig;
s_sig <= s_sig / s_sig;
s_sig <= s_sig(7 downto 4) & "10" & signed(s_uns(1 downto 0));
s_int <= 2 ** 3;
end if;
end if;
end process test_i;
end architecture rtl;