在我的设计中,我有几个模块。顶层模块的代码片段如下:
有一个让我感到困惑的问题。让我们假设以下情况:
步骤1: Calc1_module从t1到t2工作,它应该将它的输出发送到存储器模块的输入以存储在那里。 (Calc1_out映射到 Aggregation_Signal )
步骤2: Calc2_module从t3到t4工作,它应该将它的输出发送到存储器模块的输入以存储在那里。 (Calc2_out映射到 Aggregation_Signal )。
Memory_Moduel_in映射到 Aggregation_Signal 。
由于一个信号有多个驱动程序,因此它始终具有未知值。 值得一提的是,所有控制都发生在FSM中,以决定它在Calc1和Calc2之后的时间。
如何在设计的顶层模块中一次性地在一条线(信号)上选择性地交错来自不同源的不同数据 - 而不将该线推入未知状态?
换句话说,如何聚合:
signal1 的值1(例如,从t1到t2来自Calc2)
来自 signal2 的value2(例如,从t2中的Calc1到t3)
一个 Aggregation_Signal ,但不会将其置于未知状态。
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;
答案 0 :(得分:0)
线索在你的术语“选择性交错”中。
你如何做出选择?大概你知道什么时候你想看Calc1,当你想看Calc2等时。所以把这些信息编码到一个信号上,我们称之为Selector
。
然后将每个单位的输出置于其自己的信号Calc1_output
等上,并使用Selector
在Aggregation_Signal
之间进行选择。
Aggregation_Signal <= Calc1_output when Selector = Calc1
else Calc2_output when Selector = Calc2
else (others => '0';
Selector
信号可以是每个Calc单位具有一个值的枚举,也可以是具有名为Calc1
,Calc2
等常量的Natural或std_logic_vector等。
由于您说计算是由状态机驱动的,因此只要您需要Selector
上的值,状态机就可以使用正确的值来驱动Aggregation_Signal
。