我写了一段VHDL代码的图像处理。为了测试,我用Matlab和一个相对简单的测试平台创建了一个像素值文件(它只是填充从文件到输入的值)。我想将结果写入一个新文件,以便我可以处理它们并查看生成的图像。
代码编译和testbench运行,我看到我输入的所有报告,以检查它是否在任何地方停止,但带结果的文件仍为空。印刷品和写作线似乎都没有做任何事情。该文件存在并添加到Vivado中的项目中,因此我不必编写整个路径。模拟器输出中没有警告或错误。
我从here和here获得了对文件代码的写入,并对其进行了扩展,以便为每个时钟写入文件并在顶部添加标题。
color_out(0)是一段输出。 color_out_v输出有效。
有什么想法吗?我错过了什么?
Verify_data_process : process
variable my_line : line;
file l_file : TEXT; -- open write_mode is "color_out.txt";
begin -- process
file_open(l_file, "C:\Users\vevo\branches\Vivado_IP\repo\testing_data\color_out.txt", write_mode);
wait until clk128_tb = '1';
print(l_file, "R G B" );
if(color_out_v = '1') then
report "Color_out";
write(my_line, integer'(to_integer(color_out(0).R)));
write(my_line, integer'(to_integer(color_out(0).G)));
write(my_line, integer'(to_integer(color_out(0).B)));
writeline(l_file, my_line);
report "write line";
end if;
file_close(l_file);
end process;
答案 0 :(得分:1)
问题代码是每当clk128_tb有一个事件并且发现等于'1'时打开和关闭文件。
Minimal, Complete, and Verifiable example,问题的过程就是核心:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use std.textio.all;
entity color_out is
end entity;
architecture foo of color_out is
signal clk128_tb: std_logic := '0';
signal color_out_v: std_logic := '0';
type pixel is record
R: unsigned (7 downto 0);
G: unsigned (7 downto 0);
B: unsigned (7 downto 0);
end record;
type scan is array (0 to 3) of pixel;
signal color_out: scan := ( (X"FF", X"A0", X"FF"),
(X"7F", X"7F", X"7F"),
(X"00", X"FF", X"00"),
(X"C0", X"C0", X"C0") );
begin
Verify_data_process :
process
variable my_line: line;
file l_file: TEXT; -- open write_mode is "color_out.txt";
constant header: string := " R G B";
variable file_is_open: boolean;
begin -- process
if not file_is_open then
file_open (l_file, "color_out.txt", write_mode);
file_is_open := true;
-- print(l_file, "R G B" );
write(my_line, header);
writeline(l_file, my_line);
end if;
wait until rising_edge(clk128_tb ); -- wait until clk128_tb = '1';
-- print(l_file, "R G B" );
if color_out_v = '1' then
report "Color_out";
write(my_line, integer'image(to_integer(color_out(0).R)) & " ");
write(my_line, integer'image(to_integer(color_out(0).G)) & " ");
write(my_line, integer'image(to_integer(color_out(0).B)));
writeline(l_file, my_line);
report "write line";
end if;
-- file_close(l_file);
end process;
CLOCK:
process
begin
wait for 10 ns;
clk128_tb <= not clk128_tb;
if now > 100 ns then
wait;
end if;
end process;
STIMULIS:
process
begin
wait for 20 ns;
color_out_v <= '1';
wait;
end process;
end architecture;
更改包括仅打开文件一次而不是显式关闭它。当模拟结束时,文件将被隐式关闭,或者如果提供敏感性列表,则可以传递信号以明确地关闭文件。例如,当现在= TIME'HIGH时,信号可以提供交易。
也没有名为print的过程,它被一个常量标题字符串替换为对行缓冲区和写入行的写入。请注意,这仅在文件打开时发生一次。
使用rising_edge函数是习惯的力量。没有MCVe,代码就会有机地增长。
正如A. Kieffer所评论的那样,整数'使用了图像加上一些添加的格式空间。一行是对字符串的访问(指针),您将字符串写入一行。
运行时,上面给出了控制台输出:
ghdl -r color_out
color_out.vhdl:45:13:@ 30ns :(报告说明):Color_out
color_out.vhdl:50:13:@ 30ns :(报告说明):写行
color_out.vhdl:45:13:@ 50ns :(报告说明):Color_out
color_out.vhdl:50:13:@ 50ns :(报告说明):写行
color_out.vhdl:45:13:@ 70ns :(报告说明):Color_out
color_out.vhdl:50:13:@ 70ns :(报告说明):写行
color_out.vhdl:45:13:@ 90ns :(报告说明):Color_out
color_out.vhdl:50:13:@ 90ns :(报告说明):写行
color_out.vhdl:45:13:@ 110ns :(报告说明):Color_out
color_out.vhdl:50:13:@ 110ns :(报告说明):写行
文件color_out.txt包含:
R G B 255 160 255 255 160 255 255 160 255 255 160 255 255 160 255
color_out_v ='1'时每个rising_edge事件的一组像素值。使用局部静态索引0,它们总是相同的像素。
所以问题是每次唤醒进程时都会重复打开和关闭文件。
文件关闭后的file_open具有清除文件内容的效果,您将不会有任何结果。
参见IEEE Std 1076-2008 5.5.2文件操作第2段(摘录):
- 如果提供给Open_Kind参数的值是WRITE_MODE,则文件对象的访问模式是只写的。此外,外部文件最初为空。写入文件对象的值按写入顺序放在外部文件中。
答案 1 :(得分:0)
我无法发表评论,所以我将其作为答案发布。 像马修一样,我没有看到任何“编码问题”。虽然你正在写你的整数。尝试将它们转换为字符串,这可能是问题。
您可以使用此功能,例如:
FUNCTION to_string (value : integer) RETURN string IS
BEGIN
RETURN integer'image(value);
END FUNCTION to_string;