En un determinado banco de pruebas de simulación que usa questasim, estoy tratando de leer los archivos con números enteros que parecen,
0000
0001
0005
3864
2290
1234
.
.
.
0002
0004
0006
4532
3457
.
.
.
Mi objetivo aquí es leer el archivo de texto, almacenar los primeros números en una matriz de enteros y escribir esa matriz en la salida de texto, mi intento de código parece,
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_textio.all;
use std.textio.all;
entity HFA_tb is
end HFA_tb;
architecture behave of HFA_tb is
--clock 100 MHz change to any value suitable
constant c_CLOCK_PERIOD : time:= 100 ns;
signal r_CLOCK : std_logic := '0';
--**signal r_ENABLE : std_logic := '0';
signal r_adcpulse : integer;
signal r_hitstart : integer; ---output of single threshold
signal r_hitend : integer;
signal r_hitpeak : integer;
signal r_peaktime : integer;
signal r_hitsum : integer;
signal r_opready : std_logic := '0';
--more signal
--describe HFA component here (Unit Under Test)
component HFA is
port (
adcpulse_i : in integer;
clk : in std_logic;
hitstart_o : out integer; ---output of single threshold
hitend_o : out integer;
hitpeak_o : out integer;
peaktime_o : out integer;
hitsum_o : out integer;
opready_o : out std_logic
);
end component HFA;
begin
--Instatiate the unit under test
UUT : HFA
port map (
clk => r_CLOCK,
adcpulse_i => r_adcpulse,
hitstart_o => r_hitstart,
hitend_o => r_hitend,
hitpeak_o => r_hitpeak,
peaktime_o => r_peaktime,
hitsum_o => r_hitsum,
opready_o => r_opready
);
p_CLK_GEN : process is
begin
wait for c_CLOCK_PERIOD/2;
r_CLOCK <= not r_CLOCK;
end process p_CLK_GEN;
--main testing logic for reading from text file; feed in the loop and check output
process
file in_buffer : text;
file out_buffer : text;
variable v_ILINE : line;
variable v_OLINE : line;
variable v_adcValue : integer;
variable line_counter : integer :=0;
variable block_length : integer :=0;
variable block_counter : integer :=0;
variable header_length : integer :=0;
type header is array (0 to 2) of integer;
variable H: header;
begin
file_open(in_buffer,"/home/eu18461/Data/DUNE/QuestaSim_Examples/HFA_test4_SliceTest/sample.txt",read_mode);
file_open(out_buffer,"/home/eu18461/Data/DUNE/QuestaSim_Examples/HFA_test4_SliceTest/results.txt",write_mode);
while not endfile(in_buffer) loop
if line_counter=0 then
f1 : for k in 0 to 2 loop
readline(in_buffer, v_ILINE);
read(v_ILINE, v_adcValue);
H(k) := v_adcValue;
line_counter := line_counter+1;
end loop f1;
end if;
if line_counter /= 2 and block_length /= 9 then
f2 : for k in 0 to 2 loop
readline(in_buffer, v_ILINE);
read(v_ILINE, v_adcValue);
r_adcpulse <= v_adcValue;
line_counter := line_counter+1;
block_length := block_length+1;
end loop f2;
end if;
if block_length=9 then
f3 : for k in 0 to 2 loop
readline(in_buffer, v_ILINE);
read(v_ILINE, v_adcValue);
H(k) := v_adcValue;
line_counter := line_counter+1;
header_length := header_length+1;
if header_length=3 then
block_length := 0;
exit;
end if;
end loop f3;
end if;
wait for c_CLOCK_PERIOD;
end loop;
if endfile(in_buffer) then
write(v_OLINE, string'("hit_start_time"));
writeline(out_buffer, v_OLINE);
write(v_OLINE, r_hitstart);
writeline(out_buffer, v_OLINE);
end if;
wait for c_CLOCK_PERIOD;
file_close(in_buffer);
file_close(out_buffer);
wait;
end process;
end behave;
Se actualizó el código, el texto de salida deseado debería ser similar,
Int1 int2 int3 Op1 op2 op3 Op3 ...
Int11 int12 int13 op1 op2 op3 ...
.
.
.
Intx inty intZ op1 op2 op3 ...
Aquí int1, Int2 ... etc. representan los enteros del archivo de texto de entrada, estos no. Sube hasta una longitud de bloque fija. Quiero almacenarlos, y enviar los enteros restantes a mi bloque de procesamiento, después del proceso quiero que se muestren en formato de fila como se muestra en el archivo de texto y repito el proceso nuevamente. Cualquier consejo será muy apreciado. Aquí el bucle for no. indique los enteros que almacenan la longitud y la longitud del bloque después de lo cual se repite el proceso.