VHDL整数转字符串

3

假设您想在VHDL中将整数转换为字符串以在VGA监视器上显示。但由于您必须使用Xilinx ISE 14.7,因此无法使用IEEE 2008标准。我有以下代码可将整数类型转换为字符串类型,但是while循环和for循环都会出现“非静态循环限制超过”的错误:

-- convert integer to string using specified base
-- (adapted from Steve Vogwell's posting in comp.lang.vhdl)

function str(int: integer; base: integer) return string is

variable temp:      string(1 to 10);
variable num:       integer;
variable abs_int:   integer;
variable len:       integer := 1;
variable power:     integer := 1;

begin

-- bug fix for negative numbers
abs_int := abs(int);

num     := abs_int;

while num >= base loop                     -- Determine how many
  len := len + 1;                          -- characters required
  num := num / base;                       -- to represent the
end loop ;                                 -- number.

for i in len downto 1 loop                 -- Convert the number to
  temp(i) := chr(abs_int/power mod base);  -- a string starting
  power := power * base;                   -- with the right hand
end loop ;                                 -- side.

-- return result and add sign if required
if int < 0 then
   return '-'& temp(1 to len);
 else
   return temp(1 to len);
end if;

end str;

我通过对它进行改动,把它变成了这个丑陋的怪物来“解决”错误:

-- convert integer to string using specified base
-- (adapted from Steve Vogwell's posting in comp.lang.vhdl)

function str(int: integer; base: integer) return string is

    variable temp:      string(1 to 9);
    variable num:       integer;
    variable abs_int:   integer;
    variable len:       integer := 1;
    variable power:     integer := 1;

    begin

    -- bug fix for negative numbers
    abs_int := abs(int);

    num     := abs_int;

    for i in 0 to 100 loop
        if (num >= base) then                   -- Determine how many
          len := len + 1;                       -- characters required
          num := num / base;                    -- to represent the
        else                                    -- number.
            exit;
        end if;
    end loop ;                                 

    for i in 9 downto 1 loop                 -- Convert the number to
        if (i <= len) then
            temp(i) := chr(abs_int/power mod base);  -- a string starting
            power := power * base;                   -- with the right hand
        else
            exit;
        end if;
    end loop ;                                 -- side.

    -- return result and add sign if required
    if int < 0 then
       return '-'& temp(1 to len);
     else
       return temp(1 to len);
    end if;

end str;

有没有一种不错的方法来将整数转换为字符串?

1
听起来你正在尝试使用'image()函数和string类型(在其无约束形式下)进行合成。这是行不通的。对于这样的任务,一个小型软处理器似乎是最合适的选择(例如Xilinx Picoblaze)。它也可以在FPGA逻辑中完成,但这不会是最佳的资源利用方式。 - andrsmllr
1
我认为你会需要一个查找表。但是为什么你需要一个字符串来代表VGA?显示器只显示像素点。字符很可能是通过图形缓冲区操作来显示的。 - Paebbels
我可以轻松地在屏幕上显示字符串,所以我接下来就转向了将整数转换为字符串,以便我也可以将它们显示出来。但是,上面的函数和integer'image()都不能用于变量整数。将变量整数转换为字符串的常见简单解决方案是什么? - John
2个回答

7
如果I是一个整数,integer'image(I)是它作为字符串的表示形式。

没错。但是,当我使用integer'image(i)时,会出现“表达式不是常量”的错误。我只是想将一个快速变化的整数转换为字符串,并在显示器上显示。 - John
你的“怪物”中的两个返回表达式也没有返回常量长度的字符串表达式。 - user1155120
并不是字符串长度不是常量,而是它似乎在抱怨传入的整数不是常量。一旦我将其从integer'image(1234)更改为integer'image(some_var),它就会抱怨。 - John
1
'image()函数中的参数不需要是常量。但是从阅读其他评论中,我知道你想做什么,所以它必须是一个常量才能进行综合。 - Matthew Taylor

0
我从各个方向尝试了很多方法,最终发现我必须创建一个巨大的case块才能让它正常工作。现在,我终于可以显示快速变化的变量,这对调试非常有帮助。不幸的是,解决方案必须如此繁琐。
(我已经有一个用于显示文本的ROM,结果字符串将发送到该ROM。)
function int_to_str(int : integer) return string is
    variable a : natural := 0;
    variable r : string(1 to 11);

begin
    a := abs (int);

    case a is
        when 0    => r := "0          ";
        when 1    => r := "1          ";
        when 2    => r := "2          ";
        when 3    => r := "3          ";
        .
        .
        .
        when 1000 => r := "1000       ";

        when others => r := "???????????";
    end case;

    if (int < 0) then
        r := '-' & r(1 to 10);
    end if;

    return r;
end int_to_str;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接