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

Не всегда срабатывает условие

Есть такой процес

process (REG_CLK, s_spi_ready_3)

begin
	
    if(rising_edge(REG_CLK)) then
		 
        if (SPI_CS = '1') then
            State <= ST_IDLE;  
        end if; 	
		  
        case State is
			
            when  ST_IDLE =>
          
                debug <= X"00";
					  
                if (s_spi_ready_3 = '1') then
							
                    debug <= X"AA";
					
                    case INSTR is 
                        when COM_READ =>
                            State <= ST_READ_1;
                        when COM_WRITE =>
                             qspi_addr <= SPI_ADDR;
                             State <= ST_WRITE_1;
                        when COM_SET_ADR =>
                             debug <= X"BB";
                             qspi_addr <= SPI_ADDR;
                             State <= ST_IDLE;
                        when others =>
                            State <= ST_IDLE;
                   end case;
					 
                end if;


            when others =>
               State <= ST_IDLE;

        end case;
     
    end if;
end process;					  

150-180 раз он отрабатывает нормально и вдруг ломается - я не попадаю в условие if (s_spi_ready_3 = '1') then. хотя Сигнал Тап показывает все правильные сигналы - s_spi_ready_3 = '1', INSTR = COM_SET_ADR.

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

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

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


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

1 minute ago, jenya7 said:

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

сигнал s_spi_ready_3 асинхронен REG_CLK, 99.99%

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


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

On 10/25/2023 at 7:52 AM, des00 said:

сигнал s_spi_ready_3 асинхронен REG_CLK, 99.99%

s_spi_ready_3 <= not s_spi_ready_2 and s_spi_ready_1;

process(REG_CLK)
begin
    if (rising_edge(REG_CLK)) then
        s_spi_ready_1 <= SPI_READY;
       s_spi_ready_2 <= s_spi_ready_1;
   end if;	  
end process;

я всегда так делаю чтоб отловить фронт.

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


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

1 minute ago, jenya7 said:

я всегда так делаю чтоб отловить фронт.

тогда вы тот самый 0.01% счастливчик, у которого глючит плис. Если времянки все сходятся, то возможно что есть непропай шаров питания/земли и при высокой загрузке плис, глючит часть логики в ней.

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


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

Попробуйте SPI_READY через два триггера пропустить перед использованием. Может быть s_spi_ready_1 оказывается в метастабильном состоянии 

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


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

2 часа назад, Burenkov сказал:

Попробуйте SPI_READY через два триггера пропустить перед использованием. Может быть s_spi_ready_1 оказывается в метастабильном состоянии 

Добавлю, что этого мало. Еще бы правильно констрейнами, или атрибутами подсказать синтезатору, что тут цепочка CDC триггеров.

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


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

2 hours ago, Burenkov said:

Попробуйте SPI_READY через два триггера пропустить перед использованием. Может быть s_spi_ready_1 оказывается в метастабильном состоянии 

Поддерживаю, у Pong P Chu даже картинка на эту тему есть.

2023-10-25_14-40-33.png.4d85c35a4e1ce3d0a77bafc257c4fc42.png

Я бы еще s_spi_ready_3 из списка чувствительностей убрал, т.к. этой конструкцией триггер описывается, а не асинхронная логика.

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


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

4 часа назад, jenya7 сказал:

всегда так делаю чтоб отловить фронт

Это не сдвиговый регистр, а отдельные триггеры.

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


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

самое интересное что когда ломается он уже не возвращается в нормальное состояние. по идее на следующем обращении должен востановиться.

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


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

On 10/25/2023 at 4:07 PM, Plain said:

Про "State" расскажите, сколько бит.

