Q:

difference of two number from set of numbers input from file in VHDL

i am trying to find difference of two numbers from set of number available in file. "read.txt" contain numbers as
5
15
25
36
98
654
256
20
354
and i want output as 10 10 11 62 556 398 236 334
but i am getting in my output file "realout.txt" as 0
0
10
11
556
236
236
236
236
236
236
i don't know why every time at starting position 0 is printed and at the end number is repeated 5 times more..please help me to solve this problem my code is here.
library IEEE;
library std;
use ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use ieee.numeric_std.all;
use IEEE.MATH_REAL.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.STD_LOGIC_TEXTIO.ALL;
use std.textio.all; --include package textio.vhd

entity testvhdl is
end testvhdl;
architecture Behavioral of testvhdl is
constant MAX : integer := 256*256-1;
SIGNAL rstb :  std_logic := '0';
SIGNAL clk :  std_logic := '0';
SIGNAL a :  std_logic_vector(7 downto 0) := (others=>'0');
--Outputs
SIGNAL sum :  std_logic_vector(7 downto 0);
--period of clock,bit for indicating end of file.
signal endoffile : bit := '0';
signal d1,d2,intt,n: integer:=0;
signal aa,ab,ac: integer:=0;
signal linenumber : integer:=1;
--signal dbus: std_logic_vector(7 downto 0) := x"00";
--------------------------------------------------------------------------------------------
function CONV_STDLV8bit_2INT(ARG: std_logic_vector (7 downto 0)) 
return integer is
variable int: integer:=0;
variable tmp: std_logic_vector(7 downto 0);

begin
    int :=0;
    tmp := ARG;
    for i in 0 to 7 loop
        if (tmp(i) ='1') then
            int := int+(2**i);
        else 
            int := int+0;
        end if;
    end loop;
    return int; 
