我需要设计一个具有这种效果的无约束字符串的记录(如下)。现在该类型由于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 上以 FP(V)GA-Text 的名称找到它。它目前在定义字符串长度的组件上使用泛型,但不适合轻松绘制多种颜色的句子(多个组件的手动定位可以模仿这种效果,虽然很辛苦)
我知道无限硬件是不可能的,但我希望它尽可能地可重复使用和通用,以满足每个人的需求。如果这不是执行我的计划的正确方法,那么我该如何设计此功能。
看起来有一个关于这个主题的话题,但只有一个VHDL-2008 解决方案。我正在使用 Xilinx 14.5,我认为它不支持 VHDL-2008,因为它会产生该错误。
一种可能的解决方案可能是自定义类型的“&”连接函数,该函数将右侧元素相对于左侧元素重新定位以正确排列......但这并不理想。
更新(2013 年 7 月 17 日)
我的设计有一个巨大的缺陷。我正在为每个 text_line 元素制作一个全新的巨大字体 ROM。这已通过创建一个共享的 fontROM 和一个仲裁器来连接到 text_line 元素来解决。这个版本在GitHub 项目上。添加的另一个功能是彩色地图。由于您不能在记录中拥有不受约束的项目,因此我不得不将其拆分。
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"),