>我有两个新手问题。我正在尝试将数据从数组输出到 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 中,此包不知道如何line
从 std_logic_vector
write(outline, a)
尝试。 所以如果你正在使用VHDL 2002,问题可能是由于系带支持std_logic_vector
write
过程中的参数。
非标准 Synopsys 软件包std_logic_textio
在大多数中都可用工具,并包括用于std_logic_vector
的写入函数。 此包可以与:
library ieee;
use ieee.std_logic_textio.all;
VHDL 2008 标准std_logic_vector
在 std_logic_1164
包,所以你可能想检查你是否是模拟器使用 在 VHDL 2008 中支持此功能。 请注意,二进制和十六进制输出也支持 bwrite
和 hwrite
。
请注意,使用 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 工具吗?