end CONV_STDLV8bit_2INT;
--------------------------------------------------------------------------------------------
function CONV_INT2STDLV(ARG: INTEGER; SIZE: INTEGER) 
return STD_LOGIC_VECTOR is
variable result: STD_LOGIC_VECTOR (SIZE-1 downto 0):=x"00";
variable temp: integer:= 0;
begin
    temp := ARG;
    for i in 0 to SIZE-1 loop
        if ((temp mod 2) = 1) then
            result(i) := '1';
        else 
            result(i) := '0';
        end if;
        if temp > 0 then
            temp := temp / 2;
        elsif (temp > integer'low) then
            temp := (temp - 1) / 2; -- simulate ASR
        else
            temp := temp / 2; -- simulate ASR
        end if;
    end loop;
    return result; 
end CONV_INT2STDLV;
--------------------------------------------------------------------------------------------
    constant PERIOD : time := 20 ns;
    constant DUTY_CYCLE : real := 0.5;
    constant OFFSET : time := 30 ns;

begin

-- Instantiate the Unit Under Test (UUT)
--uut: imadder PORT MAP(
--      rstb => rstb,
--      clk => clk,
--      a => a,
--      b => b,
--      sum => sum
--  );

CLOCK: PROCESS    -- clock process for clk
        BEGIN
            WAIT for OFFSET;
            CLOCK_LOOP : LOOP
                clk <= '0';
                WAIT FOR (PERIOD - (PERIOD * DUTY_CYCLE));
                clk <= '1';
                WAIT FOR (PERIOD * DUTY_CYCLE);
            END LOOP CLOCK_LOOP;
    END PROCESS;

tb: PROCESS
    BEGIN
        rstb <='0';
        wait for 60ns;
        rstb <='1';
        wait for 1312us; -- will wait forever

    END PROCESS;

reading : process
    file infile : text is in "real.txt"; --declare input file 1987
    file outfile : text is out "realout.txt"; --declare output file 1987

    --file infile2 : text is in "img2.txt"; --declare input file 1987
    variable inline,inline2 : line; --line number declaration
    variable dataread1 : integer;
    variable dataread2 : integer;
    variable buff_out : line; --line number declaration
--  variable aa,ab,ac: integer:=0;
    begin
        wait until clk = '0' and clk'event;
        if(n < 10) then
            if (not (endfile(infile))) then --checking the "END OF FILE" is not reached.
                    readline(infile, inline);
                    readline(infile, inline2);
                    read(inline, dataread1);
                    read(inline2, dataread2);
                    d1 <= dataread1;
                    d2 <= dataread2;
--          if n mod 5 = 0 then
                    aa <= abs(d1 - d2);
--                  a <= CONV_INT2STDLV(aa,8);
--                  
--       n <= n+1;
--      elsif (d1 > aa) then
--          ab <= d1 - aa;
--          ac <= ac+ab;
--          aa <= d1;
--          
--     else
--       ab <= aa - d1;
--       ac <= ac+ab;
--       aa <= d1;
--       
--       end if;    
--      d1 <= ac;
                    --readline(infile2, inline2); 
                    --read(inline2, dataread1);
                    --d2 <=integer(dataread1);
                --b <= CONV_INT2STDLV(d2,8);
            else
                a<=x"00";

                --b<=x"00";
            end if;
        else    
          endoffile <='1'; --set signal to tell end of file read file is reached.
        end if;
--  end process reading;

--write process @negative edge
--writing : process

--  begin
--      wait until clk = '0' and clk'event;
        if(endoffile='0') then --if the file end is not reached.
            --intt <= CONV_STDLV8bit_2INT(aa);
            if(linenumber > 0) then
                n <= n+1;
                --if(linenumber>11) then
                write(buff_out, aa);  
                writeline(outfile, buff_out);-- write line to output_image text file.
                --end if; 
          end if;      
                linenumber <= linenumber + 1;
        else
            null;
        end if;
    end process reading;

end Behavioral;

--WRITE (buf, string'("hello"));
--WRITELINE(fileptr,buf);
--WRITE (buf, bit_vector'(" 010111 "));
--WRITELINE(fileptr,buf);

--http://myfpgablog.blogspot.in/2011/12/memory-initialization-methods.html
-- constant MEM_DEPTH : integer := 2**ADDR_WIDTH;
-- type mem_type is array (0 to MEM_DEPTH-1) of signed(DATA_WIDTH-1 downto 0);
-- impure function init_mem(mif_file_name : in string) return mem_type is
    -- file mif_file : text open read_mode is mif_file_name;
    -- variable mif_line : line;
    -- variable temp_bv : bit_vector(DATA_WIDTH-1 downto 0);
    -- variable temp_mem : mem_type;
-- begin
    -- for i in mem_type'range loop
        -- readline(mif_file, mif_line);
        -- read(mif_line, temp_bv);
        -- temp_mem(i) := signed(to_stdlogicvector(temp_bv));
    -- end loop;
    -- return temp_mem;
-- end function;

-- constant mem : mem_type := init_mem("mem_init_vhd.mif");

A:

...i don't know why every time at starting position 0 is printed and at the end number is repeated 5 times more..please help me to solve this problem my code is here.
Besides the wild context clauses and all the extraneous noise there are two things observably wrong here.  First you proposed input data set for real.txt has an odd number of lines (elements - integers).  Second you are misapplying the BIT signal endofile:
reading : 
    process

        file infile : text is in "real.txt";
        file outfile : text is out "realout.txt"; 

        variable inline,inline2 : line;
        variable dataread1 : integer;
        variable dataread2 : integer;
        variable buff_out : line;

    begin
        wait until clk = '0' and clk'event;
        if(n < 10) then
            if (not (endfile(infile))) then 
                    readline(infile, inline);
                    readline(infile, inline2);
                    read(inline, dataread1);
                    read(inline2, dataread2);
                    d1 <= dataread1;
                    d2 <= dataread2;

                    aa <= abs(d1 - d2);
            else
                a<=x"00";
            end if;
        else    
          endoffile <='1'; 
        end if;

        if(endoffile='0') then 
            if(linenumber > 0) then
                n <= n+1;
                write(buff_out, aa);  
                writeline(outfile, buff_out);
          end if;      
                linenumber <= linenumber + 1;
        else
            null;
        end if;
    end process reading;

This is what your design with less than 20 integers on separate lines looks like:

As you can see from the waveform that results in the last value being repeated (the falling edge of the following clocks).
I added the 720 so it wouldn't get an integer read fail assertion.
The first two zeros are from not holding off output when rstb is true and a pipeline delay loading d0, d1 on a falling clock edge and then assigning aa on the next clock edge.  There isn't a pipeline signal to qualify aa as valid for output.
endofile will never get written to a '1' where that assignment is unless your data set is big enough.  n is counting input pairs of integers (pairs of lines):

So endofile should be fixed (on two counts, it's not set when an end of file condition is actually encountered, and the second readline is assumed to have been successful).
There's a third thing wrong, with enough data from real.txt you're missing the last absolute difference value in realout.txt, which says that pipeline signal specifying aa is valid should have a hold over as well as a hold off.
It might be easier to fix this by troubleshooting waveforms.
For the portion of your code not commented out the context clause should look like this:
library IEEE;
use ieee.std_logic_1164.all;
use std.textio.all;

