首页 文章

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

提问于
浏览
1

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

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

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

这是我想要做的但是不支持unsigned类型 .

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

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

1 回答

  • 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个简单的步骤需要执行:

    cd <PoCRoot>
    ./poc.sh --configure
    
    • Setup:在模板 <PoCRoot>/src/common/my_project.vhdl.template 中的 <PoCRoot>/tb/common/ 中创建my_project.vhdl . 使用该文件配置两个常量 .

    • Run the simulation

    cd <PoCRoot>/tb
    ./testbench.sh --isim PoC.common.strings -g
    

    如果你在没有 -g 的情况下运行模拟,它应该如下所示:

    Simulating on console

    (点击)

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

    iSim GUI with constants

    (点击)

    Further information:

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

相关问题