2

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

3 回答 3

6

如果目的只是将中间值C作为输出提供给模块,则可以避免使用不同的选项inout

如果工具支持 VHDL-2008,您可以简单地更改inoutout,然后C仍然可以在内部读取。

如果工具仅支持 VHDL-2002,那么您仍然可以将 更改inoutout,但您需要一个内部信号,例如:

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芯片内部不支持。

于 2016-03-06T20:13:30.763 回答
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
    
于 2016-03-06T20:22:42.953 回答
4

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

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

于 2016-03-06T20:01:15.617 回答