文本输出文件未实例化



>我有两个新手问题。我正在尝试将数据从数组输出到 vhdl 上的文本文件中。尽管参考了许多在线指南来执行此操作,但我总是想出一个"文件不存在"。关于出了什么问题的任何建议?

其次,当我尝试使用下面的数组信号作为写入函数的参数时,它会给出错误。我还如何使用非常量数据作为操作数?

entity Top_Module is
Port ( clk : in  STD_LOGIC);
end Top_Module;
architecture Behavioral of Top_Module is
type array_1 is array (0 to 127) of integer range -128 to 127;
signal sample_1: array_1  := (104,40,-40,-104,-128,-104,-40,40,104,127,104,40,40,-4);
constant  a :std_logic_vector(3 downto 0):= "0111";
begin

process(clk)    -- process for writing the outputs to the "*.txt" file
file result_file: text  is out "fft_output.txt";
variable outline:line;
constant tmp_fft:integer:=0;
begin
    if(clk'event and clk='1') then
                --tmp_fft  :=to_integer(signed(sample_1));
                write(outline,a);
                writeline(result_file,outline);
    end if;
end process;

文件声明是 VHDL 1987 语法,因此请尝试使用以下内容:

file result_file : text open write_mode is "fft_output.txt";

您的代码没有显示它,但我假设您包含std.textio包喜欢:

library std;
use std.textio.all;

在 VHDL 2002 中,此包不知道如何linestd_logic_vector write(outline, a)尝试。 所以如果你正在使用VHDL 2002,问题可能是由于系带支持std_logic_vectorwrite过程中的参数。

非标准 Synopsys 软件包std_logic_textio在大多数中都可用工具,并包括用于std_logic_vector的写入函数。 此包可以与:

library ieee;
use ieee.std_logic_textio.all;

VHDL 2008 标准std_logic_vectorstd_logic_1164包,所以你可能想检查你是否是模拟器使用 在 VHDL 2008 中支持此功能。 请注意,二进制和十六进制输出也支持 bwritehwrite

请注意,使用 write 和一般textio进行合成是不可能的,因为它们基于 line 类型,该类型又是一种access类型,类似于其他语言中的指针类型,并且无法合成。 对于合成,请使用David Koontz答案中的slv_image函数。

除了Morten的回答之外,您也没有表示聚合默认值中sample_1的每个元素,这可以通过在右括号前附加, others => 0来治愈。

由于您的 VHDL 设计规范在其他方面符合 IEEE Std 1076-1987 标准,所以我使用 ghdl 的 --std=87 标志使用我坐着的字符串转换例程进行了一些生成。(-1987 年缺乏"VALUE"是一个麻烦(:

library ieee;
use ieee.std_logic_1164.all;
use std.textio.all;
entity Top_Module is
Port ( clk : in  std_logic);
end Top_Module;
architecture Behavioral of Top_Module is
    function slv_image(constant inp: std_logic_vector) return string is
        variable image_str: string (1 to inp'length);
        alias input_str:  std_logic_vector (1 to inp'length) is inp;
    begin
        for i in input_str'range loop
            case input_str(i) is
                when 'U' => image_str(i) := 'U';
                when 'X' => image_str(i) := 'X';
                when '0' => image_str(i) := '0';
                when '1' => image_str(i) := '1';
                when 'Z' => image_str(i) := 'Z';
                when 'H' => image_str(i) := 'H';
                when 'L' => image_str(i) := 'L';
                when 'W' => image_str(i) := 'W';
                when '-' => image_str(i) := '-';
            -- image_str(i) := character'VALUE(std_ulogic'IMAGE(input_str(i)));
            end case;
        end loop;
        return image_str;
    end;
    type array_1 is array (0 to 127) of integer range -128 to 127;
    signal sample_1: array_1  := (104,40,-40,-104,-128,-104,-40,40,104,127,104,40,40,-4, others => 0);
    constant  a : std_logic_vector(3 downto 0):= "0111";
begin
Unlabelled:
    process(clk)    -- process for writing the outputs to the "*.txt" file
        file result_file: text  is out "fft_output.txt";
        -- file result_file : text open write_mode is "fft_output.txt";
        variable outline: line;
        constant tmp_fft:integer := 0;
    begin
        if(clk'event and clk='1') then
                    --tmp_fft  :=to_integer(signed(sample_1));
                    write(outline,slv_image(a));
                    writeline(result_file,outline);
        end if;
    end process;
end Behavioral; -- architecture;

带测试台:

library ieee;
use ieee.std_logic_1164.all;
entity tb_topmod is
end tb_topmod;
architecture foo of tb_topmod is
    signal clk:  std_logic := '0';
    component Top_Module   -- no is
        Port ( clk : in  std_logic);
    end component;
    for DUT: Top_Module use entity work.Top_Module(Behavioral);
begin
DUT:
    Top_Module   -- entity work.Top_Module
        port map (clk => clk);
CLOCK:
    process
    begin
        wait for 20 ns;
        clk <= not clk;
        if Now > 100 ns then
            wait;
        end if;
    end process;
end foo;

ghdl -a --std=87 topmod.vhdl
ghdl -e --std=87 tb_topmod foo
GHDL -R tb_topmod foo

(

分析、阐述和运行(模拟(设计。

该文件fft_output.txt包含:

更多FFT*
0111
0111
0111

这是测试台CLOCK过程中Now测试的预期输出。您的设计规范仅提供 a 的默认值。

现在你真的在使用 VHDL -1987 工具吗?

相关内容

  • 没有找到相关文章

最新更新