2017-02-23 9 views
0

, так что у меня, похоже, возникла проблема с утверждением сигнала сигнала флага. Поэтому в основном я реализую интерфейс i2c между двумя файлами fpga. Мой мастер отправит более 50 байт. На моей подчиненной стороне я хочу сохранить байт, входящий в массив. Поэтому я проверяю, когда все байты читаются и доступны, я помещаю их в массив. Теперь проблема в том, что после заполнения массива я хочу утверждать сигнал, который должен активировать процесс. Моя проблема заключается в том, что когда сигнал утверждается и процесс активируется, что я застрял в холостом цикле навсегда, что меня смущает, потому что я был в предположении, что когда я вхожу в процесс и проверяю условие утверждения сигнала флага, предположим быть высоким. Так что проблема в том, что мой сигнал не активирует процесс или не является моей проблемой, что к моменту проверки проверки флага, что флаг уже вернулся к 0? Я приложил код:Сигнал не активирует процесс?

signal i : integer range 0 to 49 := 0; 

    type field_array is array(0 to 49) of std_logic_vector(7 downto 0); 
begin 
process(clk,rst) 
begin 

if(rst = '1') then 

    i <= 0; 

elsif (rising_edge(clk)) then 

    if(data_available = '1') then 

     array_of_data(i) <= Master_Data; 

     i <= i + 1; 

    end if; 

    if(i = 49) then 

     i <= 0; -- reset index back to zero 

    end if; 

end if; 

end process; 

flag <= '1' when i = 49 else '0'; 

process(state,flag) 
begin 

next_state <= state; 

case (state) is 

    when idle => 

     if(flag = '1') then 

      next_state <= Send_data; 

     end if; 

    when Send_data =>... 
+0

Непонятно из вашего фрагмента кода, как 'next_state' (установленный при изменении вашего флага) должен изменить ваш сигнал' state' для запуска следующего состояния вашего конечного автомата. – mfro

ответ

0

Существует а граница проверить отказ от вашего назначения, i <= i+1;. Он пытается оценить его перед проверкой, которая выполняется позже (if i=49...).

Изменить синхронная часть вас кода:

elsif rising_edge(clk) then 
    if data_available = '1' then 
     array_of_data(i) <= Master_Data; 
     if i = 49 then 
      i <= 0; 
     else 
      i <= i + 1; 
     end if; 
    end if; 
end if; 

EDIT:

Вы можете видеть, что флаг в настоящее время утверждается и изменяется состояние here.

Далее EDIT:

Рассмотрим сделать ваше состояние машины синхронные и удаление next_state сигнала. например.

type state_t is (idle_s, send_s, others_s); 
signal state : state_t := idle_s; 
... 
process(clk,rst) 
begin 
    if rst = '1' then 
     -- rst 
    elsif rising_edge(clk) then 
     case (state) is 
      when idle_s => 
       if flag = '1' then 
        state <= send_s; 
       else 
        state <= idle_s; 
       end if; 
      when send_s => 
      -- Do stuff 
      when others => 
      -- stuff 
     end case; 
    end if; 
end process; 

Если вы хотите назначить свои выходы, как только ваше состояние изменится, вы можете использовать два состояния процесса. Один из процессов (синхронный) используется для управления переходами состояний, другой используется для управления выходным (комбинационным). Вы бы эффективно иметь другой процесс, похожий на первый:

process(state) 
begin 
    case state is 
     when idle_s => 
      my_output <= '0'; 
     when send_s => 
      -- Assign output as necessary 
      my_output <= '1'; 
     when others => 
     --assign output 
    end case; 
end process; 

Пример показан here.

+0

Спасибо за исправление. Да, кажется, что он отлично работает при симуляции, но когда я запускаю его на своей fpga, кажется, что он только торчит в режиме ожидания (используя контрольные состояния водить). Исправьте меня, если я ошибаюсь, но когда флаг утверждается (0 -> 1), процесс должен активироваться, и когда я проверю, чтобы увидеть, если (flag = '1') условие должно быть истинным правильно? –

+1

Исправить. После дальнейшего просмотра, я бы, вероятно, изменил процесс вашего государственного контроллера; сделать его синхронным и избавиться от сигнала 'next_state' – gsm

+0

Я получаю ошибку проверки границ в этой строке от GHDL, когда я пытаюсь имитировать его – gsm

Смежные вопросы