Перейти к содержанию
    

Не работает конечный автомат вместе с readline()

Добрый день.

Возникла проблема при чтении данных из файла.

Как только добавляю строку readline(infile, inline); конечный автомат перестает работать.

Срабатывает условие when 0, state принимает значение 1 и все на этом. (значение state проверил, когда назначил его signal)

В чем может быть проблема?

 

        variable state : integer range 0 to 5:= 0;
        
    begin
        if(rising_edge(clk)) then
            if(endfile(infile)) then                                                                               --checking the "END OF FILE" is not reached.
            else
                readline(infile, inline);                                                                           --reading a line from the file.
--                for kk in 0 to NUM_COL-1 loop
--                    read(inline, dataread(kk));
--                    --data_tmp(kk)<= conv_std_logic_vector(dataread(kk), 16);
--                end loop;
                
                case state is
                when 0 => 
                        data_tmp <= "0000000000001000";
                        state:= state + 1;
                when 1 => 
                        data_tmp <= "0000000000000001";
                        state:= state + 1;
                when 2 =>

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день.

Возникла проблема при чтении данных из файла.

Как только добавляю строку readline(infile, inline); конечный автомат перестает работать.

Срабатывает условие when 0, state принимает значение 1 и все на этом. (значение state проверил, когда назначил его signal)

В чем может быть проблема?

 

        variable state : integer range 0 to 5:= 0;
        
    begin
        if(rising_edge(clk)) then
            if(endfile(infile)) then                                                                               --checking the "END OF FILE" is not reached.
            else
                readline(infile, inline);                                                                           --reading a line from the file.
--                for kk in 0 to NUM_COL-1 loop
--                    read(inline, dataread(kk));
--                    --data_tmp(kk)<= conv_std_logic_vector(dataread(kk), 16);
--                end loop;
                
                case state is
                when 0 => 
                        data_tmp <= "0000000000001000";
                        state:= state + 1;
                when 1 => 
                        data_tmp <= "0000000000000001";
                        state:= state + 1;
                when 2 =>

break не забыли?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день.

Возникла проблема при чтении данных из файла.

Как только добавляю строку readline(infile, inline); конечный автомат перестает работать.

Срабатывает условие when 0, state принимает значение 1 и все на этом. (значение state проверил, когда назначил его signal)

В чем может быть проблема?

 

Может быть сделать state сигналом, а не переменной.

Не совсем понятно, Вы считываете из line через for loop параллельно массив за один такт в вектор data_tmp?

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может быть сделать state сигналом, а не переменной.

Делал. Я писал (значение state проверил, когда назначил его signal) Это не так важно. Т.к. когда state сигнал, то его просто можно отследить при симуляции

 

Не совсем понятно, Вы считываете из line через for loop параллельно массив за один такт в вектор data_tmp?

data_tmp - массив векторов по 16 бит. Загоняю в for, т.к. заводить 64 переменных или вектор(64х16 downto 0) не очень.

read просто читает значение из строки. 10 read - 10 значений из строки, если столько там имеется.

 

break не забыли?

 

break нет в vhdl. Есть exit; что-то там еще. Но что это даст?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

break нет в vhdl. Есть exit; что-то там еще. Но что это даст?

 

в верилоге тоже нет брейка в кейзах, подозреваю что это был тонкий тролинг на тему программирования.

А точно надо из файла читать данные по событиям клока?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А зачем там вообще конечный автомат делать?

Могу предложить свой вариант, который использую для моделирования.

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

library std;
use std.textio.all;

entity file_IO is 
generic (
	-- common
	p_TD	   : time	:= 1 ns;
	-- reading
	p_RD_NUM   : integer := 2;
	p_RD_SIZE  : integer := 16;
	p_RD_TMPLT : string  := "D:/123/data_in";
	-- writing
	p_WR_NUM   : integer := 2;
	p_WR_SIZE  : integer := 16;
	p_WR_TMPLT : string  := "D:/123/data_out"
);
port (
	-- reading
	rd_clk	: in  std_logic;
	rd_en	 : in  std_logic;
	dv		: out std_logic											:= '0';
	EOF_flags : out std_logic_vector(p_RD_NUM - 1 downto 0)			  := (others => '0');
	rd_data   : out std_logic_vector(p_RD_NUM * p_RD_SIZE - 1 downto 0)  := (others => '0');
	---- writing
	wr_clk	: in  std_logic;
	wr_en	 : in  std_logic;
	wr_data   : in  std_logic_vector(p_WR_NUM * p_WR_SIZE - 1 downto 0)
);
end file_IO;

architecture behav_a of file_IO is 
begin

dv_form_p : process(rd_clk)
begin
	if (rising_edge(rd_clk)) then
		if (rd_en = '1') then
			dv <= '1' after p_TD;
		else 
			dv <= '0' after p_TD;
		end if;
	else 
		NULL;
	end if;
end process; --dv_form_p

rd_files_fing_g : for i in 0 to p_RD_NUM - 1 generate
	reading_p : process(rd_clk)
		variable inline	  : line; 
	variable dataread	: integer;
		file	 rd_file	 : text is in (p_RD_TMPLT & INTEGER'IMAGE(i) & ".txt");  
	begin
		if (rising_edge(rd_clk)) then
			if (rd_en = '1') then
				if (not endfile(rd_file)) then
					readline(rd_file, inline);
					read(inline, dataread);
					rd_data(p_RD_SIZE - 1 + p_RD_SIZE * i downto p_RD_SIZE * i) <= 
						std_logic_vector(to_signed(dataread, p_RD_SIZE)) after p_TD;
				else 
					EOF_flags(i) <= '1'						  after p_TD;	
					rd_data(p_RD_SIZE - 1 + p_RD_SIZE * i downto p_RD_SIZE * i) <= 
						(others => '0');
				end if;
			else 
				NULL;
			end if;
		else 
			NULL;
		end if;
	end process; --reading_p
end generate; --rd_files_fing_g

wr_files_fing_g : for i in p_WR_NUM - 1 downto 0 generate
	writing_p : process(wr_clk)
		file wr_file	 : text is out (p_WR_TMPLT & INTEGER'IMAGE(i) & ".txt");  
		variable outline : line;
	begin
		if (rising_edge(wr_clk)) then
			if (wr_en = '1') then
				write(outline, to_integer(signed(wr_data(p_WR_SIZE - 1 + p_WR_SIZE * i downto p_WR_SIZE * i))));
				writeline(wr_file, outline);
			else 
				NULL;
			end if;
		else 
			NULL;
		end if;
	end process; --writing_p
end generate; --wr_files_fing_g

end behav_a;

---------------------------------------------------------------------------------
--------------------------- parsing templates -----------------------------------
---------------------------------------------------------------------------------
--parse_res_g : for i in 0 to p_RD_NUM - 1 generate 
--	test_res(i) <= rd_data(p_RD_SIZE - 1 + p_RD_SIZE * i downto p_RD_SIZE * i);
--end generate; --parse_res_g
--form_inp_g : for i in 0 to p_WR_NUM - 1 generate
--	wr_data(p_WR_SIZE - 1 + p_WR_SIZE * i downto p_WR_SIZE * i) <= wr_data(i);
--end generate; -- form_inp_g
---------------------------------------------------------------------------------

 

Из необычностей - чтение и запись паралельно из\в несколько файлов, по заданному шаблону, это нужно учесть выборе названия файла.

Изменено пользователем Tausinov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня вот так...

 

read_from_file: process(rst, clk)
    
    variable sync_l        : line;
    variable re_l        : line;
    variable im_l        : line;
    
    variable sync_i        : integer;
    variable re_i        : integer;
    variable im_i        : integer;
    
    -- mod: ideal
    
    file mod_sync_f        : text open read_mode is (path & "/mod/ideal/mod_sync.dat");
    file mod_re_f        : text open read_mode is (path & "/mod/ideal/mod_re.dat");
    file mod_im_f        : text open read_mode is (path & "/mod/ideal/mod_im.dat");

    
begin
    
    if (rst = '1') then
        sync_o <= '0';
        valid_o <= '0';
        data_re_o <= (others => '0');
        data_im_o <= (others => '0');
        
    elsif rising_edge(clk) then
    
        if (en_i = '1') then
            case addr_i is 
                when ADDR_FHSS_MOD => 
                    if (not endfile(mod_sync_f)) then
                        readline(mod_sync_f, sync_l);
                        readline(mod_re_f, re_l);
                        readline(mod_im_f, im_l);
                        
                        read(sync_l, sync_i);
                        read(re_l, re_i);
                        read(im_l, im_i);
                        
                        buf_sync(0 downto 0) := std_logic_vector(to_unsigned(sync_i,1));
                        buf_re := std_logic_vector(to_signed(re_i,16));
                        buf_im := std_logic_vector(to_signed(im_i,16));
                        
                        sync_o <= buf_sync(0);
                        data_re_o <= buf_re(DW_OUT-1 downto 0);
                        data_im_o <= buf_im(DW_OUT-1 downto 0);
                    else
                        sync_o <= '0';
                        valid_o <= '0';
                        data_re_o <= (others => '0');
                        data_im_o <= (others => '0');
                    end if;

...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...