Nビットバレルシフターを実現しています。
ここに私のコンポーネントがあります:
entity barrel_shifter is
Generic ( N : integer := 4);
Port ( data_in : in STD_LOGIC_VECTOR (N-1 downto 0);
shift : in STD_LOGIC_VECTOR (integer(ceil(log2(real(N))))-1 downto 0); -- log2 of N => number of inputs for the shift
data_out : out STD_LOGIC_VECTOR (N-1 downto 0));
end barrel_shifter;
私の目的のために、N ビットのマルチプレクサも作成しました。これがそのコードです。
entity mux is
Generic ( N : integer := 4);
Port ( data_in : in STD_LOGIC_VECTOR (N-1 downto 0);
sel : in STD_LOGIC_VECTOR (integer(ceil(log2(real(N))))-1 downto 0); -- log2 of N => number of inputs for the shift
data_out : out STD_LOGIC);
end mux;
architecture Behavioral of mux is
begin
data_out <= data_in(to_integer(unsigned(sel)));
end Behavioral;
サーキュラー バレル シフターを実現するには、これらの N マルチプレクサーをさまざまな方法で接続する必要があります。例は、ここの 2 ページの図 1 にあります。ご覧のとおり、IN0 は D0 マルチプレクサ入力に 1 回だけ接続されています。次に IN0 が D1 マルチプレクサ入力に接続されたときなど... (他の入力についても同じロジックです)
しかし、どうすればVHDLでそのようなことを実現できますか? 入力として STD_LOGIC_VECTOR がなかった場合は簡単ですが、汎用バレル シフター (汎用マップ コンストラクトを使用) を作成する必要があるため、汎用 N の値がわからないため、各ワイヤを手動で接続することはできません。 .
私のバレルシフターエンティティでこれを試しました:
architecture Structural of barrel_shifter is
signal q : STD_LOGIC_VECTOR (N-1 downto 0);
begin
connections: for i in 0 to N-1 generate
mux: entity work.mux(Behavioral) generic map(N) port map(std_logic_vector(unsigned(data_in) srl 1), shift, q(i));
end generate connections;
data_out <= q;
end Structural;
しかし、それは単に機能しません (「正式なシグナルに関連付けられた演算子の実際の結果、シグナル 'data_in' はシグナルではありません。(LRM 2.1.1)」)。次のように、変数とシグナルを使用してみました。
data_tmp := data_in(i downto 0) & data_in(N-i downto 1);
しかし、これらの接続を行う正しい方法はまだわかりませんでした。