【问题标题】:Unconstrained Strings in VHDLVHDL 中的无约束字符串
【发布时间】: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 =&gt; ... 语法,但它不喜欢在实体实例化中使用它,因此您必须使用更简洁且不易维护的语法。目标语法类似于:colorMap =&gt; (others =&gt; "111" &amp; "111" &amp; "11", 2 =&gt; "111" &amp; "000" &amp; "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"),

【问题讨论】:

    标签: string types fonts vhdl


    【解决方案1】:

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

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

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

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

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

    编辑:可能看一下 opencores 或类似设备上的 VGA 核心,以大致了解适当的接口。

    【讨论】:

      【解决方案2】:

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

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

      也许您可以通过将屏幕表示为例如80x25 单元格,每个单元格带有 ASCII 代码和颜色代码。然后你可以输出一些固定长度的字符块。

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

      你也可以在你的记录中编码color+count+bits_for_N_chars,这样记录大小就固定了,你就不会有这个问题了。

      【讨论】:

      • 目前的 GitHub 项目设计可以更新为每个 text_line 组件具有自定义颜色,然后手动或创建函数来定位它们。甚至可以制作一个单独的数组来将颜色映射到每个字符(在我看来这实际上听起来很不错,这是您建议的派生词)。问题是,这个功能的最佳实现是什么,可以很容易地设置和开始在屏幕上绘图。感谢您的领导。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 2021-11-06
      • 1970-01-01
      相关资源
      最近更新 更多