如何知道矢量是否未定义

时间:2016-05-24 18:40:04

标签: vector vhdl

我拥有什么

我发出了std_logic_vector的信号。我需要从ROM中给它值,我已经做了。

问题

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

在此之前,ROM输出向量是" UUUU" (因为它的宽度为4位)。让我们调用此信号ROM_coef_inf,因此在模拟中,这会出现在" UUUU"值,所以它的颜色是橙色。

我需要

我需要知道如何比较这个输出,以便知道它是否是一个"未定义的向量",以便给出另一个值(即" 0000" )到我的向量,直到第一个ROM值准备好。

3 个答案:

答案 0 :(得分:0)

有几种可能的解决方案:

  1. 您可以使用与"UUUU"不同的值初始化ROM和目的地之间的所有寄存器(至少在模拟中)。
  2. 标准比较可以测试所有9个STD_LOGIC值:
    if (mySignal == 'U') then
  3. 您可以使用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;
    

    载体也有过载。

答案 1 :(得分:0)

@Paebbels提供的答案仅适用于模拟。在现实世界中,信号往往是1或0(或它们之间的过渡,但这里不讨论)。数字1将起作用,但是如果要检查未初始化,则需要将其设置为ROM中永远不会出现的值。更简单的选择是计算时钟周期。 ROM将始终表现相同。因此,如果需要三个周期来获取第一个数据,则总是需要三个周期。所以如果算上三个周期就可以了。

答案 2 :(得分:0)

我认为这是供FPGA使用的,在这种情况下,所有寄存器在编程后都会有一个可预测的值,除非你指定别的东西,否则它是零。如果你需要的只是ROM_coef_inf在模拟的第一个时钟周期中有0而不是U',你可以在声明信号时简单地指定一个初始值:

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

在ASIC中,电源施加后,寄存器将具有未知值。在这种情况下,您需要使用复位信号来清除设计中的所有寄存器。在FPGA中使用复位信号通常也是一个好主意,例如为了防止电路在时钟稳定之前做任何事情。