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

Первый проект на Verilog. Прошу помощи

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 на один из этих выводов?      

А можно увидеть результирующий код? И чтобы в нем уже было выполнено пожелание разложить все по полочкам, не смешивая в одну кучу? А то уже столько итераций и постов было, что непонятно, что из себя представляет объект обсуждения к этому моменту.

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


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

53 minutes ago, Nick_K said:

сигнал для управления асинхронным сбросом формируется в синхронном домене

Те описали в конечном итоге синхронный сброс - нет клока, нет сброса.

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


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

В тех случаях, когда важно наличие клока, этот подход не применяется. Затронутое ранее - это лишь некоторые наброски для иллюстрации случаев, в которых асинхронный сброс полезен, или как могут решаться сопутствующие проблемы. А не свод единых правил. Жизнь многообразнее, чем рамки, в которые вы сами себя загоняете.

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


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

26 minutes ago, Raven said:

Обычно сигнал сброса, подключаемый к асинхронным reset-входам триггеров, делают на входе в систему синхронным

Те получили синхронный сброс, и ...

26 minutes ago, Raven said:

Но даже и в мире FPGA могут быть ситуации, когда тактового сигнала может не быть. Например, из-за энергосбережения. В сложных конструкциях части системы м.б. отключены, пока не понадобятся. И т.п. Да мало ли еще из-за чего какой-то клок может иногда отсутствовать.

… нет клока - нет сброса.

26 minutes ago, Raven said:

Покажите уже, наконец, этот страшный результат. Чтобы было что объяснять.

Синтезатор сделает "провод", те код эквивалентен "assign q=d;" .

Так происходит потому, что асинхронный сброс в терминах синтеза - специальная договоренность, как его описывать, по русски это называется - костыль.

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

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


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

6 minutes ago, Leka said:

… нет клока - нет сброса.

Выше уже написал о многообразии жизненных ситуаций. Когда клока нет, а сигнал сброса нужен - переводящий в известное состояние или удерживающий в нем.

Quote

Синтезатор сделает "провод", те код эквивалентен "assign q=d;" .

"Попросите, и дадено будет вам". Что попросили, то и получили. В чем причина удивления-то, никак не пойму? Нормальнй код => нормальный результат синтеза. Странный код => странные результаты. Мусор на входе => мусор на выходе.

Quote

Так происходит потому, что асинхронный сброс в терминах синтеза - специальная договоренность, как его описывать, другими словами, по русски это называется - костыль.

Вообще-то, паттерном распознавания для нормального синтеза будет являться весь always блок, описывающий либо триггер с асинхронным сбросом, либо с синхронным, либо вовсе без сброса. И это все - специальные договоренности. Почему вы одну считаете более правильной, чем другие - непонятно.

 

И да, под жаргонным термином "костыль" каждый понимает что-то свое. Я вот ни под каким соусом описанные выше договоренности с этим словом не ассоциирую.

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


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

Только что, 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 сказал:

Сами-то чувствуете разницу?

Небо и земля)) Самое главное, другая схема синтезируется. Мне ошибочно казалось, что только на читаемость влияет.

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


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

Just now, pinchemierda said:

Небо и земля)) Самое главное, другая схема синтезируется. Мне ошибочно казалось, что только на читаемость влияет.

Это из-за того, что в запутанном коде и ошибиться легко.

Далее. Я не спец по SPI - так что могу задавать странные вопросы. SCLK - он всегда наличествует, или его присутствие/отсутствие чем-то обусловлено?

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


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

53 minutes ago, pinchemierda said:

И ещё вопрос, есть разница от какого пина тактировать модуль? Если нет, то для чего у микросхемы есть специальные пины для подключения внешнего генератора (у EPM240T100C5 это PIN12, 14, 64, 62)? Если делать асинхронный SPI может имеет смысл подключать SPI CLK на один из этих выводов? 

При Вашей частоте - это не принципиально (50 МГц). А вот что категорически принципиально - это задать правильные констрейны. Тем более что-то мне подсказывает, что Ваш чип подходит к максимальной рабочей частоте. Соответственно без задания входных задержек, модели отношения сигнала к клоку и т.п. не обойтись.

3 minutes ago, pinchemierda said:

Мне ошибочно казалось, что только на читаемость влияет.

Это Вы ещё на VHDL не писали. Там всё на удобочитаемости строится... Хотя и педалить букв в разы больше.

 

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


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

И еще: напомните, пожалуйста, с каким устройством вы взаимодействуете здесь? Вы же на чем-то проверяете, судя по постам? Какое у этого SPI-устройства понимание протокола взаимодействия?

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


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

Только что, 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).  

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


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

Только что, Nick_K сказал:

А вот что категорически принципиально - это задать правильные констрейны

Не могли бы вы помочь мне с ними в конкретном случае. Я так понимаю нужно создать файл .sdc. Что необходимо в него записать (желательно с разъяснениями).

По теме нагуглил статью, пока с первого раза не осилил информацию.

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


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

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
Изменено пользователем Leka

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


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

2 TC : Ок -  в отношении обоих постов. Только я сейчас исчезну с радаров до вечера. Если до вечера не насоветуют - вернемся к вопросу.

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


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

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

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

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

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

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

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

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

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

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