type StateType is (ST_IDLE, ST_READ_1, ST_READ_2, ST_READ_3,

                    ST_WRITE_1, ST_WRITE_2, ST_WRITE_3,  
								
                    ST_CONT_READ_1, ST_CONT_READ_2, ST_CONT_READ_3, ST_CONT_READ_4, 
                    ST_CONT_WRITE_1, ST_CONT_WRITE_2, ST_CONT_WRITE_3, ST_CONT_WRITE_4,
                    ST_TEST_WRITE_1, ST_TEST_WRITE_2,
													
                    ST_TEST_1, ST_TEST_2, ST_TEST_3, ST_TEST_4,
												
                    ST_SET_BC_1, ST_SET_BC_2, ST_SET_BC_3, ST_SET_BC_4, ST_SET_BC_5,
													
                    ST_COM_STACK_1, ST_COM_STACK_2, ST_COM_STACK_3,
                    ST_DAT_STACK_1, ST_DAT_STACK_2, ST_DAT_STACK_3, ST_DAT_STACK_4, ST_DAT_STACK_5,
                    ST_MSG_SEND_1, ST_MSG_SEND_2, ST_MSG_SEND_3, ST_MSG_SEND_4, ST_MSG_SEND_5,
                    ST_WAIT_TX_DONE_1, ST_WAIT_TX_DONE_2, ST_WAIT_TX_DONE_3,
                    ST_GET_MSG_STATUS_1, ST_GET_MSG_STATUS_2, ST_GET_MSG_STATUS_3, ST_GET_MSG_STATUS_4,
													
                    ST_RTC_UPDATE_1, ST_RTC_UPDATE_2, ST_RTC_UPDATE_3, ST_RTC_UPDATE_4, ST_RTC_UPDATE_5, ST_RTC_UPDATE_6,
								
                    ST_WR_GMC_MSG_1, ST_WR_GMC_MSG_2, ST_WR_GMC_MSG_3, ST_WR_GMC_MSG_4, ST_WR_GMC_MSG_5, ST_WR_GMC_MSG_6, ST_WR_GMC_MSG_7,
								
                    ST_RD_GMC_MSG_1, ST_RD_GMC_MSG_2, ST_RD_GMC_MSG_3, ST_RD_GMC_MSG_4, ST_RD_GMC_MSG_5, ST_RD_GMC_MSG_6, ST_RD_GMC_MSG_7,
								
                    ST_DATA_SEND_1, ST_DATA_SEND_2, ST_DATA_SEND_3);
													
signal State : StateType := ST_IDLE;

 

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


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

21 hours ago, Burenkov said:

Попробуйте SPI_READY через два триггера пропустить перед использованием. Может быть s_spi_ready_1 оказывается в метастабильном состоянии 

на современных плис не актуально, там время выхода из этого состояния меньше 1нс, все советы про 2-3 триггера, в плис, относятся к плис времен царя гороха. Даже статьи такие есть с времянками. ЕМНП у тогоже 7 Series время выхода триггера из метастабильного состония порядка 100-200пс.

18 hours ago, Flip-fl0p said:

Добавлю, что этого мало. Еще бы правильно констрейнами, или атрибутами подсказать синтезатору, что тут цепочка CDC триггеров.

это делается для предотвращения упаковки в SRL примитив(чего уже не будет судя по описанной логике) и ограничения времени передачи, но для типовых тактовых 200МГц = 5нс, с учетом того что роутер минимизирует длинну трасс по умолчанию, эти 5нс это порядка четверти плис уровня 200ки артикса/300ки кинтекса. Судя по постам ТС, у него частота порядка 100-150МГц и мелкая ПЛИС. Резюмирую, по красоте вы абсолютно правы, но 99.9% что у ТС проблема не в этом.

14 hours ago, jenya7 said:

самое интересное что когда ломается он уже не возвращается в нормальное состояние. по идее на следующем обращении должен востановиться.

либо вы все таки видите не то, и ваша фраза " я не попадаю в условие if (s_spi_ready_3 = '1') then. хотя Сигнал Тап показывает все правильные сигналы - s_spi_ready_3 = '1', INSTR = COM_SET_ADR. " не соответствует действительности, либо какая то асинхра (не обязательно на указаном вами сигнале s_spi_ready_3) заходит на автомат, либо есть срыв тактовой, либо всеж вам повезло поймать очень редкий баг плис с недостатком питания/земли (ловил лично лет 15 назад).

18 hours ago, vsrb said:

Я бы еще s_spi_ready_3 из списка чувствительностей убрал, т.к. этой конструкцией триггер описывается, а не асинхронная логика.

это VHDL, там такое допускается. Но соглашусь, глаз режет)

48 minutes ago, Plain said:

Т.е. сами не знаете, однако пишете

when others

потому что это VHDL и тип перечисление. И эта фраза означает все другие, не описанные выше состояния)

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


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

1 час назад, des00 сказал:

фраза означает все другие, не описанные выше состояния

Так автор и жалуется, что КА в них торчит.

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


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

1 hour ago, Plain said:

Так автор и жалуется, что КА в них торчит.

он не так жалуется, в том то и дело что не торчит, он раком встал) классика типов перечислений с хитрой кодировкой, без safe-mode и асинхрой. но ТС 146% уверен что у него асинхры нигде нет.

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


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

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

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

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

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

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

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

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

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

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