转换向量时的 if 语句问题

if statement problem while converting a vector

我是vhdl编码新手,if语句有问题

所以我的代码如下 我想转换一个向量(条),如果语句为真(所以在这个例子中,如果它小于 10)

process(bar)
      variable tmp : integer;
    begin
      tmp := to_integer(signed(bar));
      if tmp < 10 then
            good(3) <= bar(3);
            good(2) <= bar(3) xor bar(2);
            good(1) <= bar(2) xor bar(1);
            good(0) <= bar(1) xor bar(0);
      end if;
    end process;

但问题是该语句不起作用,如果我输入更大的数字,例如“1111”,它的转换方式与之前转换的方式相同

从评论来看,您似乎希望 goodbar >= 10 时设置为 0。在那种情况下,你可以这样做:

process(bar)
  variable tmp : integer;
begin
  tmp := to_integer(signed(bar));
  if tmp < 10 then
    good(3) <= bar(3);
    good(2) <= bar(3) xor bar(2);
    good(1) <= bar(2) xor bar(1);
    good(0) <= bar(1) xor bar(0);
  else
    good <= (others => '0');
  end if;
end process;

矢量 good 仅在 tmp < 10 时分配。因此此过程推断出一个锁存器。 您需要定义在任何其他条件下好的“其他”值是什么。

你说

if i put a bigger number for example "1111" it is converting in the same way as it converted before

正如 Tricky 在上面的评论中指出的那样,您的问题是这里的这一行:

  tmp := to_integer(signed(bar));
                    ^^^^^^

您还没有发布 MCVE,所以我不能确定,但​​您的问题暗示 bar 是 4 位宽。假设是这种情况,"1111" 作为 signed 数字的值是 -1。因此,如果 bar 设置为 "1111"tmp 将为 -1。 -1 小于 10,因此此 if 语句的计算结果为 true:

  if tmp < 10 then

如果你认为"1111"大于10(即15),那么你需要通过unsigned类型进行转换,即

  tmp := to_integer(unsigned(bar));
                    ^^^^^^^^

4 位 signed 数的范围是 -8 到 +7。该范围内的所有值都小于 10,因此无论 bar.

的值如何,您的 if 语句将评估为 true

上述解决方案假定 bar 始终为零或正数。如果不是这种情况,则信号 bar 中需要更多位。 5个就够了。 5 位 signed 数字的范围是 -16 到 +15。

所以,我可以看到两个解决方案:

  1. 在类型转换中使用 unsigned 类型或

  2. 制作bar5位 或更宽。


其他人指出,假设这是可综合的代码并且假设这是组合逻辑,那么你是在您的 if 语句中缺少一个分支;在 if 语句为 false 的情况下,您不会驱动信号 good,因此如果您要将此代码综合为组合逻辑,那么您将获得锁存器。但这不是你问的问题。