如何在VHDL中将整数转换为二进制表示?

时间:2016-04-30 09:22:00

标签: vhdl

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;

我需要将整数转换为二进制表示,但我不知道整数的值。我该怎么办?

1 个答案:

答案 0 :(得分:1)

您对信号conv_int的声明无效。首先,您不能在右侧的子类型指示中使用conv_int,因为尚未定义conv_int。您可以使用其他信号(或对象),例如Distance,之前已声明过。您是否必须指定todownto的范围,而不仅仅是std_logic_vector的长度,例如:

signal conv_int : std_logic_vector(to_unsigned(timeIn, Distance'length)-1);

但是这个也不起作用,因为现在范围在精心制作期间没有受到约束,因为timeIn不是常数。这意味着,您必须在“编译”时指定数组类型std_logic_vector的范围。

此处conv_intDistance的范围相同,因为您稍后会将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

代码可以进一步改进:

  1. 您应该避免使用非标准的Synopsys软件包std_logic_unsigned。请仅使用标准IEEE包numeric_std

  2. 您的过程将等同于作为并发语句编写的单行conv_int <= ...。因为变体将在timeIn更改时(以及启动后一次)执行。

  3. 如果conv_int仅分配给输出Distance,则此处不需要中间信号。

  4. 只要timeIn小于2 ** 31/170,乘以340/2就相当于乘以170。由于上述关于截断的要求,情况就是如此。

  5. 因此,您的架构可以简化为:

    architecture behav of DistanceCal is
    begin
       Distance <= std_logic_vector(to_unsigned(timeIn*170, Distance'length));
    end behav;