library ieee;
use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;
use ieee.std_logic_1164.all;
entity DistanceCal is
port( timeIn : in integer;
Distance : out std_logic_vector(15 downto 0));
end DistanceCal;
architecture behav of DistanceCal is
signal conv_int : std_logic_vector(to_unsigned(timeIn, conv_int'length));
begin
process(timeIn)
begin
conv_int <= std_logic_vector(to_unsigned((timeIn*340/2), conv_int'length));
end process;
Distance <= conv_int;
end behav;
我需要将整数转换为二进制表示,但我不知道整数的值。我该怎么办?
答案 0 :(得分:1)
您对信号conv_int
的声明无效。首先,您不能在右侧的子类型指示中使用conv_int
,因为尚未定义conv_int
。您可以使用其他信号(或对象),例如Distance
,之前已声明过。您是否必须指定to
或downto
的范围,而不仅仅是std_logic_vector
的长度,例如:
signal conv_int : std_logic_vector(to_unsigned(timeIn, Distance'length)-1);
但是这个也不起作用,因为现在范围在精心制作期间没有受到约束,因为timeIn
不是常数。这意味着,您必须在“编译”时指定数组类型std_logic_vector
的范围。
此处conv_int
与Distance
的范围相同,因为您稍后会将conv_int
分配给Distance
。该声明有效:
signal conv_int : std_logic_vector(Distance'range);
通过此更改,您的代码将进行分析和详细说明(编译/合成)。现在你的整数到这一行的“二进制”转换
conv_int <= std_logic_vector(to_unsigned((timeIn*340/2), conv_int'length));
将按如下方式工作:整数表达式timeIn*340/2
将在模拟时/运行时进行评估,然后转换为unsigned
,同时将二进制表示截断为conv_int'length
位,并且最后将其转换为std_logic_vector
。请注意,对于大于floor(2 ** 16/170)= 101的timeIn
值,截断将/可能会导致意外Distance
。
代码可以进一步改进:
您应该避免使用非标准的Synopsys软件包std_logic_unsigned
。请仅使用标准IEEE包numeric_std
。
您的过程将等同于作为并发语句编写的单行conv_int <= ...
。因为变体将在timeIn
更改时(以及启动后一次)执行。
如果conv_int
仅分配给输出Distance
,则此处不需要中间信号。
只要timeIn
小于2 ** 31/170,乘以340/2就相当于乘以170。由于上述关于截断的要求,情况就是如此。
因此,您的架构可以简化为:
architecture behav of DistanceCal is
begin
Distance <= std_logic_vector(to_unsigned(timeIn*170, Distance'length));
end behav;