如何用VHDL将新行写入文件



我想在输出文件中用new line字符分隔数据,但以下代码导致错误"无法解决过程调用的过载":

write(out_line, "n"); 
write(out_line, ""); 
write(out_line, '');

我想如何使用它的示例代码:

ENTITY writer IS 
PORT ( clk : IN STD_LOGIC := '0'; start : IN STD_LOGIC := '0');
END ENTITY;
ARCHITECTURE arch OF writer IS
SIGNAL vect : STD_LOGIC_VECTOR (2 downto 0) := "000";
TYPE state_type IS (init, write_file);
SIGNAL state : state_type := init;
BEGIN
PROCESS (clk, start)
FILE out_file : text;
VARIABLE out_line : line;
BEGIN
IF rising_edge(clk) THEN
CASE state IS 
WHEN init => 
IF start = '1' THEN
state <= write_file;
ELSE 
state <= init;
END IF;
WHEN write_file =>
state => init;
FOR i IN 0 TO 10 LOOP
write(out_line, vect);
writeline(out_file, out_line);
-- write(out_line, "n"); <-- 
-- write(out_line, ""); <-- 
-- write(out_line, ''); <-- None of these work
writeline(out_file, out_line); 
END LOOP;
END CASE;
END IF;
END PROCESS;
END ARCHITECTURE;

所以我想知道,这在VHDL中可能吗?如果是,如何?

以下内容将始终为您提供一行空白:

write(out_line, string'(""));  
writeline(out_file, out_line);

我怀疑@Dani发布的内容可能与工具有关。例如,在一个流行的模拟器上,以下生成一个换行符:

write(out_line, LF);  
writeline(out_file, out_line);

然而,当我在LF后面添加空格时,我会得到两行:

write(out_line, LF & ' ');  
writeline(out_file, out_line);

从问题的不完整样本代码创建一个最小、完整和可验证的示例:

library ieee;  -- ADDED
use ieee.std_logic_1164.all;  -- ADDED
use std.textio.all;  -- ADDED
-- use ieee.std_logic_textio.all;  -- ADDED for revisions earlier than -2008
ENTITY writer IS 
-- PORT ( clk : IN STD_LOGIC := '0'; start : IN STD_LOGIC := '0');
END ENTITY;
ARCHITECTURE arch OF writer IS
SIGNAL vect : STD_LOGIC_VECTOR (2 downto 0) := "000";
-- TYPE state_type IS (init, write_file);
-- SIGNAL state : state_type := init;
BEGIN
PROCESS -- (clk, start)
FILE out_file : text;
VARIABLE out_line : line;
BEGIN
file_open(out_file, "some_file", WRITE_MODE);  -- ADDED
-- IF rising_edge(clk) THEN
--            CASE state IS
--                WHEN init =>
--                    IF start = '1' THEN
--                        state <= write_file;
--                    ELSE
--                        state <= init;
--                    END IF;
--                WHEN write_file =>
--                    state => init;
FOR i IN 0 TO 10 LOOP
write(out_line, vect);
writeline(out_file, out_line);
-- write(out_line, "n"); <-- 
-- write(out_line, ""); <-- 
-- write(out_line, ''); <-- None of these work
writeline(out_file, out_line); 
END LOOP;
-- END CASE;
-- END IF;
wait;  -- ADDED
END PROCESS;
END ARCHITECTURE;

演示了一种在输出中获得空行的方法:

some_file内容:

000
000
000
000
000
000
000
000
000
000
000

第二个CCD_ 2过程调用产生一个空行,而没有中间的CCD_ 3过程调用。

为什么见IEEE Std 1076-2008 16.4软件包TEXTIO:

程序包TEXTIO中声明的READLINE、WRITELINE和TEE读取和写入TEXT类型文件的整行。过程READLINE导致从文件中读取下一行,并将指定代表该行的对象的访问值作为参数L的值返回。如果参数L在调用开始时包含非null访问值,则过程可以解除分配该值指定的对象。线的表示不包含线末端的表示。如果在对READLINE的调用中指定的文件未打开,或者如果打开,则该文件具有只读以外的访问模式(请参见5.5.2),则这是一个错误。程序WRITELINE和TEE分别导致参数L指定的当前行写入文件,并返回指定空字符串的参数L值Procedure TEE还会将当前行写入文件OUTPUT如果参数L在调用开始时包含一个null访问值,则会向一个或多个文件写入一个null字符串如果参数L在调用开始时包含非null访问值,则过程可能会解除分配该值指定的对象。如果在对WRITELINE或TEE的调用中指定的文件未打开,或者如果打开,则该文件具有除只写之外的访问模式,则这是一个错误。

该语言没有定义行末尾的表示形式。实现应允许将CHARACTER和STRING类型的所有可能值写入文件。但是,由于允许实现使用CHARACTER和STRING类型的某些值作为行分隔符,因此可能无法从TEXT文件中读取这些值。

换行(LF)格式效应器作为写入TEXT类型文件的字符串元素出现,使用WRITELINE或TEE过程,或使用为TEXT类型隐式定义的WRITE操作,被实现解释为表示行的结束。实现应将LF转换为实现定义的线末端表示。

对于每个WRITE、OWRITE和HWRITE过程,在数据被附加到由参数L指定的字符串值之后,L指定整行。该过程可以在调用开始时修改由参数L指定的对象的值,或者可以解除分配该对象。

如果发生解除分配,out_line将在writeline调用后具有null值,并且在紧接着的writeline调用中写入null字符串,该调用还提供行结束。

如果out_line访问的对象值是一个空数组(没有元素,5.3.2.2索引约束和离散范围,一个空字符串),则紧接着的writeline调用将导致行尾写入文件。

从本质上讲,您的代码示例已经包含了其中一种用于写入空行的方法,这取决于是否有条件地使用deallocation(可能)。

allocate()和free()的变体在执行时间方面可能相对昂贵,并且当已知所分配对象的大小及其元素大小时,可以将较小的"已分配"对象写入同一对象空间,从而节省模拟时间。数组对象的模拟内核表示可以具有与数组值分离的边界,当对象大小大于先前分配的大小或发生显式deallocate调用时,可以保留解除分配和重新分配。

还有一个要求是,在对文件的写入中,实现将LF字符转换为行尾。这是另一种机制,允许您将LF字符作为最后一个或唯一一个字符写入一行,并获得后面的空白行。

您也可以显式地向out_line写入一个空字符串

write(out_line, string'(""));

在第二次CCD_ 11呼叫之前。限定表达式提供字符串文字的类型,这与原始问题中注释掉的尝试不同,在原始问题中无法确定字符串文字的种类。参见9.3.2文字";。。。字符串或位字符串文字的类型应仅根据文字出现的上下文来确定,不包括文字本身,但使用文字类型应为字符类型的一维数组这一事实&";。在这种情况下,过程write是不明确的,无法解决过载问题(12.5过载解决的情况)。

经过大量搜索和尝试,我发现以下代码有效:

write(out_line, lf);  
writeline(out_file, out_line);

我发现write(out_line, cr);做同样的事情,write(out_line, nul);在输出之间添加' '字符。

最新更新