1

我需要设计一个具有这种效果的无约束字符串的记录(如下)。现在该类型由于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"),
4

2 回答 2

2

VHDL 语言有两个方面——一个用于原型设计和仿真,另一个用于硬件综合。在软件中,拥有动态内存和分配任意长度的字符串不是问题。

在您的情况下,您期望语言处理您的文本字符串并将其映射到门的示意图而没有任何约束,这是不可能的。

也许您可以通过将屏幕表示为例如 80x25 单元格以及每个单元格的 ASCII 代码和颜色代码来让您的生活更轻松。然后你可以以一些固定长度的字符块输出你的数据。

选择块的长度取决于您如何获取要输出的数据。另请注意,当前您正在尝试并行输出文本块及其颜色。

您也可以在您的记录中编码颜色+计数+bits_for_N_chars,然后记录大小将固定,您将不会有这个问题。

于 2013-07-16T00:21:36.697 回答
2

我认为您在这里尝试做的是一种典型的软件方法:您想立即发送包含所有必要数据的消息。

你应该考虑你的时间真的需要有多重要: * 你需要同时处理文本和颜色吗?* 您目前对 c 中的“内存分配”做了什么?如何适应硬件方法?

恕我直言,您会意识到您需要一些用户逻辑写入的静态内存。这必须有一些编码。然后用户逻辑给出一个开始信号来显示消息,即现在vga控制器将从其内部存储器中读取(用户逻辑刚刚写入编码字符串的地方)并将其显示在屏幕上。

现在,对于较小的显示尺寸,将完整的字符数组映射到外部可能是明智的,因此用户逻辑可以在一个写入周期中直接将字符和颜色代码写入所需的位置。然后,您的控制器可以以某个所需的刷新率定期更新屏幕。

当然,对于较大的显示尺寸,这种方法可能无法扩展,因为公开所有可用的字符位置将需要大型地址总线并将底层逻辑公开给用户,从长远来看这是不可取的:您的实现更改和接口可能坏了。

编辑:可能看一下 opencores 或类似设备上的 VGA 核心,以获得适当接口的总体思路。

于 2013-07-18T15:22:15.343 回答