1

VHDL でシフト レジスタを実装しました。「BITS」をパラメーターとして使用して、ユーザー定義の数値を右にシフトできるようにします。意図したとおりに動作しますが、Quartus II の Compilation Report によると、164 個のロジック エレメントを必要とします。なぜ私のコードがひどいのか、それを最適化するためのヒントを教えてもらえますか? :) 前もって感謝します。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity ssi_data_align is

    port
    (
        DATA_IN      : in   std_logic_vector(31 downto 0);
        BITS         : in   std_logic_vector(4 downto 0);
        DATA_OUT     : out std_logic_vector(31 downto 0));

end entity;

architecture Behavioral of ssi_data_align is

begin

DATA_OUT <= std_logic_vector(SHIFT_RIGHT(unsigned(not DATA_IN), natural(32-(to_integer(unsigned(BITS))))));

end Behavioral;
4

3 に答える 3

1

時間がたくさんある場合は、常に data_in を 32 回シフトしてみてください。次に、BITS をセレクターとして使用して、適切なクロック サイクルをタップします。クロック ロジックを使用して問題を解決すると、合成サイズが小さくなります。

たぶん、このようなものですか?

process (clk)
begin
  if rising_edge(clk) then

    SHIFT_DATA <= '0' & DATA_IN(30 downto 0);

    if BITS = count then
      DATA_OUT <= SHIFT_DATA;
      count <= 0;
    else
      count <= count + 1;
    end if;
  end if;
end process;
于 2014-07-15T13:59:09.513 に答える
0

実際、あなたのデザインはそれほど悪くありません。バレル シフターの典型的なコストを見れば、定義された領域に十分に収まっています (ここのウィキペディアには、バレル シフターの典型的なコストのリストがあります。

どのように改善できるかは、アプリケーションによって異なります。

  • 十分な時間があれば、複数のクロック サイクルをシフトできます。これにより、ロジックが固定サイズの 1 ビット シフターに削減され、シフト数をカウントするためのオーバーヘッドが小さくなり、必要なロジック要素が少なくなります (定数によるシフトは非常に安価です)。
  • シフト サイズが静的な場合は、ジェネリックに置き換えることができます。
于 2014-07-15T13:20:54.233 に答える