1

我在 VHDL 中有一个实体,它具有以下结构:

-- Imports...
entity myentity is
  port (..specifying in and out signals..);
end myentity;

architecture beh_myentity of myentity is
  begin
    process(..sensitivity list..)
      -- Some variables
      file myfile : text open write_mode 
                    is "myentlog.txt";  -- <== My problem is here!!!
        begin
          -- ..The process body..
    end process;
end beh_myentity;

打开文件没有问题,一切正常!我有个问题。当我创建一个测试台并运行它时,我通常会创建一个我的实体实例。但就我而言,我现在需要放置两个实例。我的问题是我将与文件名发生冲突,并且一个进程将不可避免地无法打开和写入(相同的)日志文件。

我想解决这个问题,所以这里有问题:

  1. 在我的端口中,我有信号,可以将信号值附加到文件名吗?恐怕这不是最好的事情(甚至不知道这样的事情是否可行)。

  2. 有没有办法在测试台中获取一个表示实体实例名称的变量?

  3. 有没有办法将字符串传递给实体,以便我可以将它附加到文件名的末尾?

谢谢

4

2 回答 2

3

尝试将文件名作为通用而不是端口传递。

http://www.ics.uci.edu/~jmoorkan/vhdlref/generics.html

于 2013-01-11T10:55:19.583 回答
3

字符串类型的信号,包含文件名;或泛型(同样是字符串类型)。

该信号允许您在测试台中的不同时间为同一实体分配不同的文件名 - 使用 VHDL-1993 或更高版本,架构可以file_open()使用新文件名调用。

泛型为每个不同的实体提供一个固定的文件名。

使用对您的应用程序最简单的方法。

您的具体问题:1)是的,如果信号是字符串,您可以将整个文件名作为字符串传递或传递后缀。因为您在运行时生成字符串,所以需要 VHDL-93(或更高版本)语法

process (...) is
file my_file;
begin
   file_open(my_file, base_name & suffix & ".txt", read_mode);
   ...
   file_close(my_file);
end process;

2) 最好的方法是在测试台中生成文件名并将其传入。但是实体的输出端口可以工作!自然不能合成这个实体...

3) 当然...

entity myentity is
  generic ( base_name : string := "testfile");
  port    (suffix : in string);
end myentity;

将传入您在 (2) 中需要的字符串。

如果您必须使用 VHDL-87 语法,如在您的示例中,将整个名称作为通用传递:

file myfile : text open write_mode is base_name;
于 2013-01-11T10:57:21.087 回答