我一直试图将数组类型作为实体端口信号。我尽可能地简化了它。
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'。
该库用于所有实体。
答案 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.
这可以为您提供有关修复代码的新位置。