我需要使用具有此效果的无约束字符串设计记录(如下所示)。现在该类型由于Type for a record element may not be an unconstrained array
错误而未合成。
type type_textChunk is
record
text: string;
color: std_logic_vector(7 downto 0); -- "111" & "111" & "11"
end record;
type type_textPassage is array(natural range <>) of type_textChunk;
这样我就可以拥有一个文本块,其中包含多个可变长度和颜色的部分。这将用于VGA显示的文本模块。
我已经有了不使用这个新发现的设计的工作版本。您可以在GitHub under the name FP(V)GA-Text找到它。它目前在组件上使用了泛型,它定义了字符串的长度,但不适合轻松绘制多种颜色的句子(多个组件的手动定位可以模仿这种效果,虽然很费劲)
我知道无限硬件是不可能的,但我希望这可以重复使用和通用,以满足每个人的需求。如果这不是我的计划的正确方法,那么我该如何设计这个功能。
看起来有topic on the subject但只有VHDL-2008 solution。我使用的是Xilinx 14.5,我相信它不支持VHDL-2008,因为它产生了这个错误。
可能的解决方案可能是“&amp;”自定义类型的连接函数,它将右侧元素相对于左侧元素重新定位,以使其正确排列...但这并不理想。
我的设计存在很大的缺陷。我为每个text_line元素制作了一个全新的巨大字体ROM。这已通过创建共享fontROM和仲裁器以与text_line元素接口来解决。此版本位于GitHub project。添加的另一个功能是颜色映射。由于您不能在记录中包含无约束的项目,因此我必须将其拆分。
type type_textColorMap is array(natural range <>) of std_logic_vector(7 downto 0);
每个角色都有一种颜色。我希望您可以使用others => ...
语法但它在实体实例化中不喜欢它,因此您必须使用更复杂,更难维护的语法。目标语法类似于:colorMap => (others => "111" & "111" & "11", 2 => "111" & "000" & "00"),
但你必须使用:
colorMap => (10 downto 0 => "111" & "111" & "11"),
或混合搭配颜色:
colorMap => (7 downto 4 => "111" & "111" & "11", 3 downto 2 => "111" & "000" & "00", 1 downto 0 => "111" & "111" & "11"),
答案 0 :(得分:2)
VHDL语言有两个方面 - 一个用于原型设计和仿真,另一个可用于硬件。在软件中,拥有动态内存和分配任意长度字符串不是问题。
在您的情况下,您希望语言能够处理您的文本字符串并将其映射到门的原理图而不受任何约束,这是不可能的。
也许你可以通过将屏幕表示为例如让你的生活更轻松。每个单元格具有ASCII码和颜色代码的80x25单元格。然后,您可以在一些固定长度的char块中输出数据。
选择块的长度取决于您输出数据的方式。另请注意,目前您正在尝试并行输出文本块及其颜色。
您还可以在记录中对color + count + bits_for_N_chars进行编码,然后记录大小将被修复,您将不会遇到此问题。
答案 1 :(得分:0)
我认为您在这里尝试的是一种典型的软件方法:您希望直接发送包含所有必要数据的消息。
你应该考虑你的时间真正需要的重要性: *您是否需要并行处理文本和颜色? *您目前对c中的“内存分配”做了什么,以及如何针对硬件方法进行调整?
恕我直言,你会发现你需要一些用户逻辑写入的静态内存。这将必须有一些编码。然后用户逻辑给出一个开始信号来显示消息,即现在vga控制器将从其内部存储器读取(用户逻辑刚写入编码的字符串)并在屏幕上显示。现在,对于较小的显示尺寸,将完整字符数组映射到外部可能是明智的,因此用户逻辑可以在一个写周期中直接将字符和颜色代码写入所需位置。然后,您的控制器可以以某种所需的刷新率定期更新屏幕。
当然,对于更大的显示尺寸,这种方法可能无法扩展,因为暴露所有可用的字符位置将需要大的地址总线并向用户公开底层逻辑,从长远来看这是不可取的:您的实现更改和界面可能会被破坏。
编辑:可能会看一下opencores等上的VGA内核,以获得适当界面的一般概念。