Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vhdl 由两个驱动器(来自不同组件)驱动的设计顶部模块中的信号_Vhdl - Fatal编程技术网

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

Vhdl 由两个驱动器(来自不同组件)驱动的设计顶部模块中的信号,vhdl,Vhdl,在我的设计中,我有几个模块。顶层模块的代码片段如下所示 有一个问题让我困惑。让我们假设以下场景: 步骤1: Calc1_模块从t1工作到t2,它应该将其输出发送到存储模块的输入端。(Calc1输出映射到聚合信号) 第二步: Calc2_模块从t3工作到t4,它应该将其输出发送到存储模块的输入端。(Calc2_out映射到聚合信号) 内存模块映射到聚合信号 由于一个信号有多个驱动器,因此它始终具有未知值。 值得一提的是,所有控制都发生在FSM内,以决定何时在Calc1之后,何时在Calc2之后 在

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

有一个问题让我困惑。让我们假设以下场景:

步骤1: Calc1_模块从t1工作到t2,它应该将其输出发送到存储模块的输入端。(Calc1输出映射到聚合信号)

第二步: Calc2_模块从t3工作到t4,它应该将其输出发送到存储模块的输入端。(Calc2_out映射到聚合信号)

内存模块映射到聚合信号

由于一个信号有多个驱动器,因此它始终具有未知值。 值得一提的是,所有控制都发生在FSM内,以决定何时在Calc1之后,何时在Calc2之后

在设计的顶部模块中,我如何能够有选择地在一条线路(信号)上交错来自不同来源的不同数据,而不将该线路推入未知状态

换言之,如何才能汇总:

  • 信号1的值1(例如,来自t1到t2中的Calc2)

  • 来自信号2的值2(例如来自t2到t3中的Calc1)

  • 一体式聚合\u信号,无需将其驱动到未知状态

    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';