-1

Nから2^Nのデコーダーを作成していて、いくつかのエラーに直面しています。私を助けてください。

  • Naddr-整数のアドレスビット数

  • addr-アドレスビットstd_logic_vector

  • fbd-(整数、std_logic_vector)-2進数から10進数に変換する関数

  • fpower-(整数)-2^Nを提供する関数

コード:

Architecture deco of Deco is   
begin  

process(addr, En)  
  variable a : integer;  
begin  
  a := fbd(Naddr, addr);  
  if(En = '1') then  
    q <= (a => '1', others => '0'); --- error1           
  elsif(En = '0') then  
    q <= (fpower(Naddr)-1 downto 0 => '0');  
  end if;  
end process;  

end deco;

私が得るエラーは次のとおりです。

1)エラー(10318):Deco.vhd(33)でのVHDL集約エラー:選択は一定でなければなりません(error1)

2)エラー:最上位のユーザー階層を詳しく説明できません

4

2 に答える 2

1

これは正しいVHDLであり(Naddrが一定であると仮定)、シミュレーションで機能します。(これは良いVHDLではありませんが、それは別の問題です)

ただし、現在の合成ツールでは動作するハードウェアに変換できません。1ビットを「1」に配線したいが、回路が完成して電源が入るまで、どのビットであるかわからないと考えてください。ハードウェアの一部はどのように見えますか?単純な論理要素を使用して紙に描きます。

あきらめる?

次に、各ビットの「if」条件に応じて、任意のビットを「1」に設定できる単純な回路を設計します。

process(addr, En)
variable a : integer;
begin
    a := fbd(Naddr, addr);  
    if En = '1' then  
       q <= (others => '0');
       for i in q'range loop
          if i = a then
             q(i) <= '1';
          end if;
       end loop;
    end if;
end process;

これはすべて単一のプロセス内で行われるため、Qには複数の割り当てがあるにもかかわらず、ここではQのドライバーは1つだけです。

また、クロックプロセスの利点を学ぶ必要がありますが、この回答では学びません。

于 2013-03-24T13:37:03.190 に答える
0

行で:

q <= (a => '1', others => '0'); --- error1

qがビットベクトルであり、このステートメントが実行されているときの「a」の値が4であるとします。次に、ビット4を除くすべてのビットを0にします。「q [4]=1」にします。ただし、VHDLではビットの位置を変数として指定することはできません。その値は、コンパイル時に知る必要があります。したがって、これは定数または汎用パラメーターにすることができますが、シグナルまたは変数にすることはできません。

あなたはCプログラミングのようにVHDLに近づいているようです...単純なデコーダーを作成するためにログや整数などを使用するのは悪い考えです。単純な8〜256ビットデコーダーについては、このリンクを参照してください

于 2013-03-24T13:34:39.123 に答える