1

私はVHDL言語が初めてなので、ばかげた質問かもしれませんが、この問題の参照は見つかりませんでした。そのため、5ビットの特定の組み合わせを他の組み合わせに変換するビットコンバーターに取り組んでいます。問題は、5 ビットを 1 つの条件に入れる方法がわからない case ステートメントにあります。

entity CONV is
    port (ia, ib, ic, id, ie:in Bit; oa, ob, oc, od, oe:out Bit);
end CONV;

 architecture BEH of CONV is
 signal t: bit;
  begin
  case ia & ib & ic & id & ie is
    when  "00010"  =>  t <= "00011";
    when  "00101"  =>  t <= "00101";
    when  "01000"  =>  t <= "00110";
    when  "01011"  =>  t <= "01001";
    when  "01110"  =>  t <= "01010";     
    when  "10001"  =>  t <= "01100";
    when  "10100"  =>  t <= "10001";
    when  "10111"  =>  t <= "10010";
    when  "11010"  =>  t <= "10100";
    when  "11101"  =>  t <= "11000";
    when  others   =>  t <= "00000";
  end case;
t => oa & ob & oc & od & oe;
  end beh;
4

3 に答える 3

1
entity CONV is
    port (
        ia, ib, ic, id, ie: in  Bit;
        oa, ob, oc, od, oe: out Bit
    );
end CONV;

architecture BEH of CONV is
    signal t: bit_vector(0 to 4);
    subtype fivebit is bit_vector(0 to 4);
begin
EVALUATE:
    process (ia, ib, ic, id, ie)
    begin
        case fivebit(ia & ib & ic & id & ie) is
            when  "00010"  =>  t <= "00011";
            when  "00101"  =>  t <= "00101";
            when  "01000"  =>  t <= "00110";
            when  "01011"  =>  t <= "01001";
            when  "01110"  =>  t <= "01010";     
            when  "10001"  =>  t <= "01100";
            when  "10100"  =>  t <= "10001";
            when  "10111"  =>  t <= "10010";
            when  "11010"  =>  t <= "10100";
            when  "11101"  =>  t <= "11000";
            when  others   =>  t <= "00000";
        end case;
    end process;
OUTPUT:
    (oa , ob , oc , od , oe) <= t;
end architecture BEH;

case ステートメントで評価される式は、ローカルに静的なサブタイプを持つオブジェクトの名前 (Russell の vector_in)、ローカルに静的なインデックスを持つインデックス名、ローカルに静的な範囲を持つスライス名、返す関数呼び出しのいずれかでなければなりません。ローカルに静的なサブタイプ、またはローカルに静的な型マークを使用した修飾式または型変換 (表示)。

その考えは、アナライザー (局所的に静的は分析時間を意味する) が、式内の要素の数とその型を決定して、ケース カバレッジを決定できるということです。

同時シグナル割り当ての集約ターゲットは、集約の要素 (oa 、 ob 、 oc 、 od 、 oe) を右辺の t の要素 (ビット) に個別に関連付けます。各要素の関連付けは 1 回だけ行うことができます。

case ステートメントは、順次ステートメントであるため、処理 (並行ステートメント) に含まれます。また、混乱を避けるために、順次および同時の両方の信号割り当てステートメントがあります。VHDL は並行ステートメントを使用して並列処理を提供します。

テストベンチの場合:

entity conv_test is
end entity;

architecture test of conv_test is
    signal ia, ib, ic, id, ie:      bit;
    signal oa, ob, oc, od, oe:      bit;
    signal t:                       bit_vector (0 to 4);
    signal input:                   bit_vector (0 to 4);
begin
DUT:
    entity work.CONV
        port map (
            ia => ia, ib => ib, ic => ic, id => id, ie => ie,
            oa => oa, ob => ob, oc => oc, od => od, oe => oe
        )
    ;
