2016-03-06 6 views
2

Я хочу избежать использования inout по следующему коду.Избегайте использования inout в VHDL

Есть ли способ, я могу это сделать? Например, сигнал помощи?

entity LA_Unit is 
    Port (Cin : in STD_LOGIC; 
      P : in STD_LOGIC_VECTOR (3 downto 0); 
      G : in STD_LOGIC_VECTOR (3 downto 0); 
      C3 : out STD_LOGIC; 
      C : inout STD_LOGIC_VECTOR (2 downto 0)); 
end LA_Unit; 

architecture Behavioral of LA_Unit is 
begin 
    C(0) <= (P(0) and Cin) xor G(0); 
    C(1) <= (P(1) and C(0)) xor G(1); 
    C(2) <= (P(2) and C(1)) xor G(2); 
    C3 <= (P(3) and C(2)) xor G(3); 
end Behavioral; 
+0

Пожалуйста, отметьте один из ответов как «Решение», если один решить вашу проблему. – Paebbels

ответ

4

Использовать сигнал в качестве промежуточного элемента для C (0) и C (1).

Inouts следует использовать только для портативных портов io, таких как порт gpio или порт данных на шине памяти.

7

Если целью является просто предоставить промежуточное значение C в качестве выхода для модуля, существуют различные варианты, чтобы избежать inout.

Если инструменты поддерживают VHDL-2008, вы можете просто изменить inout на out, а затем C все еще можно прочитать внутренне.

Если инструменты поддерживают только VHDL-2002, то вы можете изменить inout к out, но тогда нужен внутренний сигнал как:

architecture Behavioral of LA_Unit is 
    signal C_int : std_logic_vector(2 downto 0); 
begin 
    C_int(0) <= (P(0) and Cin) xor G(0); 
    C_int(1) <= (P(1) and C_int(0)) xor G(1); 
    C_int(2) <= (P(2) and C_int(1)) xor G(2); 
    C3  <= (P(3) and C_int(2)) xor G(3); 
    C  <= C_int; 
end Behavioral; 

Как xvan также писать, использовать только inout для верхнего уровня портов на чипе или для использования в специальных тестовых стендах, поскольку inout не поддерживаются внутри чипа.

4

Есть 2 решения:

  1. Использование режима буфера вместо InOut.

    entity LA_Unit is 
        Port (Cin : in STD_LOGIC; 
          P : in STD_LOGIC_VECTOR (3 downto 0); 
          G : in STD_LOGIC_VECTOR (3 downto 0); 
          C3 : out STD_LOGIC; 
          C : buffer STD_LOGIC_VECTOR (2 downto 0)); 
    end LA_Unit; 
    
    architecture Behavioral of LA_Unit is 
    begin 
        C(0) <= (P(0) and Cin) xor G(0); 
        C(1) <= (P(1) and C(0)) xor G(1); 
        C(2) <= (P(2) and C(1)) xor G(2); 
        C3 <= (P(3) and C(2)) xor G(3); 
    end Behavioral; 
    

    Некоторые инструменты имеют проблемы с этим режимом.

  2. сигнал промежуточный:

    entity LA_Unit is 
        Port (Cin : in STD_LOGIC; 
          P : in STD_LOGIC_VECTOR (3 downto 0); 
          G : in STD_LOGIC_VECTOR (3 downto 0); 
          C3 : out STD_LOGIC; 
          C : out STD_LOGIC_VECTOR (2 downto 0) 
    ); 
    end entity; 
    
    architecture rtl of LA_Unit is 
        signal C_i : STD_LOGIC_VECTOR(3 downto 0); 
    begin 
        C_i(0) <= (P(0) and Cin) xor G(0); 
        C_i(1) <= (P(1) and C_i(0)) xor G(1); 
        C_i(2) <= (P(2) and C_i(1)) xor G(2); 
        C_i(3) <= (P(3) and C_i(2)) xor G(3); 
        C <= C_i(2 downto 0); 
        C3 <= C_i(3); 
    end architecture 
    
+0

В следующем примере порт 'C' должен иметь режим' out'. –

+0

@MartinZabel Исправлено: :). – Paebbels

 Смежные вопросы

  • Нет связанных вопросов^_^