1

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);

しかし、これらの接続を行う正しい方法はまだわかりませんでした。

4

1 に答える 1

2

これを報告しているツールはどれですか?

ザイリンクスXSTレポート

barrel_shifter.vhd" Line 20: Actual for formal port data_in is neither a static 
name nor a globally static expression

これは、式がマルチプレクサにstd_logic_vector(unsigned(data_in) srl 1)マップされているときに問題を特定するのに役立ちます。data_in一時的な信号を宣言する

architecture Structural of barrel_shifter is

    signal q    : STD_LOGIC_VECTOR (N-1 downto 0);
    signal temp : STD_LOGIC_VECTOR (N-1 downto 0);
begin

    temp <= std_logic_vector(unsigned(data_in) srl 1);

    connections: for i in 0 to N-1 generate
        mux: entity work.mux(Behavioral) generic map(N) 
                                         port map(temp, shift, q(i));
    end generate connections;
    ...
end

問題を解決します。

于 2012-12-17T15:01:32.590 に答える