Vhdl 由两个驱动器(来自不同组件)驱动的设计顶部模块中的信号
在我的设计中,我有几个模块。顶层模块的代码片段如下所示 有一个问题让我困惑。让我们假设以下场景: 步骤1: Calc1_模块从t1工作到t2,它应该将其输出发送到存储模块的输入端。(Calc1输出映射到聚合信号) 第二步: Calc2_模块从t3工作到t4,它应该将其输出发送到存储模块的输入端。(Calc2_out映射到聚合信号) 内存模块映射到聚合信号 由于一个信号有多个驱动器,因此它始终具有未知值。 值得一提的是,所有控制都发生在FSM内,以决定何时在Calc1之后,何时在Calc2之后 在设计的顶部模块中,我如何能够有选择地在一条线路(信号)上交错来自不同来源的不同数据,而不将该线路推入未知状态 换言之,如何才能汇总:Vhdl 由两个驱动器(来自不同组件)驱动的设计顶部模块中的信号,vhdl,Vhdl,在我的设计中,我有几个模块。顶层模块的代码片段如下所示 有一个问题让我困惑。让我们假设以下场景: 步骤1: Calc1_模块从t1工作到t2,它应该将其输出发送到存储模块的输入端。(Calc1输出映射到聚合信号) 第二步: Calc2_模块从t3工作到t4,它应该将其输出发送到存储模块的输入端。(Calc2_out映射到聚合信号) 内存模块映射到聚合信号 由于一个信号有多个驱动器,因此它始终具有未知值。 值得一提的是,所有控制都发生在FSM内,以决定何时在Calc1之后,何时在Calc2之后 在
entity TOP is
port (...);
end entity;
architecture Behav_TOP of TOP is
component FSM is
port(...);
end component;
component Calc1_Module is
port
( ...
Calc1_Module_out
... );
end component;
component Calc2_Module is
port
( ...
Calc2_Module_out
... );
end component;
component Memory_Module is
port
( ...
Memory_Module_in
... );
end component;
Signal Aggregation_Signal;
begin
U_FSM : FSM
port map(...);
U_Calc1_Module : Calc1_Module
port map
( ...
Calc1_Module_out => Aggregation_Signal,
... );
U_Calc2_Module : Calc2_Module
port map
( ...
Calc2_Module_out => Aggregation_Signal,
... );
U_Memory_Module : Memory_Module
port map
( ...
Memory_Module_in => Aggregation_Signal,
... );
end Behav_TOP;
线索在你的术语“选择性交错”中
你是如何做出选择的?大概你知道什么时候你想看到Calc1,什么时候你想看到Calc2,等等。所以把这些信息编码到一个信号中,我们称之为选择器
然后将每个单元的输出带到其自己的信号上,Calc1\u输出
等,并使用选择器
在它们之间选择到聚合信号
Aggregation_Signal <= Calc1_output when Selector = Calc1
else Calc2_output when Selector = Calc2
else (others => '0';
聚合_信号“0”;
选择器
信号可以是每计算单位有一个值的枚举,也可以是自然或标准逻辑向量,其常量名为Calc1
,Calc2
等
由于您说计算是由状态机驱动的,因此每当您需要聚合信号上的值时,状态机用正确的值驱动选择器是合乎逻辑的。对于解析的数据类型,有函数解析一个或多个驱动程序的数据值。std_逻辑是一种已解析的数据类型。默认解析函数位于软件包std_logic_1164中,它将逻辑值和元值“Z”解析为逻辑值。元值“Z”表示驱动程序未对信号值作出贡献。未贡献该值的驱动程序应为“Z”。(IEEE标准1076-2008 4.6分辨率函数,16.8.2.2标准逻辑值)。(请注意,您的问题没有显示信号类型)。否则,您可以使用唯一的名称连接有助于
聚合\u信号的输出,并推断多路复用器(例如,所选信号分配)或实例化多路复用器。
Aggregation_Signal <= Calc1_output when Selector = Calc1
else Calc2_output when Selector = Calc2
else (others => '0';