0

私のコンパイラは私にこれらのエラーを与えています:

# エラー: COMP96_0305: SUBONE_MODULE_VHDL.vhd : (93, 23): これらの実際の関数 "TO_INTEGER" が見つかりません。

# エラー: COMP96_0138: SUBONE_MODULE_VHDL.vhd : (93, 23): 配列オブジェクトへの参照のインデックス タイプは、その範囲タイプと互換性がありません。**

library IEEE;
use IEEE.STD_LOGIC_1164.all;

use IEEE.NUMERIC_STD.all;


entity SUBONE_MODULE_VHDL is
 port(
     addr : in STD_LOGIC_VECTOR(4 downto 0);
     clk : in STD_LOGIC;
     dout : out STD_LOGIC_VECTOR(4 downto 0)
     );
end SUBONE_MODULE_VHDL;


architecture SUBONE_MODULE_VHDL of SUBONE_MODULE_VHDL is     

type ROM_Array is array (0 to 31) 
of std_logic_vector(4 downto 0);


constant Content: ROM_Array := (
    0 => "10011",       -- Suppose ROM has 
    1 => "00000",       -- prestored value
    2 => "00001",       -- like this table
    3 => "00010",               --
    4 => "00011",       --
    5 => "00100",               --
    6 => "00101",       --
    7 => "00110",               --
    8 => "00111",               --
    9 => "01000",               --
   10 => "01001",       --
   11 => "01010",           --
   12 => "01011",           --
   13 => "01100",       --
   14 => "01101",       --
   15 => "01110",       --
   16 => "01111",       --
   17 => "01110",       --
   18 => "01110",       --
   19 => "01110",       --
   20 => "01110",       --
   21 => "00000",       --
   22 => "00001",       --
   23 => "00010",       --
   24 => "00011",       --
   25 => "00100",       --
   26 => "00101",       --
   27 => "00110",       --
   28 => "00111",       --
   29 => "01000",       --
   30 => "01001",       --
   31 => "01010",       --
 OTHERS => "00000"
);       

begin
    process(clk, addr) 
    variable addr : integer := 0;   
    begin
        if( clk'event and clk = '1' ) then
            dout <= Content(TO_INTEGER(addr));
        end if;
    end process;

end SUBONE_MODULE_VHDL;
4

2 に答える 2

1

ポートaddrは であり、std_logic_vectorに直接キャストすることはできませんintegerunsignedまたはsigned最初 にキャストします。

dout <= Content(TO_INTEGER(SIGNED(addr)));

addr編集:名前付き変数と同じ名前のポートとの競合もあります。したがって、変数の名前を eg に変更addr_varすると、問題が解決します。この場合、型キャストは必要ありません。

変数 addr_var : 整数 := 0;
...
dout <= Content(addr_var);

2 つのソリューションのどちらが適切かは、 にaddrアクセスするときにどちらを使用するつもりだったかによって異なりますCONTENT

一般に、ポート、信号、または変数にまったく同じ名前を再利用することはお勧めできません。

于 2013-06-15T13:10:22.103 に答える