首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VHDL:什么时候可以用端口作为信号?

VHDL:什么时候可以用端口作为信号?
EN

Stack Overflow用户
提问于 2018-09-27 10:18:31
回答 1查看 1.5K关注 0票数 2

请帮助我理解什么时候端口可以用VHDL作为信号。

我之所以问这个问题,是因为我使用端口在Xilinx ISim中将数据从一个组件移动到另一个组件,但是在它的目的地数据仍然没有定义。如果我是通过连接端口到端口来推断数据传输,就像下面的第一个和第三个例子一样,如果没有明确的赋值语句,我的问题可能会引起。

我相信这是有效地使用来自实体的端口作为连接到包含组件的端口的信号。

代码语言:javascript
复制
-- Example 1 - Use ports instead of signals
entity user is
  port(
    data_bus   : inout std_logic_vector(15 downto 0);
    address_bus: in    std_logic_vector(12 downto 0)
  );
end user;    
architecture Behavioral of user is
  -- Component Port Definitions
  component memory
    port(
    mem_data_bus   : inout std_logic_vector(15 downto 0);
    mem_address_bus: in    std_logic_vector(12 downto 0)
    );
  end component memory;
begin
  -- some logic
  -- Instantiate thing
  a_memory : memory
    port map(
      mem_data_bus     => data_bus,
      mem_address_bus  => address_bus
    );
end architecture;

我不确定这是否正确。是否需要额外的信号将组件连接在一起,还是可以使用实体端口?(我意识到连接到inout端口可能有问题,但这个问题是关于何时端口可以用作信号)。

代码语言:javascript
复制
-- Example 2 - connect ports to multiple components
entity user is
  port(
    data_bus   : inout std_logic_vector(15 downto 0);
    address_bus: in    std_logic_vector(12 downto 0)
  );
end entity user;
architecture Behavioral of user is
  -- Component Port Definitions
  component memory_a
    port(
    ma_data_bus   : inout std_logic_vector(15 downto 0);
    ma_address_bus: in    std_logic_vector(12 downto 0)
    );
  end component memory_a;
  component memory_b
    port(
    mb_data_bus   : inout std_logic_vector(15 downto 0);
    mb_address_bus: in    std_logic_vector(12 downto 0)
    );
  end component memory_b;
begin
  -- some logic
  -- Instantiate memories
  a_memory_a : memory_a
    port map(
      ma_data_bus     => data_bus,       
      ma_address_bus  => address_bus
    );
  a_memory_b : memory_b
    port map(
      mb_data_bus     => data_bus,
      mb_address_bus  => address_bus 
    );
end architecture

如果实体端口定义不包括端口,则需要信号,并且不能从端口推断信号。

代码语言:javascript
复制
-- Example 3 - Use signals for inteconnection as no suitable ports available
entity user is
end user;

architecture Behavioral of user is
  -- Component Port Definitions
  component memory_a
    port(
    data_bus   : inout std_logic_vector(15 downto 0);
    address_bus: in    std_logic_vector(12 downto 0)
    );
  end component memory_a;
  component memory_b
    port(
    data_bus   : inout std_logic_vector(15 downto 0);
    address_bus: in    std_logic_vector(12 downto 0)
    );
  end component memory_b;
  signal data_bus_sig  : std_logic_vector(15 downto 0);
  signal address_bus_sig  : std_logic_vector(12 downto 0);
begin
  -- some logic
  -- Instantiate memories
  a_memory_a : memory_a
    port map(
      data_bus     => data_bus_sig,
      address_bus  => address_bus_sig
    );
  a_memory_b : memory_b
    port map(
      data_bus     => data_bus_sig,
      address_bus  => address_bus_sig 
    );
end architecture

这是错误的,因为没有定义信号或实体端口。

代码语言:javascript
复制
-- Example 4 - WRONG? - Try to infer ports
entity user is
end user;

architecture Behavioral of user is
  -- Component Port Definitions
  component memory_a
    port(
    data_bus   : inout std_logic_vector(15 downto 0);
    address_bus: in    std_logic_vector(12 downto 0)
    );
  end component memory_a;

  component memory_b
    port(
    data_bus   : inout std_logic_vector(15 downto 0);
    address_bus: out   std_logic_vector(12 downto 0)
    );
  end component memory_b;
begin
  -- some logic
  -- Instantiate memories
  a_memory_a : memory_a
    port map(
      data_bus     => data_bus,  
      address_bus  => address_bus
    );
  a_memory_b : memory_b
    port map(
      data_bus     => data_bus,  
      address_bus  => address_bus
    );
end architecture
EN

回答 1

Stack Overflow用户

发布于 2018-09-27 13:04:24

我将将您的示例代码称为1、2、3和4。

1)示例1是正确的。这是一种以分层方式连接端口的可行方法。

2)您肯定会有编译/合成错误,特别是对于输出端口。实际上,您将有多个驱动程序(实例化组件的每个输出端口)影响顶级实体的同一个信号/端口。在模拟中也很容易看到,因为您将看到‘X’出现在该端口(指示同一个信号的多个驱动程序)。请注意,多个输入端口可以连接到单个驱动程序(例如,顶部实体的相同输入端口、相同信号等)。

3)它是部分正确的!您的问题与示例2中的问题相同,多个驱动程序在同一个信号上运行。

4)这绝对是错误的!您没有定义要绑定到的端口或信号。

实体变更后的最新情况:

1)该方法仍然正确,实体端口可以作为(隐式)信号。您可以想象顶部实体就像两个子组件的容器,其中您已经“焊接”了组件的引脚到顶部实体/容器的引脚(焊接材料提供了电气连续性)。

2)当inout端口用作输入时,这可能是可以的,但当您尝试使用inout端口作为输出时,可能会出现问题。很大程度上依赖于如何描述它们的组件。如果组件使用弱逻辑值('L‘& 'H'),那么如果您驱动强值('0’& '1'),那么它的行为可能是正常的。最好使用中间信号端--可能是某种mux/demux --来选择/引导数据到/从适当的内部组件。

3)从纯互连的角度来看,这是可以的。但是,从功能的角度来看,您必须确保始终有on组件充当驱动程序,另一个组件充当接收方。否则,您将在内部信号上具有未定义的值,或者由于多个驱动程序而具有“X”值。然而,对于地址信号,没有人驾驶它,所以它将永远'U‘(未定义)。您需要一些东西(顶级实体中的端口、进程等)。这会激发出某种价值。

4)和以前一样,这是不正确的。组件的端口没有连接。请注意,VHDL (但对verilog同样有效)是一种描述语言;您试图描述一个实际的电路(类似于PCB上的芯片)。就像在实际电路中,您需要某种线将芯片的一个引脚连接到另一个IC中的另一个引脚上,然后在VHDL/verilog中还需要一个等效的" object“来实现interconnection.Thus,您需要定义对象(在本例中是信号),然后描述它的行为(在这种情况下,需要将2个组件的两个端口绑定在一起)。

我希望这次能更清楚些

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52534712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档