VHDL数组输入实体端口

时间:2013-12-25 19:34:50

标签: types entity port vhdl

我一直试图将数组类型作为实体端口信号。我尽可能地简化了它。

Package Types is
  Subtype Segment            is std_logic_vector(15 downto 0);
  Type    DataSegment        is array (natural range <>) of Segment;
  Type    DataSegmentType    is array (0 to 4) of Segment;
End Types;

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

library MyLibrary;
use MyLibrary.Types.all;

Entity MyPort is
  Port (
    pi_clk: in std_logic;
    pi_reset: in std_logic;
    po_myport_data: out std_logic_vector(15 downto 0)
);
End MyPort;

architecture Behavioral of MyPort is

Component UiPort is
  Port (
    pi_clk: in std_logic;
    pi_reset: in std_logic;
    pi_uiport_data: in DataSegment(0 to 2);
    po_uiport_data: out std_logic_vector(15 downto 0)
  );
End Component;

Component UiGoal is
  Port (
    pi_clk: in std_logic;
    pi_reset: in std_logic;
    po_uigoal_data: out std_logic_vector(15 downto 0)
  );
End Component;

--  There are potentially more ui entities here

**signal ls_dataSegment: DataSegment(0 to 2);**

-- The data segment array is the input
-- The process for this entity maps the array inputs to the data output
My_UiPort: UiPort
  Port Map(
    pi_clk => pi_clk, --: in std_logic;
    pi_reset => pi_reset, --: in std_logic;
    pi_uiport_data => ls_dataSegment, --: in DataSegment(0 to 2);
    po_uiport_data => po_myport_data--: out std_logic_vector(15 downto 0)
  );

-- Assign the out port to an element of the array
My_UiGoal: UiGoal
  Port Map(
    pi_clk => pi_clk, --: in std_logic;
    pi_reset => pi_reset, --: in std_logic;
    po_uigoal_data => ls_dataSegment(0) --: out std_logic_vector(15 downto 0)
  );

more instances map other elements of the array

这一切似乎都在合成和构建,问题是当UiGoal在任何位置写入一个'1'的向量时,模拟器将信号显示为红色,其中x为'1'。

该库用于所有实体。

2 个答案:

答案 0 :(得分:2)

基于评论:

  

......问题在于UiGoal在模拟器的任何位置写入带有'1'的向量   将信号显示为红色'X',其中'1'为。

听起来std_logic_vector基于一些未公开的代码部分有多个驱动程序,其中一个驱动程序对'0'元素应用std_logic,然后另一个驱动程序应用对于相同的'1'元素,std_logic。然后,std_logic使用的分辨率函数将'X'的结果作为具有“冲突”驱动程序的std_logic元素的值。 IEEE Std 1076-2008第16.8.2.2节“STD_LOGIC_1164值”中涵盖了VHDL-2008分辨率函数(RESOLVED)。

但是,基于评论:

  

这一切似乎都在合成和构建......

与多个驱动程序的假设相矛盾,因为同一信号的多个驱动程序通常被合成工具捕获并报告为错误。

答案 1 :(得分:2)

尝试更改Segment子类型的声明:

Subtype Segment is std_logic_vector(15 downto 0);

为:

Subtype Segment is std_ulogic_vector(15 downto 0);

这样,如果您尝试将多个输出连接到同一个网络,编译器将给出一条错误消息,如:

** Error: Nonresolved signal 'ls_dataSegment' has multiple sources.

这可以为您提供有关修复代码的新位置。