Pitonbl4 0 23 марта, 2017 Опубликовано 23 марта, 2017 · Жалоба Добрый день. Возникла проблема при чтении данных из файла. Как только добавляю строку 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 => Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 24 марта, 2017 Опубликовано 24 марта, 2017 · Жалоба Добрый день. Возникла проблема при чтении данных из файла. Как только добавляю строку 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 не забыли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
quato_a 3 24 марта, 2017 Опубликовано 24 марта, 2017 · Жалоба Добрый день. Возникла проблема при чтении данных из файла. Как только добавляю строку readline(infile, inline); конечный автомат перестает работать. Срабатывает условие when 0, state принимает значение 1 и все на этом. (значение state проверил, когда назначил его signal) В чем может быть проблема? Может быть сделать state сигналом, а не переменной. Не совсем понятно, Вы считываете из line через for loop параллельно массив за один такт в вектор data_tmp? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pitonbl4 0 24 марта, 2017 Опубликовано 24 марта, 2017 · Жалоба Может быть сделать 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; что-то там еще. Но что это даст? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 24 марта, 2017 Опубликовано 24 марта, 2017 · Жалоба break нет в vhdl. Есть exit; что-то там еще. Но что это даст? в верилоге тоже нет брейка в кейзах, подозреваю что это был тонкий тролинг на тему программирования. А точно надо из файла читать данные по событиям клока? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 24 марта, 2017 Опубликовано 24 марта, 2017 (изменено) · Жалоба А зачем там вообще конечный автомат делать? Могу предложить свой вариант, который использую для моделирования. 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 --------------------------------------------------------------------------------- Из необычностей - чтение и запись паралельно из\в несколько файлов, по заданному шаблону, это нужно учесть выборе названия файла. Изменено 24 марта, 2017 пользователем Tausinov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
quato_a 3 24 марта, 2017 Опубликовано 24 марта, 2017 · Жалоба У меня вот так... 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; ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться