【问题标题】:VHDL const string array with different length不同长度的VHDL const字符串数组
【发布时间】:2018-06-21 16:50:51
【问题描述】:

例如,我想在 Testbench 中创建一个字符串列表来加载不同的文件。

我试过了:

type tastring ARRAY(iADCCount_C-1 downto 0) of string;
constant Filenames     : tastring := ("file.txt",
                                      "anotherfile.txt",
                                      "jetanotherfile.txt");

数组中不可能有可变长度的字符串。

还有:

type tpstring is access string;
type tpastring is ARRAY(iADCCount_C-1 downto 0) of tpstring;
constant Filenames     : tpastring := (new string'("file.txt"),
                                       new string'(anotherfile.txt"),
                                       new string'(jetanotherfile.txt"));

不工作!您不能将访问类型设为常量。我错过了什么吗?有没有办法在不将它们填充到相同大小的情况下制作一个字符串列表?

【问题讨论】:

标签: arrays string constants vhdl string-length


【解决方案1】:

你几乎是正确的:)

第二个代码sn-p必须使用变量,因为访问类型只能用于类型变量的对象。

type line_vector is array(iADCCount_C-1 downto 0) of line;
variable Filenames : line_vector := (
  new string'("file.txt"),
  new string'("anotherfile.txt"),
  new string'("jetanotherfile.txt")
);

注意 1:添加了缺少的 " 字符。
注2:类型line已在VHDL中定义。
注3:类型line_vector将由VHDL-2017定义。

作为替代方案,您可以使用字符NUL 填充所有字符串。您可能想要实现两个函数来调整字符串的大小以适应常量的大小并修剪字符串(删除尾随的 NUL 字符。

【讨论】:

  • OP 的第二个 sn-p 和您的答案都是无效的 VHDL,缺少在初始值聚合的第二个和第三个关联元素表达式中分隔字符串文字开头的双引号。从 IEEE Std 1076(LRM)修订版 -2000 起,共享变量必须是受保护的类型。共享变量将允许 OP 测试台中的多个进程语句通过受保护的类型方法访问文件名。
  • @user1155120 修复了缺少的引号。它是 OP 代码 sn-p 的副本。他没有表示要在架构中使用他的代码。因此,如果在流程中使用它,它将是有效的 - 但不寻常,对吧?
【解决方案2】:

this answer。 AFAIK 不可能有可变长度字符串的数组。

如果您按照答案中的建议实现自定义修剪功能,请尝试使用文件名中不存在的固定间距字符(如 Windows 的 ?),因为它还可以确保 NUL 字符或其他非打印字符没有问题使用不同的合成工具可能会导致打嗝。

【讨论】:

  • 是的,但他的第二个示例尝试使用指向不同长度字符串的指针。他只需要使用一个变量而不是一个常量。
猜你喜欢
  • 2019-12-17
  • 2023-01-26
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多