jenya7 0 29 октября, 2023 Опубликовано 29 октября, 2023 (изменено) · Жалоба странная проблема оказалась. иногда застревал в этом состоянии 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 обращений одно ломается. правда последующие отрабатываются нормально до следующей поломки. Изменено 29 октября, 2023 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 34 30 октября, 2023 Опубликовано 30 октября, 2023 · Жалоба On 10/29/2023 at 8:04 AM, jenya7 said: и всё таки даже сейчас раз в 4000 - 80000 обращений одно ломается. правда последующие отрабатываются нормально до следующей поломки. А сигнал SPI_CS тоже асинхронный с внешнего пина? И тоже без синхронизации? ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 220 31 октября, 2023 Опубликовано 31 октября, 2023 · Жалоба 2 часа назад, des00 сказал: вам же написали, больше триггеров, больше Или меньше, не делать CDC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 31 октября, 2023 Опубликовано 31 октября, 2023 · Жалоба Бездумное применение Variable - может сломать код. Обьявлять счетчик как Variable - полюбому проблема именно в этом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 16 ноября, 2023 Опубликовано 16 ноября, 2023 (изменено) · Жалоба нет ну это дичь какя то 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; смотрю СигналТап ну как это ? а где 21? Изменено 16 ноября, 2023 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 16 ноября, 2023 Опубликовано 16 ноября, 2023 · Жалоба автомат точно отрабатывает на симуляции все состояния? может у Вас есть асинхронщина? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 16 ноября, 2023 Опубликовано 16 ноября, 2023 · Жалоба 10 часов назад, jenya7 сказал: смотрю СигналТап ну как это ? а где 21? Сравните с результатами моделирования. Наверняка будет тоже самое. И почему не сделать автомат по классике. Уж точно будет работать. if (reset) state <= st_idle; else case (state) st_idle : st_a : default : state <= st_idle; endcase Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 18 ноября, 2023 Опубликовано 18 ноября, 2023 (изменено) · Жалоба 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 я не описал все состояния но есть и дефолт и рисет. Изменено 19 ноября, 2023 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 19 ноября, 2023 Опубликовано 19 ноября, 2023 · Жалоба 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). Искать асинхронность в описании автомата (триггер с логикой ), пользоваться сигнал тапом вместо моделирования, последнее дело. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 19 ноября, 2023 Опубликовано 19 ноября, 2023 (изменено) · Жалоба 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. У меня бывали случаи когда моделсим показывал всё хорошо а в реальности не работало и именно сигналтапом я находил проблемы. Изменено 19 ноября, 2023 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Raven 11 19 ноября, 2023 Опубликовано 19 ноября, 2023 · Жалоба Вы можете привести весь код этого узла, включая все пути от пинов и к ним? А то по приведенным кускам непонятно, есть ли здесь проблема Clock Crossing, и где. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 19 ноября, 2023 Опубликовано 19 ноября, 2023 · Жалоба 5 часов назад, jenya7 сказал: SPI_CS должен работать как асинхронный сброс в ST_IDLE состояние. иначе я останусь в каком нибудь состоянии ожидая следующего клока SPI_CLK. Тогда откажитесь от автомата. И просто это реализуйте на счетчиках и регистрах. Все эти низкоскоростные протоколы легко описываются на одноклоковой синхронизации. Опишите свой автомат на системном клоке. Введите условие spi_clk_negedge, spi_clk_posedge длительностью в такт системного клока. И тогда SPI_CS = 0 можно будет ожидать в состоянии idle Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться