再利用可能なバレル シフターを作成しようとしています。ビットの入力配列を受け取り、それらを特定の数の位置 (別の入力によって決定される) だけシフトします。モジュールをパラメータ化して、任意のn.
必要な選択行の数はn--> によって決定されます。つまり、SHIFT_CNT = log2(NUMBITS-1)+1以下のコードです。std_logic_vectorまたは以外のポートを持つことは、私の組織では (全体的に考えても) 悪い形式と考えられているため、選択行の数にstd_logica を使用しました。入力ジェネリックに基づいてstd_logic_vectorの長さを調整する必要があります。std_logic_vector2 番目のジェネリックを使用せずにこれを行う方法はありますか? この投稿を見たことがありますが、ジェネリックを扱っていません。この投稿では、ジェネリックを完全に排除するか、ログ値をジェネリックとして使用します。これは、将来のユーザーにとって直感的ではありません (またINPUT、2 の累乗でない場合に問題が発生する可能性があります)。
以下の宣言SHIFT_CNTは間違いなく間違っています。2 番目のジェネリックを使用せずにエンティティ宣言で長さを自動的に生成する方法はありますか?
entity BarrelShifter is
generic ( NUMBITS : integer :=8);
Port ( INPUT : in std_logic_vector (NUMBITS-1 downto 0);
OUTPUT : out std_logic_vector (NUMBITS-1 downto 0);
SHIFT_CNT : in std_logic_vector ((NUMBITS-1)'length downto 0)
);
end BarrelShifter;