3

私は VHDL を学習していますが、境界チェック例外を満たすために記述しようとしているコードに問題があります。

これが私の基本的な要約コードです。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
use IEEE.NUMERIC_STD.ALL;
use ieee.std_logic_unsigned.all; 
...
port(
Address: in std_logic_vector(15 downto 0);
...
constant SIZE : integer := 4096;
variable addr: integer range 0 to SIZE-1 := 0;
...
process ... 
addr := conv_integer(Address) and (SIZE-1); --error here

私が得るエラーメッセージは

src/memory.vhd:37:35: 演算子「and」の関数宣言がありません

基本的に、私の目標は 16 ビット アドレス バスを作成し、メモリを 4096 バイトだけで参照することです。この奇妙なエラーが発生するのはなぜですか? ライブラリインクルードか何かがありませんか?

4

4 に答える 4

3

std_logic_arith 最初: and を 使用しないでくださいnumeric_std。そして、あなたは必要ありませんstd_logic_arith

整数に対してビットごとの AND を実行することはできないため、次のようにする必要があります。

addr := Address and to_unsigned(SIZE-1, Address'length);

しかし、おそらく SIZE が 2 のべき乗であることを保証したいでしょう。

私がよく行うのは、定数をビット単位で作成し、そこから作業を進めることです。

constant mem_bits : integer := 16;
constant SIZE     : integer := 2**16;

それから

addr := Address(mem_bits-1 downto 0);
于 2012-05-02T09:47:02.270 に答える
2

andその機能を含む標準ライブラリがあるかもしれませんが、整数に対して定義されているとは思いません。

あなたの住所を保持してみませんstd_logic_vectorか?アドレスに関しては、特定のビットを直接見て簡単にデコードできるようにしたいことがよくあるので、それはかなり理にかなっていると思います。

を作成addrstd_logic_vector(11 downto 0)、 の最下位 12 ビットaddressをそれに割り当てます。これにより、上位 4 バイトが無視され、4096 バイトのスペースが得られます (8 ビット データバスの場合)。

于 2012-04-30T18:51:09.930 に答える
2

そして、整数には意味がありません。整数は範囲内の数値ですが、それ自体を実装する標準的な方法はありません。つまり、バイナリで定義済みの表現はありません。

以下の構文のようなものを使用できます。

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;





entity testand is
    generic (nBITS:integer:=32);
    port (
        i:in integer;
        a:in std_logic_vector(nBITS-1 downto 0);
        o:out std_logic_vector(nBITS-1 downto 0));
end entity;



architecture beh of testand is

signal v:std_logic_vector(a'length-1 downto 0);

begin

    v<=std_logic_vector(conv_unsigned(i,o'length));

    o<=v and a;


end architecture;
于 2012-05-02T12:22:02.710 に答える