编译时quartus_map.exe上的Quartus Stack溢出

时间:2017-11-24 05:36:59

标签: vhdl stack-overflow quartus

编译我的VHDL VGA-Project Quartus时给出了以下响应:

[Error-Message while compiling PRoject][1]

在报告中,我可以找到以下信息:

问题详情 错误:

*** Fatal Error: Stack Overflow
Module: quartus_map.exe
Stack Trace:
    0xc9dbb: vrfx_add_to_extractor_migration_report + 0x1e00b (synth_vrfx)
    0xca52a: vrfx_add_to_extractor_migration_report + 0x1e77a (synth_vrfx)
    0xca52a: vrfx_add_to_extractor_migration_report + 0x1e77a (synth_vrfx)
    ....100 times the same

End-trace


Executable: quartus_map
Comment:
None

System Information
Platform: windows64
OS name: Windows 7
OS version: 6.2

Quartus II Information
Address bits: 64
Version: 14.1.0
Build: 186
Edition: Web Edition

互联网对此问题的信息很少见。

我正在考虑的是我打算用VGA和带有char形状信息的长数组在VGA上绘制文本。 每个char(大约100个)包含一个带有加法运算符的80x2 2d数组,例如:

when '0' => temp := ((4 + X, 4 + Y), (4 + X, 5 + Y), (4 + X, 6 + Y), (4 + X, 7 + Y), (4 + X, 8 + Y), (5 + X, 3 + Y)....

当我尝试在屏幕上显示2行文字(大约80个字符)时,工作正常,但它也给了我一个警告:

组合逻辑的深度超过6000,这可能导致堆栈溢出。

编译器崩溃超过2行,并提供错误报告。

也许一种解决方案是将位置数组写得更短,但是如何?任何人都有理想吗?

问候马丁。

1 个答案:

答案 0 :(得分:0)

您只是产生了太多的组合存储空间。这里有两个问题:

  1. 什么都没有计时,所以你正在产生大量的组合逻辑。您需要了解同步设计和时钟流程。我不想尝试在这里教学。
  2. 你在这里存储每一个动作(位图图形中的位,顶点图形中的顶点),这是非常昂贵的。回到文本处理方式,然后以合理的代价实现位图图形:到字符生成器。
  3. 这里的洞察力(或人为强加的约束)是每个" A"你画的看起来一样;因此,您可以重复使用绘制它所需的顶点。

    type CHAR_SET is ('A','B','C','1','2','3'); 
    -- you may find a suitable character set like ASCII or LATIN-1 already declared in library STANDARD
    
    type ARRAY_CHAR is array (67 downto 0, 1 downto 0) of integer;     
    --defines how to draw a single character, relative to its own origin
    type ARRAY_CHAR_SET is array (CHAR_SET) of ARRAY_CHAR;     
    --Character Generator, defines how to draw every character
    constant CHARACTER_SET : ARRAY_CHAR_SET := ( ...);
    -- or signal ... more than one CHARACTER_SET would allow more fonts 
    type ARRAY_TEXT is array (natural range <>) of CHAR_SET;  
    -- for each position on screen, defines which character to draw. For a character set with less than 256 chars, this needs only one byte per character.
    
    function DRAW_CHAR (location) return ARRAY_CHAR is
        variable Char : CHAR_SET;
    begin
        -- lookup which char to draw
        Char := ARRAY_TEXT(location); 
        -- offset its origin to the on-screen location
        return OFFSET_ORIGIN(location, CHARACTER_SET(Char));
    end DRAW;