Plain 168 28 июня, 2020 Опубликовано 28 июня, 2020 (изменено) · Жалоба 17 минут назад, Leka сказал: А нужна цепочка ТС? Если конечная задача - сделать spi мост между МК и конкретной схемой, не стоит усложнять. Я уже говорил, у автора тот же самый экзаменационный билет, что и в предыдущей теме, с тем же самым сигналом прерывания непонятно кого — прерывать мастера сразу после завершения только что законченного им же сеанса? Изменено 28 июня, 2020 пользователем Plain Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bmv89 0 29 июня, 2020 Опубликовано 29 июня, 2020 · Жалоба Цитата у автора тот же самый экзаменационный билет Да какой там экзамен)) Последний экзамен сдал ещё лет 10 назад (и далеко не по цифровой электросхемотехнике и программированию). Это же для души, так сказать. Спортивный интерес. Правда, так долго на одном месте я ещё не застревал (параллельно stm32 изучаю и там, на мой ламерский взгляд, всё проще). Просто на моём этапе освоения рассматриваю ПЛИС не как самостоятельный мозг устройства, а как расширитель возможностей МК. И для этого сначала мне нужно подружить их. SPI, как мне кажется, идеальный вариант для этого. Цитата По стандарту, мастер в сеансе выдаёт ровно столько тактов, сколько бит в сумме у всех сдвиговых регистров, соединённых в цепочку К примеру, если взять какой-нибудь дисплей с spi, там же нет необходимости стробировать каждый байт CS-ом. Он сам понимает, что транзакция байта закончилась. Собственно, это и отличает интерфейс SPI от интерфейса sn74hc595. Если ошибаюсь, то тогда мне нужен SPI подобный последовательный интерфейс, который не требуется стробировать CS-ом (наверно без счётчика бит не обойтись). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aldec 0 29 июня, 2020 Опубликовано 29 июня, 2020 · Жалоба Расширителю контролера на плис потребуется не только счетчик но и проверка CRC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 29 июня, 2020 Опубликовано 29 июня, 2020 (изменено) · Жалоба 2 hours ago, pinchemierda said: рассматриваю ПЛИС не как самостоятельный мозг устройства, а как расширитель возможностей МК. И для этого сначала мне нужно подружить их. SPI, как мне кажется, идеальный вариант для этого. Тогда надо следовать не стандартам, а возможностям МК и ПЛИС, со своими протоколами (возможно, похожими на стандартные), физическими уровнями, и тд. Например, если МК может выдавать spi-клок при выcоком уровне cs - так и делать, получится надежный синхронный дизайн с синхронным сбросом. Z-состояние выхода делать не нужно, если нет необходимости. И тд и тп. 1 hour ago, Aldec said: Расширителю контролера на плис потребуется не только счетчик но и проверка CRC. ??? Чтобы жизнь медом не казалась? Изменено 29 июня, 2020 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 29 июня, 2020 Опубликовано 29 июня, 2020 · Жалоба 2 часа назад, pinchemierda сказал: сначала мне нужно подружить их. SPI, как мне кажется, идеальный вариант А дальше как было дело? Откуда появилось ТЗ с "прерыванием в 1 такт" и прочими фантазиями? Ну вот у меня, например, есть конкретный микроконтроллер, и у него есть конкретный модуль SPI — тогда я просто делаю совместимую лишь конкретно с ним схему. Если в ПЛИС нет сигнала хотя бы 50 МГц, не говоря о 200 МГц, зачем вообще её ставить, и тогда я бы написал вышепоказанный синхронный интерпретатор SPI, а не тратил бы время на идею ради идеи. 2 часа назад, pinchemierda сказал: какой-нибудь дисплей с spi, там же нет необходимости стробировать каждый байт CS-ом В стандарте SPI тоже нет такой необходимости — за сеанс (один интервал SS) можно передавать бесконечно битов. Другое дело, что ни в МК, ни в устройстве нет бесконечной длины сдвигового и параллельного регистров — тогда выбирают дополнение к стандарту, частный случай "точка-точка", т.е. одно устройство с индивидуальным SS, с добавлением ведомому счётчика бит, чтобы МК и устройство брали данные на лету. Или, например, есть другое дополнение стандарта — т.н. блочный синхронный режим SPI, когда тактовый сигнал идёт непрерывно, а SS выдаётся длиной в 1 такт в начале блока. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bmv89 0 29 июня, 2020 Опубликовано 29 июня, 2020 · Жалоба 7 часов назад, Leka сказал: если МК может выдавать spi-клок при выcоком уровне cs Давать клок подчинённому устройству при неактивном уровне cs иначе не будет работать... Нигде такого не видел)) Хотелось бы без экзотики, обычный spi 0 slave Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bmv89 0 29 июня, 2020 Опубликовано 29 июня, 2020 · Жалоба Немного переделал под свои нужды: module spi_slave( input wire SS, input wire SCLK, output wire MISO, input wire MOSI, output reg [7:0]spirx, input wire [7:0]spitx ); reg [7:0]txbuf; reg [7:0]spireg; reg txsw; reg [2:0]counter; always @(negedge SCLK or posedge SS) begin if(SS) begin txsw <= 1'b0; counter <= 3'd0; end else begin txsw <= 1'b1; counter <= counter + 1'd1; if(counter == 3'd7) spirx <= spireg; if(counter == 3'd7 || ~txsw) txbuf <= spitx; end end always @(posedge SCLK) begin spireg <= {spireg[6:0], MOSI}; end assign miso_mux = (txsw) ? txbuf[3'd7-counter] : spitx[3'd7-counter]; assign MISO = (~SS) ? miso_mux : 1'bz; endmodule В симуляторе логика работы устраивает, но в железе не работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Джеймс 3 29 июня, 2020 Опубликовано 29 июня, 2020 · Жалоба Гвозди бы делать из этих людей.. (крепче бы не было в мире гвоздей) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bmv89 0 29 июня, 2020 Опубликовано 29 июня, 2020 · Жалоба Только что, Джеймс сказал: Гвозди бы делать из этих людей.. (крепче бы не было в мире гвоздей) Да пробовал я reset на 44 pin! Те же яйца, только в профиль. Не в этом дело. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Джеймс 3 29 июня, 2020 Опубликовано 29 июня, 2020 · Жалоба 2 hours ago, pinchemierda said: Да пробовал я reset на 44 pin! Те же яйца, только в профиль. Не в этом дело. Так что же не выложили код и не написали - вот, глядите, тоже не работает! В общем есть сильное сомнение, в том что именно вы делали. Вам нужно выполнить как минимум два совета, которые вам были даны: 1) Привести весь код к виду: always @(posedge i_core_clk or negedge i_rst) begin ... И никаких negedge и никаких or posedge SS !! 2) Не надо все в одну кучу смешивать. Пока вы начинающий, придерживайтесь правила: один регистровый объект (например, counter, clk_flag) - один always блок. Иногда можно ему в компанию добавить что-то очень близко связанное функционально, но у вас тут вроде не тот случай. Если вы надеялись что-то оптимизировать, собирая все под одной крышей - вы заблуждались. Синтезатор все равно рассматривает вначале все сущности по отдельности и лишь потом сопоставляет их функции и пытается что-то скомбинировать. Ваша первейшая задача - научиться писать ясный, незапутанный код, который работает понятным образом. П. 2 это был совет ув. Raven Без этого ваш "быдло-код" (ваши собственные слова) никто как видите даже не хочет анализировать. После того, как приведете проект к человеческому виду, вы скорее всего столкнетесь с тем, что не сможете принимать данные от SPI 18 МГц, имея частоту 50 МГц. Если бы было другое семейство, вы бы могли задействовать PLL. Но у вас к сожалению нет PLL. Но решение будет - после выполнения означенных пунктов. А может и догадаетесь. P.S Я естественно уверен, что ничего этого вы делать не будете Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bmv89 0 30 июня, 2020 Опубликовано 30 июня, 2020 · Жалоба Всё советы, которые вы продублировали (кроме i_rst), были учтены в варианте, который работает только на частоте spi clk не выше 9МГц (при тактировании ПЛИС 50МГц). Решением этой проблемы возможно будет создание модуля (асинхронного SPI) не привязанного к частоте 50МГц (по советам Plain и Leka). Цитата естественно уверен, что ничего этого вы делать не будете В общем вы, пожалуйста, тоже будьте внимательнее Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Plain 168 30 июня, 2020 Опубликовано 30 июня, 2020 · Жалоба 6 часов назад, Джеймс сказал: И никаких negedge и никаких or posedge SS ! А что не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 30 июня, 2020 Опубликовано 30 июня, 2020 · Жалоба 3 minutes ago, Plain said: А что не так? Как минимум в документацию нужно залезть и почитать работу примитивов/макроблоков. В случае с кристаллом даже без PLL имеется 80% вероятность, что слайсы не способны работать с negedge SCLK 9 hours ago, pinchemierda said: В симуляторе логика работы устраивает, но в железе не работает. Либо Вы неправильно симулируете, либо проблемы с железом. Хотя столько сколько рассусоливается тема, уже можно было бы пойти по рекомендачиям форумчан и привести всё к толку. always @(negedge SCLK or posedge SS) begin if(SS) begin txsw <= 1'b0; counter <= 3'd0; end else begin txsw <= 1'b1; counter <= counter + 1'd1; if(counter == 3'd7) spirx <= spireg; if(counter == 3'd7 || ~txsw) txbuf <= spitx; end end Зачем всё лепить в одном процессе? Сложно вынести txsw и counter в один процесс, а spirx и txbuf в другой? Это не программирование, здесь все "переменные" внутри модуля "глобальные". А то по логике работы для последних друх флопов получается код вида: always @(negedge SCLK or posedge SS) begin if(SS) begin end else begin if(counter == 3'd7) spirx <= spireg; if(counter == 3'd7 || ~txsw) txbuf <= spitx; end end Логично выглядит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strob 0 30 июня, 2020 Опубликовано 30 июня, 2020 · Жалоба 8 hours ago, pinchemierda said: В симуляторе логика работы устраивает, но в железе не работает Не читал все, если повторю чьи-то слова, пардон. А в симуляторе точно повторено поведение железного мастера? Сравнение с осциллографом было сделано? Многое может пойти не так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Джеймс 3 30 июня, 2020 Опубликовано 30 июня, 2020 · Жалоба 4 hours ago, pinchemierda said: Всё советы, которые вы продублировали (кроме i_rst), были учтены в варианте, > Да пробовал я reset на 44 pin! Те же яйца, только в профиль. Не в этом дело. > Ну и в каком случае вы говорили то, что соответствует действительности? Но ответа на этот вопрос не требуется - все и так понятно. Продолжайте искать "философский камень" (=читерский совет, который заставит работать ваш код на живую нитку). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться