转换向量时的 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”,它的转换方式与之前转换的方式相同
从评论来看,您似乎希望 good
在 bar >= 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。
所以,我可以看到两个解决方案:
在类型转换中使用 unsigned
类型或
制作bar
5位
或更宽。
其他人指出,假设这是可综合的代码并且假设这是组合逻辑,那么你是在您的 if
语句中缺少一个分支;在 if
语句为 false
的情况下,您不会驱动信号 good
,因此如果您要将此代码综合为组合逻辑,那么您将获得锁存器。但这不是你问的问题。
我是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”,它的转换方式与之前转换的方式相同
从评论来看,您似乎希望 good
在 bar >= 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。
所以,我可以看到两个解决方案:
在类型转换中使用
unsigned
类型或制作
bar
5位 或更宽。
其他人指出,假设这是可综合的代码并且假设这是组合逻辑,那么你是在您的 if
语句中缺少一个分支;在 if
语句为 false
的情况下,您不会驱动信号 good
,因此如果您要将此代码综合为组合逻辑,那么您将获得锁存器。但这不是你问的问题。