1

私は BIST エンジンの記述を作成していて、上司から Verilog から VHDL に移行するように依頼されました。私は VHDL に非常に慣れていないため、コード内のアドレス レジスタに与える正しいデータ型がわかりません。ほとんどの場合、アドレスは配列へのインデックス付けに使用されます。

data : std_logic_vector (2**W-1 downto 0);
...
output = data(addr);

ただし、場合によっては、ビットごとの演算を実行する必要があります (たとえば、アドレスの最下位の 1 を見つける次のコード)。

least_one(0) <= addr(0);
PRIORITY_ENCODER : for i in 1 to (W-1) generate
    least_one(i) <= addr(i) and not or_reduce(addr(i-1 downto 0));
    end generate PRIORITY_ENCODER;
least_one(W) <= not or_reduce(addr);

最後に、アドレスがオーバーフローした場合 (つまり、1111+1 = 0、および 0-1 = 1111) に問題なくラップアラウンドすることにも依存しています。

では、これらすべての用途を考えると、アドレスにはどのデータ型またはサブタイプを指定すればよいでしょうか? 整数と関連する型を使用すると、ビット演算を実行するとエラーが発生します。

ncvhdl_p: *E,APNPFX (filename,17|20): can not make sense of P(...)

std_logic_vector または類似のものを使用すると、アドレスを配列インデックスとして使用しようとするとエラーが発生します。

ncvhdl_p: *E,INTYMM (filename,52|17): array index type mismatch [6.4]

私はここで勝てない状況にあるようです。使用するデータ型は? ソリューションは合成可能でなければならないことに注意してください。ありがとう

4

2 に答える 2

2

ビットごとのアクセスとラッピング動作が必要です。

  • addr基本的にベクトルunsignedにします。

次に、整数としてアクセスする必要があります。

  • 1行だけ整数として必要な場合は、to_integerその行だけで呼び出しを使用してください。
  • 複数の場所で整数として必要な場合は、別の信号を作成して「シャドウ」し、アーキテクチャに連続的な割り当てを配置します

このような:

signal addr_int:natural;
....
addr_int <= to_integer(addr);
于 2013-03-08T12:03:18.040 に答える
1

この場合、unsignedタイプを使用します。

これは、一般的なビット アクセスの操作に慣れている方法と非常によく似てstd_logic_vectorいますが、必要に応じて、アドレスに対して算術演算を実行し、型との間で簡単に変換することもできますintegerstd_logic_vectorさらに、「恐ろしい」std_logic_unsignedパッケージで感覚を汚しません。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

...

architecture myarch of myent is
   signal address : unsigned(numbits-1 downto 0);

   ...

begin

-- as an example
addr_counter : process(sysclk, reset)
begin
   if reset = '1' then
      address <= (others => '0');
   elsif rising_edge(sysclk) then
      address <= address + 1;
   end if;
end process addr_counter;
...
于 2013-03-07T20:26:06.153 に答える