如何从VHDL中的文件变量中获取文件名字符串?

时间:2017-02-26 15:28:02

标签: vhdl

我想制作一个关闭并再次打开文件的VHDL程序。虽然该过程也会执行其他操作,但此操作实际上将文件倒回到开头。

但是,我找不到从文件句柄返回文件名的方法。

例如:

process 
    procedure close_and_open(file F : text) is
    begin
        file_close(F);
        file_open(F, "HERE_LIES_THE_PROBLEM", read_mode);
    end procedure
    file Fi : text;
begin 
    file_open(Fi, "example_file.txt", read_mode);
    close_and_open(Fi);
    wait;
end process;

似乎Fi' simple_name,instance_name和path_name仅引用名称" F1"在这种情况下,不是文件本身的名称。当然,可以将文件名作为第二个参数传递,但在这种情况下,它不会非常简单(文件名具有运行时生成的元素)。

1 个答案:

答案 0 :(得分:2)

您的文件句柄'你的例子中的句柄是一个字符串文字。

IEEE Std 1076-2008 5.5.2文件操作依赖于IEEE Std 1003.1-2004可移植操作系统接口(POSIX) - 见附件J.没有1003.1 POSIX方法从文件描述符中恢复路径名(用VHDL表示)由FILE对象)。

在代码中,当文字字符串表达式提供时,无法从file_open过程中恢复文件声明或external_name中的文件逻辑名称。没有要评估的命名对象。

您可以在运行时操作字符串表达式,方法是将其值分配给类型为string的访问类型的对象。这提供了一个表示字符串对象的对象名称。

将文件名参数从过程调用中移出是范围和可见性声明顺序练习,因为访问类型的对象的变量类。使用后缀 all (8.3 Selected names paragraph 5)的选定名称访问所表示对象的值。

构建Minimal Complete and Verifiable example

use std.textio.all;

entity close_open is
end entity;

architecture foo of close_open is

begin 
NOTLABELED:
    process
        type filename is access string;                 -- ADDED 
        variable file_name: filename;                   -- ADDED
        procedure close_and_open(file F : text) is
        begin                                           -- ADDED
            file_close(F);
            -- file_open(F, "HERE_LIES_THE_PROBLEM", read_mode);
            file_open(F, file_name.all, read_mode);     -- CHANGED 
        end procedure;
        file Fi : text;
    begin
        file_name := new string'("example_file.txt");   -- ADDED
        -- file_open(Fi, "example_file.txt", read_mode);
        file_open(Fi, file_name.all, read_mode);        -- CHANGED
        close_and_open(Fi);
        wait;                                           -- ADDED
    end process;

end architecture;

访问类型声明,访问类型变量的声明和过程体之间存在声明顺序依赖关系。

此示例分析,详细说明和运行(要求file_name能够打开以供读取)。

添加了一个等待语句,以防止进程无限制地打开和关闭文件。你的程序体中也有一个缺失的开始。