1

ユニバーサルシフト算術演算子を設計しています。以下に示す方法で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;
4

3 に答える 3

4

ループやcaseステートメントなしでSRA関数を使用できます。

res <= to_stdlogicvector(to_bitvector(di) sra to_integer(sel));

std_logic_vectorではなく、selをunsignedにする必要があることに注意してください。

sel: in unsigned (31  downto 0);

それを望まない場合でも、selをunsignedにキャストできます。また、numeric_bitを使用する必要があります。

use ieee.numeric_bit.all;
于 2010-11-15T15:57:07.163 に答える
1

ハードウェアの観点から言えば、1 つのクロックで可変数の位置を右にシフトするには、各ビットは、選択に基づいて 32 の可能な値の 1 つを持つ単一のフリップフロップです。その観点から、これがあなたのやり方です。

ただし、sel == 0 をケースにしてパススルーにします。論理的には、すべてをゼロに設定するよりも理にかなっています。

于 2010-11-13T20:36:01.423 に答える
1

索引付けを使用しますか?

PROCESS
  VARIABLE shift_count : INTEGER RANGE 0 TO 31;
BEGIN
  IF rst = '1' THEN
    res <= (others => '0');
  ELSIF RISING_EDGE(clk) THEN
    shift_count := to_integer(sel);
    FOR I IN 0 TO 31 LOOP
      IF I + shift_count < 32 THEN
        res(I) <= din(I + shift_count);
      ELSE
        res(I) <= din(31); -- for logical shift right, use '0' instead
      END IF;
    END LOOP;
  END IF;
END PROCESS;

このバージョンは、ジェネリックにパラメーター化するのがはるかに簡単です。

VHDl は動作記述であり、mux を指定しないことに注意してください。コンパイラは、サイズ、速度、パイプラインの許可などを最適化するかどうかに応じて、さまざまなデザインを生成できます。

5 つの 2:1 マルチプレクサは、単一の 32:1 マルチプレクサよりもはるかに小さい領域でこれを実装できることに注意してください。これがクロックレートを制限するブロックでない場合は、それが望ましいかもしれません。

selまた、入力が広すぎることに注意してください。必要なのは5ビットだけです。

于 2010-11-13T21:16:51.340 に答える