如何在VHDL中将无符号类型写入文件?

时间:2015-07-17 20:55:06

标签: vhdl

我有一些48位无符号数字,我想从VHDL测试平台写入文件。不幸的是,我过去总是这样做,转换为整数,对大于32位的数字不起作用。

以下是我总是使用小于32位的数字来完成它。

write(L=>result_line, value=>to_integer(unsigned(C_combo_out)));

这是我想要做的,但不支持无符号类型。

write(L=>result_line, value=>unsigned(C_combo_out));

C_combo_out是一个48位的std_logic_vector,表示无符号整数。注意,我真的想要输出文件中的数字,而不是'1'和'0'的字符串。

1 个答案:

答案 0 :(得分:1)

所以你需要10号基数?

导出大量基数16非常简单,特别是如果其他工具或语言对输出进行后期处理。基数10和大于2 ** 31的数量需要特殊处理。

您可以使用double dabble algorithmn将如此大的数字转换为BCD表示,然后将BCD编号转换为ASCII以进行文件导出。

这应该将大的std_logic_vectors转换为十进制数字:

function raw_format_slv_dec(slv : STD_LOGIC_VECTOR) return STRING is
  function div_ceil(a : NATURAL; b : POSITIVE) return NATURAL is  -- calculates: ceil(a / b)
  begin
    return (a + (b - 1)) / b;
  end function;

  variable Result     : STRING(1 to div_ceil(slv'length, 3));

  subtype TT_BCD      is INTEGER range 0 to 31;
  type TT_BCD_VECTOR  is array(natural range <>) of TT_BCD;

  variable Temp   : TT_BCD_VECTOR(div_ceil(slv'length, 3) - 1 downto 0)    := (others => 0);
  variable Carry  : T_UINT_8;

begin
  for i in slv'range loop
    if (slv(i) = '0') then
      Carry      := 0;
    else
      Carry      := 1;
    end if;
    for j in Temp'reverse_range loop
      Temp(j)    := Temp(j) * 2 + Carry;
      if (Temp(j) > 9) then
        Carry    := 1;
        Temp(j)  := Temp(j) - 10;
      else
        Carry    := 0;
      end if;
    end loop;
  end loop;

  for i in Result'range loop
    Result(i)    := CHARACTER'val(to_integer(Temp(Temp'high - i + 1)));
  end loop;

  -- trim leading zeros, except the last
  return Result;
end function;

扩展版已上传到PoC's strings package

附录:在PoC.strings包

上运行测试平台

PoC-Library附带测试平台,因此您可以从控制台运行它。有4个简单的步骤需要执行:

  1. Download PoC
  2. 配置您首选的模拟器工具链:

    cd <PoCRoot>
    ./poc.sh --configure
    
  3. Setup: 在模板<PoCRoot>/tb/common/的{​​{1}}中创建my_project.vhdl。使用该文件配置两个常量。

  4. Run the simulation

    <PoCRoot>/src/common/my_project.vhdl.template
  5. 如果您在没有cd <PoCRoot>/tb ./testbench.sh --isim PoC.common.strings -g 的情况下运行模拟,它应该如下所示:

    Simulating on console
    (点击)

    如果使用选项-g运行模拟,它将以GUI模式运行,如下所示:

    iSim GUI with constants
    (点击)

    更多信息:
    - List of used files
    - Testbench

    如果您还有其他问题,请参阅AUTHORS文件并直接与我或我的同事联系。