整数到字符串在合成中出错(宽度不匹配)

Posted

技术标签:

【中文标题】整数到字符串在合成中出错(宽度不匹配)【英文标题】:Integer to String goes wrong in Synthesis (Width Mismatch) 【发布时间】:2014-01-07 03:46:08 【问题描述】:

我正在尝试将整数转换为字符串(使用integer'image(val))并填充或限制为特定长度。当我使用report 语句并进行模拟时,我已经制作了这个功能。

function integer2string_pad(val: integer; stringSize: integer) return string is
    variable imageString: string(1 to integer'image(val)'length);
    variable returnString: string(1 to stringSize);
begin
    imageString := integer'image(val);

    -- Are we smaller than the desired size?
    if integer'image(val)'length < stringSize then
        -- Pad the string if we are
        returnString := integer'image(val) & (1 to stringSize-integer'image(val)'length => ' ');

    -- Are we to big for the desired size
    elsif integer'image(val)'length > stringSize then
        -- Only use the top most string bits and append a "." to the end signifing that there is more
        returnString := imageString(1 to stringSize-1) & ".";

    -- Otherwise we are just the right size
    else
        returnString := integer'image(val);
    end if;


    return returnString;
end function;

这是该函数的一些示例输入和输出(下划线 = 空格,因为 SO 内联代码会截断额外的空格):

integer2string_pad(12, 6) : 12____

integer2string_pad(123456, 6) : 123456

integer2string_pad(1234567890, 6) : 12345.

integer2string_pad(0, 6) : 0_____

integer2string_pad(-123, 6) : -123__

integer2string_pad(-1, 6) : -1____

integer2string_pad(-123456, 6) : -1234.


但是当我合成时,我在所有 4 行上都出现宽度不匹配错误,我将值分配给 pongScoreLeftpongScoreRight。它还说它们的值为 0 并被修剪掉。

Width mismatch. <pongScoreLeft> has a width of 48 bits but assigned
expression is 6-bit wide. 
Width mismatch. <pongScoreRight> has a width
of 48 bits but assigned expression is 6-bit wide.
Width mismatch. <pongScoreLeft> has a width of 48 bits but assigned expression is 6-bit wide.
Width mismatch. <pongScoreRight> has a width of 48 bits but assigned expression is 6-bit wide.

产生这些宽度不匹配错误的 VHDL:

type type_score is
record
    left : integer range 0 to 255;
    right : integer range 0 to 255;
end record;
constant init_type_score: type_score := (left => 0, right => 0);

signal pongScore: type_score := init_type_score;
signal pongScoreLeft: string(1 to 6) := (others => NUL);
signal pongScoreRight: string(1 to 6) := (others => NUL);

...

scoreToString: process(clk)
begin
    if rising_edge(clk) then
        if reset = '1' then
            pongScoreLeft <= (others => NUL);
            pongScoreRight <= (others => NUL);
        else
            pongScoreLeft <= integer2string_pad(pongScore.left, 6);
            pongScoreRight <= integer2string_pad(pongScore.right, 6);
            --report "|" & integer2string_pad(pongScore.left, 6) & "|";

        end if;
    end if;
end process;

我的integer2string_pad 函数出了什么问题? 合成出了什么问题?

【问题讨论】:

【参考方案1】:

我不希望合成支持 'image 或 'value - 除了在细化时运行的断言。它们会涉及大量处理。

每当我将整数转换为 ASCII 时,我都会一次处理一个字符,使用可合成的字符 'val 和字符 'pos,因为它们不涉及任何处理;他们只是将一个字符转换为/从其底层二进制表示。

编辑: 想想你将如何实现'image!它涉及多次除以 10 :如果将其展开为单个增量周期(根据非时钟函数调用的语义要求),那将是很多硬件

每个(几个)时钟周期处理一个数字,您可以将其减少为单除法、连续减法或超过 6 的加法,或者根据您的硬件资源和时间预算。

综合工具代表您做出这些决定确实没有意义。所以 - 虽然我承认这在理论上是可能的,但我会惊讶地看到一个合成器工具能正确地做到这一点。 (OTOH 这是一个不太可能发生的情况

【讨论】:

我怀疑这些属性是根本原因,但是综合没有抱怨,我找不到任何关于不综合的属性的帖子。如果你看一下我的FP-V-GA Text 项目,text_line 模块会输入一个字符串,并收集位图以显示。我添加了代码(未提交 2013-12-18),它允许在 textPassage 端口中使用动态字符串,但无法在合成运行时生成新字符串(可能是 BCD 和大小写来组装整数字符串)。但这仅适用于数字,关于如何重构我的系统的任何想法?

以上是关于整数到字符串在合成中出错(宽度不匹配)的主要内容,如果未能解决你的问题,请参考以下文章

Excel导入数据到Sql server 中出错:“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”

js进行字符串模式匹配

整数型数组组合成字符串

REGEX 匹配整数 6 到 10

当字符串不匹配时,我希望NULL返回而不是返回整数

您可以在字符串拆分中使用零宽度匹配正则表达式吗?