sqrt(2) 0 2 ноября, 2016 Опубликовано 2 ноября, 2016 (изменено) · Жалоба Здравствуйте. when S1 => buff(0) <= unsigned(i_data); buff(3 downto 1) <= buff(2 downto 0); if buff_count = 3 then buff_count <= (others =>'0'); check_in <= '1'; reg <= buff(3); else buff_count <= buff_count + 1; end if; Сигналы check_in и buff_count , для которых вручную задаю значения - выставляются как надо и с ними нет проблем. А вот сигнал reg упорно не хочет принимать значения buff(3), и если честно не понимаю почему. Подскажите пожалуйста. Изменено 2 ноября, 2016 пользователем sqrt(2) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Raven 8 2 ноября, 2016 Опубликовано 2 ноября, 2016 · Жалоба А что выше и ниже с этим сигналом происходит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sqrt(2) 0 2 ноября, 2016 Опубликовано 2 ноября, 2016 (изменено) · Жалоба Выше - ничего кроме сброса. Ниже - только присвоение на выходной порт. library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity test is port ( i_arst : in std_logic; i_clk : in std_logic; i_data : in std_logic_vector (3 downto 0); o_data : out std_logic_vector (3 downto 0) ); end entity; architecture arch of test is type fsm_state is (S0,S1); signal fsm_cnt : fsm_state; signal buff_count : unsigned (3 downto 0); signal check_in : std_logic; signal s0_count : unsigned (3 downto 0); signal reg : unsigned(3 downto 0); type buff_type is array (3 downto 0) of unsigned (3 downto 0); signal buff : buff_type; begin fsm_proc : process(i_arst, i_clk) begin if i_arst = '1' then s0_count <= (others=>'0'); check_in <= '1'; fsm_cnt <= S0; reg <= (others=>'0'); buff_count <= (others=>'0'); buff <= (others=>(others=>'0')); elsif rising_edge(i_clk) then if (check_in = '1' and to_integer(unsigned(i_data)) >= 8) then check_in <= '0'; s0_count <= (others=>'0'); fsm_cnt <= S0; elsif check_in = '0' then case fsm_cnt is when S0 => if s0_count = 15 then fsm_cnt <= S1; else s0_count <= s0_count + 1; end if; when S1 => buff(0) <= unsigned(i_data); buff(3 downto 1) <= buff(2 downto 0); if buff_count = 3 then buff_count <= (others =>'0'); check_in <= '1'; reg <= buff(3); else buff_count <= buff_count + 1; end if; when others => o_data <= (others=>'0'); end case; end if; end if; end process; o_data <= std_logic_vector(reg); end arch; Изменено 2 ноября, 2016 пользователем sqrt(2) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sqrt(2) 0 2 ноября, 2016 Опубликовано 2 ноября, 2016 · Жалоба Проблема была в том, что сигналу o_data шло из двух мест, которые не принадлежат одному и тому же процессу, отсюда и 'X' на сигнале o_data все время. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Raven 8 2 ноября, 2016 Опубликовано 2 ноября, 2016 · Жалоба И причем здесь сигнал reg? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться