Vector 如何知道向量是否未定义 我所拥有的

Vector 如何知道向量是否未定义 我所拥有的,vector,vhdl,Vector,Vhdl,我有一个标准逻辑向量的信号。我需要从ROM中给它赋值,这是我已经做过的 问题 在模拟或使用的开始,有一个初始化过程,使得ROM返回第一个值之前需要一些时间(大约2个时钟周期) 在此之前,ROM输出向量是“uuu”(因为它的宽度为4位)。让我们把这个信号称为ROM_coef_inf,所以在模拟中,这个信号显示为“UUUU”值,所以它的颜色是橙色 我需要 我需要知道如何比较此输出,以便知道它是否为“未定义向量”,以便为我的向量提供另一个值(即“0000”),直到第一个ROM值准备就绪。有几种可能的解

我有一个
标准逻辑向量的信号。我需要从ROM中给它赋值,这是我已经做过的

问题 在模拟或使用的开始,有一个初始化过程,使得ROM返回第一个值之前需要一些时间(大约2个时钟周期)

在此之前,ROM输出向量是“uuu”(因为它的宽度为4位)。让我们把这个信号称为ROM_coef_inf
,所以在模拟中,这个信号显示为“UUUU”值,所以它的颜色是橙色

我需要
我需要知道如何比较此输出,以便知道它是否为“未定义向量”,以便为我的向量提供另一个值(即“0000”),直到第一个ROM值准备就绪。

有几种可能的解决方案:

  • 您可以使用不同的
    “UUUU”
    值初始化ROM和目标(至少在模拟中)之间的所有寄存器
  • 标准比较可以测试所有9个标准逻辑值:
    如果(mySignal=='U'),则
  • 您可以使用
    is_x(…)
    测试信号的特殊值
    是这样定义的:

    FUNCTION Is_X ( s : std_ulogic) RETURN  BOOLEAN IS
    BEGIN
      CASE s IS
        WHEN 'U' | 'X' | 'Z' | 'W' | '-' => RETURN TRUE;
        WHEN OTHERS => NULL;
      END CASE;
      RETURN FALSE;
    END;
    
    向量也有过载


  • 有几种可能的解决方案:

  • 您可以使用不同的
    “UUUU”
    值初始化ROM和目标(至少在模拟中)之间的所有寄存器
  • 标准比较可以测试所有9个标准逻辑值:
    如果(mySignal=='U'),则
  • 您可以使用
    is_x(…)
    测试信号的特殊值
    是这样定义的:

    FUNCTION Is_X ( s : std_ulogic) RETURN  BOOLEAN IS
    BEGIN
      CASE s IS
        WHEN 'U' | 'X' | 'Z' | 'W' | '-' => RETURN TRUE;
        WHEN OTHERS => NULL;
      END CASE;
      RETURN FALSE;
    END;
    
    向量也有过载


  • @Paebbels提供的答案仅在模拟中有效。在现实世界中,信号往往是1或0(或它们之间的转换,但这里不讨论)。数字1可以工作,但如果您想检查是否未初始化,则需要将其设置为一个在ROM中永远不会出现的值。更简单的选择是计算时钟周期。ROM的行为将始终相同。因此,如果需要三个周期才能获得第一个数据,那么总是需要三个周期。因此,如果你计算三个周期,你就可以了。

    由@Paebbels提供的答案仅在模拟中有效。在现实世界中,信号往往是1或0(或它们之间的转换,但这里不讨论)。数字1可以工作,但如果您想检查是否未初始化,则需要将其设置为一个在ROM中永远不会出现的值。更简单的选择是计算时钟周期。ROM的行为将始终相同。因此,如果需要三个周期才能获得第一个数据,那么总是需要三个周期。因此,如果您计算三个周期,就可以了。

    我假设这是用于FPGA的,在这种情况下,所有寄存器在编程后都会有一个可预测的值,即零,除非您指定其他值。如果您所需要的只是在模拟的第一个时钟周期中,让
    ROM_coef_inf
    具有零而不是U,则您可以在声明信号时简单地指定初始值:

    signal ROM_coef_inf : std_logic_vector(3 downto 0) := "0000";
    

    在ASIC中,在通电后,寄存器将具有未知值。在这种情况下,需要使用重置信号清除设计中的所有寄存器。在FPGA中使用重置信号通常也是一个好主意,例如,在时钟稳定之前防止电路执行任何操作。

    我假设这是用于FPGA的,在这种情况下,所有寄存器在编程后都会有一个可预测的值,即零,除非您指定其他值。如果您所需要的只是在模拟的第一个时钟周期中,让
    ROM_coef_inf
    具有零而不是U,则您可以在声明信号时简单地指定初始值:

    signal ROM_coef_inf : std_logic_vector(3 downto 0) := "0000";
    
    在ASIC中,在通电后,寄存器将具有未知值。在这种情况下,需要使用重置信号清除设计中的所有寄存器。在FPGA中使用复位信号通常也是一个好主意,例如,在时钟稳定之前防止电路执行任何操作