TEST:
    process
    begin
        wait for 10 ns;  -- bit defaults to '0', others case
        (ia, ib, ic, id, ie) <= bit_vector'("00010");  -- first case
        wait for 10 ns;
        (ia, ib, ic, id, ie) <= bit_vector'("00101"); 
        wait for 10 ns;
        (ia, ib, ic, id, ie) <= bit_vector'("01000"); 
        wait for 10 ns;
        (ia, ib, ic, id, ie) <= bit_vector'("01011"); 
        wait for 10 ns;
        (ia, ib, ic, id, ie) <= bit_vector'("01110"); 
        wait for 10 ns;
        (ia, ib, ic, id, ie) <= bit_vector'("10001"); 
        wait for 10 ns;
        (ia, ib, ic, id, ie) <= bit_vector'("10100"); 
        wait for 10 ns;
        (ia, ib, ic, id, ie) <= bit_vector'("10111"); 
        wait for 10 ns;
        (ia, ib, ic, id, ie) <= bit_vector'("11010"); 
        wait for 10 ns;
        (ia, ib, ic, id, ie) <= bit_vector'("11101"); 
        wait for 10 ns;
        (ia, ib, ic, id, ie) <= bit_vector'("11111"); -- others case
        wait for 10 ns;
        wait;                               -- one time only
    end process;
SIM_INPUT:
    input <= (ia & ib & ic & id & ie); -- for ease of viewing in waveform display
RESULT:
    t <= (oa & ob & oc & od & oe);
end architecture;

コンバージョンをテストできます:

テストベンチ波形出力

TEST プロセスは、以下を使用して、集約 (ia、ib、ic、id、ie) の代わりに入力に割り当てて、はるかに簡単に書き直すことができることに注意してください。

(ia , ib , ic , id , ie) <= input;

SIM_INPUT ステートメントで:

TEST:
    process
    begin
        wait for 10 ns;  -- bit defaults to '0', others case
        input <= "00010";  -- first case
        wait for 10 ns;
        input <= "00101"; 
        wait for 10 ns;
        input <= "01000"; 
        wait for 10 ns;
        input <= "01011"; 
        wait for 10 ns;
        input <= "01110"; 
        wait for 10 ns;
        input <= "10001"; 
        wait for 10 ns;
        input <= "10100"; 
        wait for 10 ns;
        input <= "10111"; 
        wait for 10 ns;
        input <= "11010"; 
        wait for 10 ns;
        input <= "11101"; 
        wait for 10 ns;
        input <= "11111"; -- others case
        wait for 10 ns;
        wait;                               -- one time only
    end process;
SIM_INPUT:
    (ia, ib, ic, id, ie) <= input; -- for ease of viewing in waveform display

そして同じ波形表示を得る

于 2013-10-04T23:33:38.753 に答える
1

@Russellが言うように、すべての入力をビットベクトルに入れることができます。次に、ビット ベクトルの各ビットは入力を表します。これにより、作業がはるかに簡単になります。

また、caseステートメントはシーケンシャル ステートメントです (つまり、プロセスプロシージャ、または関数に配置する必要があります)。

entity CONV is
  port (inp : in  Bit_Vector(4 downto 0);    -- [ai, bi, ci, di, ei]
        outp: out Bit_Vector(4 downto 0));   -- [ao, bo, co, do, eo]
end CONV;

architecture BEH of CONV is
begin
  process (inp)
  begin           
    case inp is 
      when  "00010"  =>  outp <= "00011";
      when  "00101"  =>  outp <= "00101";
      when  "01000"  =>  outp <= "00110";
      when  "01011"  =>  outp <= "01001";
      when  "01110"  =>  outp <= "01010";     
      when  "10001"  =>  outp <= "01100";
      when  "10100"  =>  outp <= "10001";
      when  "10111"  =>  outp <= "10010";
      when  "11010"  =>  outp <= "10100";
      when  "11101"  =>  outp <= "11000";
      when  others   =>  outp <= "00000";
    end case;
  end process;
end beh;

可読性やその他の理由で単一ビットを本当に使用したい場合は、プロセスの外でそれらを連結して中断するだけです。
ピン配置の場合、必要なのは、などに接続aiすることだけです。inp[4]biinp[3]

于 2013-10-05T02:53:13.353 に答える