我想制作一个关闭并再次打开文件的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"在这种情况下,不是文件本身的名称。当然,可以将文件名作为第二个参数传递,但在这种情况下,它不会非常简单(文件名具有运行时生成的元素)。
答案 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能够打开以供读取)。
添加了一个等待语句,以防止进程无限制地打开和关闭文件。你的程序体中也有一个缺失的开始。