VHDL 中的通用移位算术

nam*_*ame 2 circuit fpga vhdl hdl

我正在设计通用移位算术运算符。除了按照下面介绍的方式使用 32 位多路复用器(解码器)之外,还有更好的方法来实现它吗?

ENTITY isra IS 
PORT (
  clk:    in std_logic;
  rst:    in std_logic;
  di:     in std_logic_vector (31 downto 0);
  sel:    in std_logic_vector (31  downto 0);
  res:    out std_logic_vector (31 downto 0) := (others => '0')
);
END isra;


PROCESS
  BEGIN
    WAIT UNTIL clk'EVENT AND clk = '1';
    IF rst = '1' THEN
      res <= (others => '0');
    ELSE
    CASE sel IS
        when X"00000001"  => res <= to_stdlogicvector(to_bitvector(a) sra 1);
        when X"00000002"  => res <= to_stdlogicvector(to_bitvector(a) sra 2);
        ...
        when X"0000001F"  => res <= to_stdlogicvector(to_bitvector(a) sra 31);
        when others => res <= (others => '0');
    END CASE;
END IF;
END PROCESS;
Run Code Online (Sandbox Code Playgroud)

Phi*_*ppe 5

您可以使用 SRA 函数而无需任何循环或 case 语句:

res <= to_stdlogicvector(to_bitvector(di) sra to_integer(sel));
Run Code Online (Sandbox Code Playgroud)

请注意,您需要使 sel 成为无符号的,而不是 std_logic_vector:

sel: in unsigned (31  downto 0);
Run Code Online (Sandbox Code Playgroud)

如果您不想这样做,您仍然可以将 sel 转换为无符号。您还需要使用 numeric_bit:

use ieee.numeric_bit.all;
Run Code Online (Sandbox Code Playgroud)