2017-07-02 27 views
0

私は各ステージで入力信号の偶数/奇数ラインを選択する多段マルチプレクサを実装しようとしています。たとえば、私は8つの入力[a(0)a(2)a(3)a(4)a(5)a(6)a(7)]と3つの入力信号[s )s(2)]。マルチプレクサは、s(0)= 0の場合、最初のステージは[a(0)a(2)a(4)a(6)]を通過し、そうでなければ奇数エレメント[a 3)a(5)a(7)]。私はこのような奇数と偶数の要素に入力信号をスライスしようとしていますこれを行うには:VHDLの偶数/奇数要素をスライス

entity mux is 
port(
    s  : in std_logic_vector(0 to 3); 
    vline : in std_logic_vector(0 to 8); 
    output : out std_logic 
    ); 
end mux; 

architecture multistage of mux32 is 

signal level0even : std_logic_vector(0 to 3); 
signal level0odd : std_logic_vector(0 to 3); 
signal temp0  : std_logic_vector(0 to 3); 
signal level1even : std_logic_vector(0 to 1); 
signal level1odd : std_logic_vector(0 to 1); 
signal temp1  : std_logic_vector(0 to 1); 
signal level2even : std_logic; 
signal level2odd : std_logic; 
signal temp2  : std_logic; 

begin 
    -- Slicing level0 
    for k in 0 to 3 loop 
     level0even(k) <= vline(2*k); 
     level0odd(k) <= vline(2*k+1); 
    end loop; 

with s(0) select 
    temp0 <= level0even when "0", 
      level0odd when "1", 
      "----" when others; 

    -- Slicing level1 
    for k in 0 to 1 loop 
     level1even(k) <= temp0(2*k); 
     level1odd(k) <= temp0(2*k+1); 
    end loop; 

with s(1) select 
    temp1 <= level1even when "0", 
      level1odd when "1", 
      "----" when others; 

[...] 

end multistage; 

をしかし、以前のコードを記述する際のMultisimは私にレベル0のスライスでエラー「不正同時声明」を与えます。問題は、ベクトルの偶数/奇数要素をスライスするよりエレガントでコンパクトな方法はありますか?

さらに、より大きな入力ベクトルに使うために、パラメトリックな方法でコードを書こうとしていますが、私は一時的なベクトル(levelxodd/even)を宣言する必要があるので、一つずつ。誰にどのようにこれを行うにはどのような提案がありますか?

+0

あなたのコードは[、最小限の完全かつ検証可能な例]ではありません(https://stackoverflow.com/help/mcve)が存在していないだけで構文エラーは、[...]がありますループ・ステートメントは、プロセス・ステートメントまたはサブプログラムのいずれかに進む順次ステートメントです。どちらの答えも、それを知っている人からのものであり、どちらも解決策が証明されていないことに注意してください。 – user1155120

+0

'temp1 <= [...]" ---- "他の場合は';あなたが「気にしないで」使っていることを達成したいと思いますか?ところで "0" - > "0"。最初は 'std_logic_vector'、2番目は' std_logic'です。 – JHBonarius

+0

P.あなたは2つの質問をしていますが、それは全く異なる回答をします。 IMHOを分ける方が良い。 しかし、なぜマルチプレクサツリー全体をVHDLで構築していますか?あなたはそれがFPGAで完全に異なって実装されることを知っていますか? – JHBonarius

答えて

0

これは原則として良好な解決策です。しかし、... forループは、の連続文です - のプロセスの内部にある必要があります。また、VHDL ジェネリックおよび/または配列属性についてパラメータ化可能にすることができます。

+0

私はより広範囲になることができましたが、アイドルの瞬間に私の電話に答えました。 –

0

あなたは要素の選択を作成するための関数を書くことができます:

function even(slv : std_logic_vector) return std_logic_vector is 
    variable temp : std_logic_vector(slv'length/2 downto 0); 
begin 
    for i in slv'range loop 
    if (i mod 2 = 0) then 
     temp(i/2) := slv(i); 
    end if; 
    end loop; 
    return temp; 
end function; 
0

ので、あなたは、マルチプレクサを必要としています。実際には配列です。 generateを使用して並行ループ文を書くことができます。例:

array_of_muxes: for k in 0 to 1 generate 
    mux_even: level1even(k) <= level0even(2*k) when s(0)='0' else level0odd(2*k); 
    mux_odd: level1odd(k) <= level0even(2*k+1) when s(0)='0' else level0odd(2*k+1); 
end generate; 
関連する問題