Cianid 0 3 июня, 2019 Опубликовано 3 июня, 2019 (изменено) · Жалоба Доброго времени суток. В проекте есть модуль spi slave. Обнаружил ошибку в логике данного модуля. При нормальном состоянии, когда мастер генерирует ss в начале каждого байта, счетчик nb постоянно сбрасывается по фронту ss и выход sdout находится в 0. Если по какой либо причине сигнал ss отсутствует, nb начинает считать до 8 и затем выдаст на выходе sdout 1. Таким образом модуль выдаст ошибку если долго нет ss от мастера. Получается не работает блок логики, срабатывающий по фронту ss. module spi_slave (rstb,ss,sck,sdin,done,rdata, sdout, nfOut); input rstb; input ss; input sck; input sdin; output reg done; output reg [7:0] rdata; output reg sdout; output wire [2:0] nfOut; reg [7:0] rreg; reg [3:0] nb = 0; // счетчик бит reg [3:0] nf = 0; assign nfOut = nf[2:0]; always @(posedge sck or negedge rstb) begin if (rstb == 0) begin // сбросить в исходное при сигнале сброса done = 0; nb = 0; nf = 0; sdout = 0; end else if (ss == 0) // идет прием байта begin rreg ={rreg[6:0],sdin}; // прием старшим вперед, сдвиг влево nb = nb + 1; // increment bit count if(nb != 8) done = 0; else // на 8 импульсе выставить done begin rdata=rreg; done = 1; nb = 0; nf = nf + 1; if(nf == 8) begin sdout = 1; nf = 0; end end end else // байт принят и переписан begin nb = 0; done = 0; nf = 0; sdout = 0; end end endmodule Проблема заключается в том, что при работе уже на железе (Cyclone II E52C8), механизм сброса счетчика nb не работает, и каждый 8 байт я вижу одиночный импульс на sdout. Осторожно трафик. Спойлер https://ibb.co/XCw0nSN Но главное не это. Я случайно обнаружил, что если убрать сброс Sdout вот здесь: always @(posedge sck or negedge rstb) begin if (rstb == 0) begin // сбросить в исходное при сигнале сброса done = 0; nb = 0; nf = 0; sdout = 0; end То проблема решается. Вдобавок, проблема также решается, когда вношу изменения (добавил асинхронный сброс) в другой модуль проекта ( модуль CRC, который использует ту же последовательную линию данных, идущую от мастера) У меня подозрение, что данные изменения вносят паразитные емкости, которые влияет на работу модуля spi. Ниже представлена диаграмма, после внесения вышеописанных изменений. Осторожно трафик. Спойлер https://ibb.co/XyD442V Пропали импульсы на sdout, младший бит счетчика больше 1 не считает. Собственно так и должно работать. Изменено 3 июня, 2019 пользователем Cianid Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 3 июня, 2019 Опубликовано 3 июня, 2019 · Жалоба Как насчет неблокирующих присваиваний? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 3 июня, 2019 Опубликовано 3 июня, 2019 · Жалоба Когда я почувствовал, что точно железячная поблема (код в modelsim прошел массу тестов), то рука невольно на автомате уже тянется в раздел Timing Analyzer. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cianid 0 3 июня, 2019 Опубликовано 3 июня, 2019 · Жалоба 4 часа назад, ViKo сказал: Как насчет неблокирующих присваиваний? Проблема не должна быть в этом. Я прогонял данную схему в симуляции. Просто если вывести какие нибудь промежуточные точки на пины, чтобы посмотреть осциллографом, уже тогда ПЛИС перестает корректно работать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 4 июня, 2019 Опубликовано 4 июня, 2019 · Жалоба Странно, вы пишите: " механизм сброса счетчика nb не работает, и каждый 8 байт я вижу одиночный импульс на sdout" Но тогда причем здесь reg [3:0] nb = 0; // счетчик бит Так все таки, байты или биты? как она должна у вас работать? Что именно вы сделали в симуляторе? И да, " 8 байт я вижу одиночный импульс на sdout. " - именно так и должна работать исходная логика, вторая картинка как раз неправильная. И с присваиваниями все же разберитесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cianid 0 4 июня, 2019 Опубликовано 4 июня, 2019 · Жалоба 2 часа назад, des00 сказал: Странно, вы пишите: " механизм сброса счетчика nb не работает, и каждый 8 байт я вижу одиночный импульс на sdout" Но тогда причем здесь reg [3:0] nb = 0; // счетчик бит Так все таки, байты или биты? как она должна у вас работать? Что именно вы сделали в симуляторе? И да, " 8 байт я вижу одиночный импульс на sdout. " - именно так и должна работать исходная логика, вторая картинка как раз неправильная. И с присваиваниями все же разберитесь. Да, я ошибся, счетчик байтов это nf. При нормальной работе этот счетчик не должен считать дальше 1, т.к при следующем фронте ss он сбросится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 4 июня, 2019 Опубликовано 4 июня, 2019 · Жалоба 1 hour ago, Cianid said: т.к при следующем фронте ss он сбросится. а вот в этом, вы сильно ошибаетесь. это прям из кода видно, что так будет только в ограниченном количестве случаев и зависеть от фазы луны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cianid 0 4 июня, 2019 Опубликовано 4 июня, 2019 · Жалоба 24 минуты назад, des00 сказал: а вот в этом, вы сильно ошибаетесь. это прям из кода видно, что так будет только в ограниченном количестве случаев и зависеть от фазы луны. Можете пояснить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 4 июня, 2019 Опубликовано 4 июня, 2019 · Жалоба 42 minutes ago, Cianid said: Можете пояснить? вы работаете по фронту частоты SCK. в SPI интерфейсе она мало того что отключаема, так еще и ее фронт не обязательно присутствует при сигнале выбора слейва. Т.е. вы не ловите фронт сигнала ss, вы ловите его уровень, при фронте сигнала SCK. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lexx 0 4 июня, 2019 Опубликовано 4 июня, 2019 · Жалоба 15 hours ago, Cianid said: Просто если вывести какие нибудь промежуточные точки на пины, чтобы посмотреть осциллографом, уже тогда ПЛИС перестает корректно работать. Так может сперва код написать правильно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
likeasm 0 4 июня, 2019 Опубликовано 4 июня, 2019 · Жалоба 17 hours ago, Cianid said: Проблема не должна быть в этом. Я прогонял данную схему в симуляции. Просто если вывести какие нибудь промежуточные точки на пины, чтобы посмотреть осциллографом, уже тогда ПЛИС перестает корректно работать. Обычно SPI синхронизируют с внутренней частотой ПЛИС, используя фронты сигналов sck и ss как разрешение для частоты ПЛИС. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvladim 0 4 июня, 2019 Опубликовано 4 июня, 2019 · Жалоба 7 часов назад, likeasm сказал: Обычно SPI синхронизируют с внутренней частотой ПЛИС, используя фронты сигналов sck и ss как разрешение для частоты ПЛИС. Не сказал бы. Многое зависит от соотношения частот. Если SPI быстрый, то так лучше не делать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 4 июня, 2019 Опубликовано 4 июня, 2019 · Жалоба 2 часа назад, dvladim сказал: Не сказал бы. Многое зависит от соотношения частот. Если SPI быстрый, то так лучше не делать. А почему так лучше не делать. Лично я бы делал так: 1. Синхронизировал все сигналы SPI с внутренней частотой ПЛИС. 2. В случае если SPI медленный - поставил бы простейший антидребезг, чтобы исключить влияние пологих фронтов сигналов SPI. 3. Поставил бы детекторы фронтов на сигналы SPI. 4. Вся схема работала бы на внутренней частоте ПЛИС, а вся обработка бы велась событийно - по детектированным фронтам SPI. Если можно как-то иначе работать - расскажите пожалуйста, всегда интересно узнавать что-то альтернативное. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 5 июня, 2019 Опубликовано 5 июня, 2019 · Жалоба 6 hours ago, Flip-fl0p said: А почему так лучше не делать. Лично я бы делал так: 1. Синхронизировал все сигналы SPI с внутренней частотой ПЛИС. 2. В случае если SPI медленный - поставил бы простейший антидребезг, чтобы исключить влияние пологих фронтов сигналов SPI. алгоритм не полный, что бы вы делали, "В случае если SPI быстрый". положим 90МГц. Ваши действия? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 5 июня, 2019 Опубликовано 5 июня, 2019 · Жалоба 32 minutes ago, des00 said: алгоритм не полный, что бы вы делали, "В случае если SPI быстрый". положим 90МГц. Ваши действия? нарезал бы всё внутренним 400 МГц клоком и жил бы припеваючи. :)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться