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

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

странная проблема оказалась. иногда застревал в этом состоянии

when ST_READ_2 =>
    debug <= X"04";
							
    if (clk3 = '1') then
        clk_count := clk_count + 1;
        if (clk_count = 2) then
            State <= ST_READ_3;
        end if;									 
    end if;						    
						  
    if (SPI_CS = '1') then
       State <= ST_IDLE;  
    end if; 	

пришлось переписать

when ST_READ_2 =>
    debug <= X"04";
	
    if (SPI_CS = '1') then
       State <= ST_IDLE; 
    else
        if (clk3 = '1') then
            clk_count := clk_count + 1;
            if (clk_count = 2) then
                State <= ST_READ_3;
             end if;									 
        end if;						    				     
    end if; 	

хотя не такая уж странная. явный косяк.

 

и всё таки даже сейчас раз в 4000 - 80000 обращений одно ломается. правда последующие отрабатываются нормально до следующей поломки.

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

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


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

On 10/29/2023 at 8:04 AM, jenya7 said:

и всё таки даже сейчас раз в 4000 - 80000 обращений одно ломается. правда последующие отрабатываются нормально до следующей поломки.

А  сигнал SPI_CS тоже асинхронный с внешнего пина? И тоже без синхронизации?  ...

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


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

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

вам же написали, больше триггеров, больше

Или меньше, не делать CDC.

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


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

Бездумное применение Variable - может сломать код. Обьявлять счетчик как Variable - полюбому проблема именно в этом.

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


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

нет ну это дичь какя то 

when  ST_IDLE =>
    debug <= X"F7";
    case INSTR is 
        when COM_WRITE =>
            debug <= X"03";
            State <= ST_WRITE_1;
        when others =>
            State <= ST_IDLE;
    end case;

when ST_WRITE_1 =>
    debug <= X"21";
    State <= ST_WRITE_2;

when ST_WRITE_2 =>
    debug <= X"22";
    State <= ST_IDLE;

смотрю СигналТап

image.thumb.png.61517f21c7d9375fe2be47765c1c9c83.png

ну как это ? а где 21?

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

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


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

автомат точно отрабатывает на симуляции все состояния?

может у Вас есть асинхронщина?

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


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

10 часов назад, jenya7 сказал:

смотрю СигналТап

ну как это ? а где 21?

 

Сравните с результатами моделирования. Наверняка будет тоже самое. И почему не сделать автомат по классике.  Уж точно будет работать.

if (reset)     state <= st_idle; 

else
case (state) 
st_idle :

st_a :
default :    state <= st_idle;
endcase
 

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


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

On 11/16/2023 at 6:42 PM, Maverick_ said:

автомат точно отрабатывает на симуляции все состояния?

может у Вас есть асинхронщина?

и поэтому возможен переход 3 -> 22 ?

On 11/16/2023 at 8:45 PM, sazh said:

Сравните с результатами моделирования. Наверняка будет тоже самое. И почему не сделать автомат по классике.  Уж точно будет работать.

if (reset)     state <= st_idle; 

else
case (state) 
st_idle :

st_a :
default :    state <= st_idle;
endcase
 

я не описал все состояния но есть и дефолт и рисет.

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

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


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

15 часов назад, jenya7 сказал:

 

я не описал все состояния но есть и дефолт и рисет.

 

Я хотел сказать, что все условия в автомате должны быть в теле case.

А у Вас

if (SPI_CS = '1') then State <= ST_IDLE;  end if;      

 case State is

где else?

потом в теле case

 

when ST_READ_2 => debug <= X"04";
if (SPI_CS = '1') then State <= ST_IDLE; 
 Ну кто в этом будет разбираться. Как на это посмотрит синтезатор, я не знаю. Что мешает чаще пользоваться приоритетностью в описании (if, else). 

Искать асинхронность в описании автомата (триггер с логикой ), пользоваться сигнал тапом вместо моделирования, последнее дело. 

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


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

On 11/19/2023 at 10:25 AM, sazh said:

Я хотел сказать, что все условия в автомате должны быть в теле case.

А у Вас

if (SPI_CS = '1') then State <= ST_IDLE;  end if;      

 case State is

где else?

потом в теле case

 

when ST_READ_2 => debug <= X"04";
if (SPI_CS = '1') then State <= ST_IDLE; 
 Ну кто в этом будет разбираться. Как на это посмотрит синтезатор, я не знаю. Что мешает чаще пользоваться приоритетностью в описании (if, else). 

Искать асинхронность в описании автомата (триггер с логикой ), пользоваться сигнал тапом вместо моделирования, последнее дело. 

SPI_CS должен работать как асинхронный сброс в ST_IDLE состояние. иначе я останусь в каком нибудь состоянии ожидая следующего клока SPI_CLK. 

У меня бывали случаи когда моделсим показывал всё хорошо а в реальности не работало и именно сигналтапом я находил проблемы.

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

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


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

Вы можете привести весь код этого узла, включая все пути от пинов и к ним? А то по приведенным кускам непонятно, есть ли здесь проблема Clock Crossing, и где.

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


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

5 часов назад, jenya7 сказал:

SPI_CS должен работать как асинхронный сброс в ST_IDLE состояние. иначе я останусь в каком нибудь состоянии ожидая следующего клока SPI_CLK. 

Тогда откажитесь от автомата. И просто это реализуйте на счетчиках и регистрах.

Все эти низкоскоростные протоколы легко описываются на одноклоковой синхронизации.

Опишите свой автомат на системном клоке. Введите условие spi_clk_negedge, spi_clk_posedge длительностью в такт системного клока. И тогда SPI_CS = 0 можно будет ожидать в состоянии idle

 

 

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


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

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

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

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

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

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

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

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

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

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