避免在VHDL中使用inout

时间:2016-03-06 19:46:03

标签: vhdl inout

我想避免在以下代码中使用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   : 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;

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

使用信号作为C(0)和C(1)的中间体。

Inouts只能用于硬件io端口,如gpio端口或内存总线上的数据端口。

答案 2 :(得分:4)

有两种解决方案:

  1. 使用缓冲模式而不是inout。

    var exampleStringValue = 'HELLO';
    window[exampleStringValue] = exampleStringValue;
    console.log(window.HELLO);
    
    // or, since window is the global context in the browser
    console.log(HELLO)
    

    某些工具在此模式下存在问题。

  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   : 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;