Raven 11 1 июля, 2020 Опубликовано 1 июля, 2020 · Жалоба 1 hour ago, Leka said: Проблема в том, когда _уходит_ асинхронный сброс. Из-за разных по кристаллу задержек относительно клока, в одной ячейке сигнал сброса может уйти раньше фронта клока, в другой - позже, и поведение уже не будет соответствовать описанию. Обычно сигнал сброса, подключаемый к асинхронным reset-входам триггеров, делают на входе в систему синхронным, как по его активации (assertion), так и де-активации (de-assertion, or negation). Все это контролируется констрейнтами на распространение от асинхронных входов на синхронные выходы. И наконец, по выходу из RESET'а система обычно попадает в состояние типа IDLE, и начать что-то происходить с ней может не раньше, чем все критические части системы завершат свою RESET-sequence. Система так должна быть спроектирована. Если не так - ошибка проектировщика. Quote Тактовый сигнал отсутствует при включении питания, тогда куча процессов происходит - перевод GPIO в режим загрузки, загрузка прошивки, сброс всех регистров в начальное состояние (инициализация), ожидание захвата PLL, перевод GPIO в пользовательский режим, и только потом поведение соответствует коду. Так что в синхронном дизайне клок есть всегда, а начальное состояние регистров задается строками вида "reg [7:0] q = 8'd123" (и тп). Кроме FPGA, есть еще ASIC'и, где вообще что угодно может быть. Но даже и в мире FPGA могут быть ситуации, когда тактового сигнала может не быть. Например, из-за энергосбережения. В сложных конструкциях части системы м.б. отключены, пока не понадобятся. И т.п. Да мало ли еще из-за чего какой-то клок может иногда отсутствовать. Quote Попробуйте объяснить результат синтеза. Покажите уже, наконец, этот страшный результат. Чтобы было что объяснять. Пока могу предположить, что синтезатор попытался выполнить ваше желание заполучить некую триггерную схему, работающую по двум фронтам: положительным clk и отрицательным nclr. Поскольку для этого у него есть только обычный flip-flop с одним входом синхронизации по фронтам, то ему пришлось поизгаляться в попытке удовлетворить ваше желание. Ничего удивительного. Напиши вы нормальный код D-триггера, только он бы и был в результате синтеза. 2 minutes ago, pinchemierda said: Если асинхронный сброс заставит мой асинхронный SPI работать в железе правильно, напишите пожалуйста куда и как его воткнуть. Пока видел только И ещё вопрос, есть разница от какого пина тактировать модуль? Если нет, то для чего у микросхемы есть специальные пины для подключения внешнего генератора (у EPM240T100C5 это PIN12, 14, 64, 62)? Если делать асинхронный SPI может имеет смысл подключать SPI CLK на один из этих выводов? А можно увидеть результирующий код? И чтобы в нем уже было выполнено пожелание разложить все по полочкам, не смешивая в одну кучу? А то уже столько итераций и постов было, что непонятно, что из себя представляет объект обсуждения к этому моменту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 1 июля, 2020 Опубликовано 1 июля, 2020 · Жалоба 53 minutes ago, Nick_K said: сигнал для управления асинхронным сбросом формируется в синхронном домене Те описали в конечном итоге синхронный сброс - нет клока, нет сброса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Raven 11 1 июля, 2020 Опубликовано 1 июля, 2020 · Жалоба В тех случаях, когда важно наличие клока, этот подход не применяется. Затронутое ранее - это лишь некоторые наброски для иллюстрации случаев, в которых асинхронный сброс полезен, или как могут решаться сопутствующие проблемы. А не свод единых правил. Жизнь многообразнее, чем рамки, в которые вы сами себя загоняете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 1 июля, 2020 Опубликовано 1 июля, 2020 (изменено) · Жалоба 26 minutes ago, Raven said: Обычно сигнал сброса, подключаемый к асинхронным reset-входам триггеров, делают на входе в систему синхронным Те получили синхронный сброс, и ... 26 minutes ago, Raven said: Но даже и в мире FPGA могут быть ситуации, когда тактового сигнала может не быть. Например, из-за энергосбережения. В сложных конструкциях части системы м.б. отключены, пока не понадобятся. И т.п. Да мало ли еще из-за чего какой-то клок может иногда отсутствовать. … нет клока - нет сброса. 26 minutes ago, Raven said: Покажите уже, наконец, этот страшный результат. Чтобы было что объяснять. Синтезатор сделает "провод", те код эквивалентен "assign q=d;" . Так происходит потому, что асинхронный сброс в терминах синтеза - специальная договоренность, как его описывать, по русски это называется - костыль. Изменено 1 июля, 2020 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Raven 11 1 июля, 2020 Опубликовано 1 июля, 2020 · Жалоба 6 minutes ago, Leka said: … нет клока - нет сброса. Выше уже написал о многообразии жизненных ситуаций. Когда клока нет, а сигнал сброса нужен - переводящий в известное состояние или удерживающий в нем. Quote Синтезатор сделает "провод", те код эквивалентен "assign q=d;" . "Попросите, и дадено будет вам". Что попросили, то и получили. В чем причина удивления-то, никак не пойму? Нормальнй код => нормальный результат синтеза. Странный код => странные результаты. Мусор на входе => мусор на выходе. Quote Так происходит потому, что асинхронный сброс в терминах синтеза - специальная договоренность, как его описывать, другими словами, по русски это называется - костыль. Вообще-то, паттерном распознавания для нормального синтеза будет являться весь always блок, описывающий либо триггер с асинхронным сбросом, либо с синхронным, либо вовсе без сброса. И это все - специальные договоренности. Почему вы одну считаете более правильной, чем другие - непонятно. И да, под жаргонным термином "костыль" каждый понимает что-то свое. Я вот ни под каким соусом описанные выше договоренности с этим словом не ассоциирую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bmv89 0 1 июля, 2020 Опубликовано 1 июля, 2020 · Жалоба Только что, Raven сказал: А можно увидеть результирующий код? 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; end end always @(negedge SCLK) begin if(counter == 3'd7) spirx <= spireg; if(counter == 3'd7 || ~txsw) txbuf <= spitx; 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Raven 11 1 июля, 2020 Опубликовано 1 июля, 2020 · Жалоба Ну это же совсем другое дело - в смысле удобочитаемости. И что-то советовать здесь гораздо удобнее. Сами-то чувствуете разницу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bmv89 0 1 июля, 2020 Опубликовано 1 июля, 2020 · Жалоба Только что, Raven сказал: Сами-то чувствуете разницу? Небо и земля)) Самое главное, другая схема синтезируется. Мне ошибочно казалось, что только на читаемость влияет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Raven 11 1 июля, 2020 Опубликовано 1 июля, 2020 · Жалоба Just now, pinchemierda said: Небо и земля)) Самое главное, другая схема синтезируется. Мне ошибочно казалось, что только на читаемость влияет. Это из-за того, что в запутанном коде и ошибиться легко. Далее. Я не спец по SPI - так что могу задавать странные вопросы. SCLK - он всегда наличествует, или его присутствие/отсутствие чем-то обусловлено? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 1 июля, 2020 Опубликовано 1 июля, 2020 · Жалоба 53 minutes ago, pinchemierda said: И ещё вопрос, есть разница от какого пина тактировать модуль? Если нет, то для чего у микросхемы есть специальные пины для подключения внешнего генератора (у EPM240T100C5 это PIN12, 14, 64, 62)? Если делать асинхронный SPI может имеет смысл подключать SPI CLK на один из этих выводов? При Вашей частоте - это не принципиально (50 МГц). А вот что категорически принципиально - это задать правильные констрейны. Тем более что-то мне подсказывает, что Ваш чип подходит к максимальной рабочей частоте. Соответственно без задания входных задержек, модели отношения сигнала к клоку и т.п. не обойтись. 3 minutes ago, pinchemierda said: Мне ошибочно казалось, что только на читаемость влияет. Это Вы ещё на VHDL не писали. Там всё на удобочитаемости строится... Хотя и педалить букв в разы больше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Raven 11 1 июля, 2020 Опубликовано 1 июля, 2020 · Жалоба И еще: напомните, пожалуйста, с каким устройством вы взаимодействуете здесь? Вы же на чем-то проверяете, судя по постам? Какое у этого SPI-устройства понимание протокола взаимодействия? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bmv89 0 1 июля, 2020 Опубликовано 1 июля, 2020 · Жалоба Только что, Raven сказал: SCLK - он всегда наличествует, или его присутствие/отсутствие чем-то обусловлено? Он не всегда есть. Когда CS в единице, наличие или отсутствие вообще не важно. Устройство находится в состоянии IDLE. Когда CS = 0 устройство должно быть наготове принимать данные, при этом клока какое-то время может и не быть. Мастер генерирует клок только непосредственно в процессе передачи, словно стробируя каждый бит. Если подчинённое устройство на SPI одно, то линия CS вообще к мастеру не идёт, а заземляется. По сути функция CS заключается только в том, что бы переводить MISO в HiZ, чтобы не было конфликта шины при нескольких подчинённых на одном SPI. Только что, Raven сказал: с каким устройством вы взаимодействуете здесь? Мастер - микроконтроллер с аппаратным SPI 0 18МГц и программным CS. В бесконечном цикле отправляю байты от 0 до 255, с задержкой 100 мс между каждым байтом. После отправки каждого байта по MOSI считываю, что принялось по MISO. Параллельно гляжу на огоньки, которые подключены к spirx (приёмный буфер ПЛИС). В топ модуле для проверки MISO сделал эхо (spitx = spirx). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bmv89 0 1 июля, 2020 Опубликовано 1 июля, 2020 · Жалоба Только что, Nick_K сказал: А вот что категорически принципиально - это задать правильные констрейны Не могли бы вы помочь мне с ними в конкретном случае. Я так понимаю нужно создать файл .sdc. Что необходимо в него записать (желательно с разъяснениями). По теме нагуглил статью, пока с первого раза не осилил информацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 1 1 июля, 2020 Опубликовано 1 июля, 2020 (изменено) · Жалоба 39 minutes ago, pinchemierda said: 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; end end always @(negedge SCLK) begin if(counter == 3'd7) spirx <= spireg; if(counter == 3'd7 || ~txsw) txbuf <= spitx; 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 Асинхронный сброс в чистом виде... Как написано в "умных книжках" - делать не надо, они писались в допотопные времена, когда синтеза для ПЛИС еще не было. Если нужен именно асинхронный сброс - лучше сформировать короткий импульс на фронте или спаде входного сигнала сброса, его и подавать на асинхронные входы триггеров, пример: module top( input clk, ss, d, output reg q ); reg clr=0; always@(negedge ss or posedge clr) if(clr) clr<=0; else clr<=1; always@(posedge clk or posedge clr) if(clr) q<=0; else q<=d; endmodule Изменено 1 июля, 2020 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Raven 11 1 июля, 2020 Опубликовано 1 июля, 2020 · Жалоба 2 TC : Ок - в отношении обоих постов. Только я сейчас исчезну с радаров до вечера. Если до вечера не насоветуют - вернемся к вопросу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться