顶部模块中的信号由两个驱动器(来自不同组件)驱动的设计

时间:2017-01-27 16:37:38

标签: vhdl

在我的设计中,我有几个模块。顶层模块的代码片段如下:

有一个让我感到困惑的问题。让我们假设以下情况:

步骤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之后的时间。

如何在设计的顶层模块中一次性地在一条线(信号)上选择性地交错来自不同源的不同数据 - 而不将该线推入未知状态?

换句话说,如何聚合:

  1. signal1 的值1(例如,从t1到t2来自Calc2)

  2. 来自 signal2 的value2(例如,从t2中的Calc1到t3)

  3. 一个 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;
    

1 个答案:

答案 0 :(得分:0)

线索在你的术语“选择性交错”中。

你如何做出选择?大概你知道什么时候你想看Calc1,当你想看Calc2等时。所以把这些信息编码到一个信号上,我们称之为Selector

然后将每个单位的输出置于其自己的信号Calc1_output等上,并使用SelectorAggregation_Signal之间进行选择。

Aggregation_Signal <= Calc1_output when Selector = Calc1
                      else Calc2_output when Selector = Calc2
                      else (others => '0';

Selector信号可以是每个Calc单位具有一个值的枚举,也可以是具有名为Calc1Calc2等常量的Natural或std_logic_vector等。

由于您说计算是由状态机驱动的,因此只要您需要Selector上的值,状态机就可以使用正确的值来驱动Aggregation_Signal