【发布时间】:2013-07-14 00:04:39
【问题描述】:
我需要设计一个具有这种效果的无约束字符串记录(如下)。由于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,因为它会产生该错误。
一个可能的解决方案可能是自定义类型的“&”连接函数,该函数将右侧元素相对于左侧元素重新定位以使其正确排列...但这并不理想。
更新(2013 年 7 月 17 日)
我的设计存在巨大缺陷。我正在为每个 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"),
【问题讨论】: