2016-12-04 12 views
0

このコードではこのエラーが発生します。ter.vhd(31):インデックス付きの名前(タイプieee.std_logic_1164.STD_ULOGIC)をタイプstd.STANDARD.BOOLEANとして解決できません。 これを修正する方法はありますか? 私はsincerly何が間違っている取得しないで、Web検索で試したが、何も。ありがとうございます。 VHDLによるインデックス名の問題

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 

ENTITY inverter IS 
GENERIC(size: integer); 
PORT ( 
    a : IN std_ulogic_vector(size-1 DOWNTO 0); 
    b : OUT std_ulogic_vector(size-1 DOWNTO 0); 
    carry : OUT std_ulogic; 
    mode : IN std_ulogic 
    ); 
END ENTITY inverter; 


ARCHITECTURE behavioral OF inverter IS 
COMPONENT alu IS 
GENERIC(size: integer); 
Port (X : in std_ulogic_VECTOR (size-1 downto 0); 
     Y : in std_ulogic_VECTOR (size-1 downto 0); 
     SUM : out std_ulogic_VECTOR (size-1 downto 0); 
     CARRY : out std_ulogic); 
end COMPONENT; 

SIGNAL z, c : std_ulogic_VECTOR(size-1 downto 0); 

BEGIN 
start: process(a,mode) 
begin 
z <= (others => '0'); 

IF a(size-1) THEN 
c <= not a; 
z(0) <= '1'; 
ELSIF (mode = '1') THEN 
c <= not a; 
z(0) <= '1'; 
ELSE 
c <= a; 
END IF; 
end process; 
alu1: alu 
generic map(size) 
PORT MAP(x => c, y => z, sum => b, carry => carry); 


END ARCHITECTURE behavioral; 
+0

ブール値の配列として 'a'を宣言すると、それを動作させる1つの方法になりますが、他のものも修正する必要があります。あるいは、std_ulogicの値がどのように正常にテストされているかを知ることができます。実際には、すでに同じプロセスでその例があります。 –

+0

@BrianDrummond ** IF IF(size-1)THEN **の文は正しいですか?私は前にこのようなことに遭遇していません。これは "(size-1)がTRUEの場合"に変換されますか?また、サイズ変数を初期化してはいけませんか? – Arkoudinos

+0

'if then'が問題ありません。したがって、 'a(size-1)THEN'が正しい場合は、' a'がブール値の配列である可能性がありますが、現在はそうではありません。 VHDL-2008で暗黙の変換演算子を使用している場合は、物理的なレベルが「0」と「1」、論理レベルが「真」と「偽」の区別がぼやけているので個人的に嫌いですあなたが負の論理を扱っているなら、ばかげて混乱するコードを生成します。 –

答えて

0

参照IEEE STD 1076年から2008年、10.8 if文の実行用に文

場合、もし後に指定された条件、およびELSIF後に指定された条件は、治療(連続で評価されます最後のelseはelsif TRUEとなります)、TRUEに評価されるか、すべての条件が評価されてFALSEになるまで続きます。 1つの条件がTRUEと評価された場合、対応する一連のステートメントが実行されます。 ...

TRUEとFALSEは、BOOLEAN型の値として16.3パッケージSTANDARDで定義されています。

これは、TRUEまたはFALSEのいずれかに評価される条件の中の式を必要とします。 BOOLEAN(9.2.3の関係演算子を参照)を返す等価演算子( "=")を使用してこれを行うことができます。

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 

ENTITY inverter IS 
GENERIC(size: integer); 
PORT ( 
    a : IN std_ulogic_vector(size-1 DOWNTO 0); 
    b : OUT std_ulogic_vector(size-1 DOWNTO 0); 
    carry : OUT std_ulogic; 
    mode : IN std_ulogic 
    ); 
END ENTITY inverter; 


ARCHITECTURE behavioral OF inverter IS 
COMPONENT alu IS 
GENERIC(size: integer); 
Port (X : in std_ulogic_VECTOR (size-1 downto 0); 
     Y : in std_ulogic_VECTOR (size-1 downto 0); 
     SUM : out std_ulogic_VECTOR (size-1 downto 0); 
     CARRY : out std_ulogic); 
end COMPONENT; 

SIGNAL z, c : std_ulogic_VECTOR(size-1 downto 0); 

BEGIN 
start: process(a,mode) 
begin 
z <= (others => '0'); 

IF to_bit(a(size-1)) = '1' THEN 
c <= not a; 
z(0) <= '1'; 
ELSIF (mode = '1') THEN 
c <= not a; 
z(0) <= '1'; 
ELSE 
c <= a; 
END IF; 
end process; 
alu1: alu 
generic map(size) 
PORT MAP(x => c, y => z, sum => b, carry => carry); 


END ARCHITECTURE behavioral; 

が正常に(コンパイル)を解析:

あなたのコードでは、ブール条件を提供するように変更します。

関連する問題