Types 实体端口中的VHDL数组类型

Types 实体端口中的VHDL数组类型,types,entity,port,vhdl,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

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

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
包类型为
子类型段为标准逻辑向量(15到0);
类型数据段是段的数组(自然范围);
类型DataSegmentType是段的数组(0到4);
末端类型;
图书馆IEEE;
使用IEEE.STD_LOGIC_1164.ALL;
图书馆;
使用MyLibrary.Types.all;
实体MyPort是
港口(
pi_-clk:标准逻辑中;
pi_复位:在标准_逻辑中;
po_myport_数据:输出标准逻辑向量(15到0)
);
结束我的港口;
MyPort的体系结构是
组件UiPort是
港口(
pi_-clk:标准逻辑中;
pi_复位:在标准_逻辑中;
pi_uiport_数据:在数据段中(0到2);
端口数据:输出标准逻辑向量(15到0)
);
端部元件;
我们的目标是
港口(
pi_-clk:标准逻辑中;
pi_复位:在标准_逻辑中;
目标数据:输出标准逻辑向量(15到0)
);
端部元件;
--这里可能有更多的ui实体
**信号ls_数据段:数据段(0到2)**
--数据段数组是输入
--此实体的过程将数组输入映射到数据输出
我的报告:我的报告
港口地图(
pi_clk=>pi_clk,-:在标准逻辑中;
pi_reset=>pi_reset,-:在标准逻辑中;
pi_uiport_data=>ls_数据段,-:在数据段中(0到2);
po_uiport_数据=>po_myport_数据--:输出标准逻辑向量(15到0)
);
--将输出端口分配给阵列的一个元素
我的目标:我的目标
港口地图(
pi_clk=>pi_clk,-:在标准逻辑中;
pi_reset=>pi_reset,-:在标准逻辑中;
po_uigoal_data=>ls_数据段(0)--:输出标准逻辑向量(15到0)
);
更多实例映射数组的其他元素
这一切似乎都是综合和构建的,问题是当UiGoal在任何位置写入一个带有“1”的向量时,模拟器会在“1”所在的位置将信号显示为带有x的红色

库用于所有实体。

根据注释:

。。。问题是当UiGoal在模拟器的任何位置写入带有
'1'
的向量时 将信号显示为红色,带有
'X'
's和
'1'
's的位置

基于一些未公开的代码部分,一个
std\u逻辑向量有多个驱动程序,其中一个驱动程序对
std\u逻辑元素应用
'0'
,而另一个驱动程序则对相同的
std\u逻辑元素应用
'1'
。然后,用于
std_逻辑的解析函数将生成
'X'
的结果,作为具有“冲突”驱动程序的
std_逻辑元素的值。VHDL-2008解析函数(
解析
)在IEEE标准1076-2008第16.8.2.2节“标准逻辑1164值”中介绍

然而,根据评论:

这一切似乎都在综合和构建

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

根据评论:

。。。问题是当UiGoal在模拟器的任何位置写入带有
'1'
的向量时 将信号显示为红色,带有
'X'
's和
'1'
's的位置

基于一些未公开的代码部分,一个
std\u逻辑向量有多个驱动程序,其中一个驱动程序对
std\u逻辑元素应用
'0'
,而另一个驱动程序则对相同的
std\u逻辑元素应用
'1'
。然后,用于
std_逻辑的解析函数将生成
'X'
的结果,作为具有“冲突”驱动程序的
std_逻辑元素的值。VHDL-2008解析函数(
解析
)在IEEE标准1076-2008第16.8.2.2节“标准逻辑1164值”中介绍

然而,根据评论:

这一切似乎都在综合和构建


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

尝试将
段的声明更改为:

子类型段为标准逻辑向量(15到0)

致:

亚型片段为std-ulogic-vector(15到0)

这样,如果您试图将多个输出连接到同一个网络,编译器将向您发送如下错误消息:

**错误:未解析的信号“ls\u dataSegment”有多个源。


这可以让您对如何修复代码有新的见解。

尝试将
段的声明更改为:

子类型段为标准逻辑向量(15到0)

致:

亚型片段为std-ulogic-vector(15到0)

这样,如果您试图将多个输出连接到同一个网络,编译器将向您发送如下错误消息:

**错误:未解析的信号“ls\u dataSegment”有多个源。


这可以让您对在何处修复代码有新的见解。

谢谢您的回复。实际上,在这种情况下,一个进程正在重置中初始化数组,另一个进程正在写入数组。奇怪的是,合成器没有捕捉到它。我所能看到的只是红色的边界和x,而“1”应该在那里。我删除了初始化,效果很好,谢谢。谢谢你的回复。实际上,在这种情况下,一个进程正在重置中初始化数组,另一个进程正在写入数组。奇怪的是,合成器没有捕捉到它。我所能看到的只是红色的边界和x,而“1”应该在那里。我删除了初始化,它工作得很好,谢谢。我发现问题是因为有两个进程正在写入数组,一个在reset中,另一个在oth中