这里有一些问题。
首先,HDL综合工具进行了大量的优化。这基本上意味着如果你没有正确地将输入和输出部分连接到某些东西,或者很可能(但不是肯定的话)被优化器消除。
第二是你必须非常小心循环和功能。基本上循环将被展开并且函数将被内联,因此少量代码可以生成大量逻辑。
第三是在某些情况下,数组将被转换为内存元素。
正如评论中所指出的,这个循环是大量内存使用的根本原因。
for j in 0 to 83 loop for i in 0 to 5 loop pixels((j*6) + i) <= getByte(msg(j+1), i); end loop; end loop;
这有可能使用大量的内存资源。每次调用“getByte”都需要一个读取端口(部分)“ram”,但是blockrams只有两个读取端口。所以“ram”会被复制以满足更多读取端口的需求。内循环正在读取相同位置的不同部分,因此外循环的每次迭代基本上都需要在ram上有一个独立的读端口。所以这是大约40个公羊的副本。读取旋风2数据表每个副本将需要2 m4k块
那么,当你使用数字而不是变量a,b,c和d时,为什么不会发生这种情况呢?
如果编译器可以找出某个常量,它可以在编译时计算它。这将限制必须实际转换为内存块的“像素”调用的数量,而不是仅仅将其结果硬编码。我仍然感到惊讶它降到零。
我注意到你的代码实际上没有任何输入,除了时钟和“rx”输入实际上似乎没有被用于任何东西,所以很可能合成器可能正在搞清楚在构建时很多东西。通常消除一位代码可以允许消除另一位,直到你什么都没有。