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

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

Удвоитель частоты это интересно)) Правда смущает вот это:

Цитата

Эта схема заставляет нахмурится всех цифровых дизайнеров, она должна быть использована только как крайняя мера.

На крайние меры уж идти не хотелось бы. Если, кроме как через детекторы фронтов (синхронный) SPI не написать, то и фиг с ним. Совсем уж костыльные решения применять не хочется. По синхронному всё ясно, код подправлю. Я на него просто уже давно забил, работает на частоте 9 МГц и ладно... 

Хочется понять, реально ли написать асинхронный SPI (не зависящий от i_core_clk), который будет работать стабильно. Или асинхронный SPI это ещё больший костыль, чем удвоитель частоты и не стоит тратить на это время?

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


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

5 minutes ago, pinchemierda said:

Хочется понять, реально ли написать асинхронный SPI (не зависящий от i_core_clk), который будет работать стабильно. Или асинхронный SPI это ещё больший костыль, чем удвоитель частоты и не стоит тратить на это время?

Нереально, и это еще бОльший костыль чем удвоитель частоты

4 hours ago, pinchemierda said:

... Является ли это подтверждением того, что spi клок подходящего качества?   

Одна оговорка - в терминах разработки для ПЛИС это вообще не clock

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


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

11 minutes ago, pinchemierda said:

Или асинхронный SPI это ещё больший костыль

Асинхронный spi slave - не костыль, а самый разумный подход.

Клок spi м/б под 100МГц, какой тогда системный клок д/б у синхронного варианта? 

Проблема скорее всего в проводах - как на фото, без последовательных резисторов - не правильно.

5 minutes ago, Джеймс said:

Нереально

Не надо вводить новичков в заблуждение. 

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


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

Сейчас заметил одну вещь. Если на плате с ПЛИС зажать снизу пальцем контакты SPI, то всё начинает приниматься правильно даже на частоте 18МГц. Может подтяжку на все входы сделать? 

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


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

1 minute ago, pinchemierda said:

Сейчас заметил одну вещь. Если на плате с ПЛИС зажать снизу пальцем контакты SPI, то всё начинает приниматься правильно даже на частоте 18МГц. Может подтяжку на все входы сделать? 

Это затухание вводится, звон уменьшается. Надо правильный кабель сделать. Самое простое - разрезать провода пополам (кроме земляного), и впаять резисторы, ориентировочно 0.5 КОм.

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


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

35 minutes ago, Leka said:

Не надо вводить новичков в заблуждение. 

> Решением этой проблемы возможно будет создание модуля (асинхронного SPI) не привязанного к частоте 50МГц (по советам Plain и Leka).   
>
Уточню и повторюсь. C такой формулировкой "ТЗ" (использование только SPI_CLK) это невозможно

Если кто-то будет делать 100MHz SPI slave, полагаясь только на частоту SPI_CLK, диагноз будет тот же самый

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


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

6 часов назад, Leka сказал:

резисторы, ориентировочно 0.5 КОм.

Помогло! :yahoo: Виной всему был звон в проводах. Странно, что его влияние проявляется только при одновременном приёме и передачи.

6 часов назад, Джеймс сказал:

C такой формулировкой "ТЗ" (использование только SPI_CLK) это невозможно

Да я бы смирился с отсутствием o_irq. В конце концов всё равно результат работы SPI приводить в домен основного клока, там его(o_irq) и буду формировать.

Всем неравнодушным огромнейшое спасибо! 

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


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

2 hours ago, pinchemierda said:

Помогло!

Ура! Но для более высоких частот надо будет аккуратнее отнестись к кабелям, предусмотреть согласование, и тд.

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


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

3 hours ago, pinchemierda said:

Помогло! :yahoo: Виной всему был звон в проводах. Странно, что его влияние проявляется только при одновременном приёме и передачи.

Да я бы смирился с отсутствием o_irq. В конце концов всё равно результат работы SPI приводить в домен основного клока, там его(o_irq) и буду формировать.

Всем неравнодушным огромнейшое спасибо! 

Так какой вариант проекта вы в итоге использовали?  C тактированием от clock 50MHz или с тактированием от SPI_CLK ?

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


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

Приветствую!

12 hours ago, pinchemierda said:

Хочется понять, реально ли написать асинхронный SPI (не зависящий от i_core_clk), который будет работать стабильно. Или асинхронный SPI это ещё больший костыль, чем удвоитель частоты и не стоит тратить на это время?

Вполне реально  но с маленьким НО ... 

12 hours ago, Джеймс said:

Нереально, и это еще бОльший костыль чем удвоитель частоты

Одна оговорка - в терминах разработки для ПЛИС это вообще не clock

Уточню и повторюсь. C такой формулировкой "ТЗ" (использование только SPI_CLK) это невозможно

Как категорично. А чем отличается SPI клок от обычного в терминах разработки FPGA? 

... маленькое НО -   Прием данных  по SPI Slave вполне можно сделать асинхронным используя только SPI клок.  И наличие  системного клока при этом не обязательно.  Но потом  вам с этими данными надо что то делать.  Если  просто нужно записать в регистр или  передавать в домен другого клока  для последующей обработки то вполне будет достаточно защелкивать их или по SPI клоку или асинхронно по фронту SPI sel. Тоже и с данными для чтения по SPI.

 

Удачи! Rob.

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


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

2 hours ago, RobFPGA said:

Как категорично. А чем отличается SPI клок от обычного в терминах разработки FPGA? 

... маленькое НО -   Прием данных  по SPI Slave вполне можно сделать асинхронным используя только SPI клок.  И наличие  системного клока при этом не обязательно.  Но потом  вам с этими данными надо что то делать.  Если  просто нужно записать в регистр или  передавать в домен другого клока  для последующей обработки то вполне будет достаточно защелкивать их или по SPI клоку или асинхронно по фронту SPI sel. Тоже и с данными для чтения по SPI.

 

Вы помните, как было у Булгакова? "Есть нужно уметь.... Нужно не только знать, что съесть, но и когда и как. ...  И что при этом говорить. "

Как думал ТС? Так и рассуждал! Ну а что SPI Clock? Обычный клок! Как и любой другой. Счетчик на нем тоже будет работать, всё просто. А то, что у такого счетчика с таким clock-ом даже reset корректно не сделать (и это заметьте не SRAM FPGA!) так об этом мы пока не задумываемся (а сброса в проекте и до сих пор нет). Конечно, автору нужен clock-бридж (особенно если он захочет довести частоту SPI до 100MHz). Ну давайте ещё 11 страниц обсуждать clock-бриджи. Вместо того чтобы объяснить, как сделать просто и правильно.

На этом моё участие в этой дискуссии закончено.

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


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

3 часа назад, Джеймс сказал:

Так какой вариант проекта вы в итоге использовали?  C тактированием от clock 50MHz или с тактированием от SPI_CLK ?

Оба работают пока. Просто тот, который не зависимый от системного клока (50 МГц) значительно шустрее. 

2 часа назад, RobFPGA сказал:

Но потом  вам с этими данными надо что то делать.

Сигнал o_irq добавил, который уже в домене системного клока. И даже работает всё!  

В общем вот последняя версия асинхронного SPI:


module spi_slave(
							input wire i_core_clk,
							
							input wire SS,
							input wire SCLK,
							output wire MISO,
							input wire MOSI,
							
							output wire o_irq,
							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;

//------------------------ o_irq -------------------------------------
	
	reg q, q1, q2;
	assign o_irq = q1 & ~q2;
	
	always @(negedge SCLK) 
	begin
		if(counter == 3'd7) q <= 1'd1;
		else q <= 1'd0; 
	end
	
	//Синхронизация q с i_core_clk 
	always @(posedge i_core_clk) 
	begin
		q1 <= q;
		q2 <= q1;
	end
	
endmodule

 

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


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

Приветствую!

 

Предавать  флаг приема  в  системный клок в вашем случае лучше   используя toggle вариант:

bit q, q1, q2, q3;
always @(negedge SCLK) begin
  if(counter == 3'd7) q <= ~q;
end
	
//Синхронизация q с i_core_clk 
assign o_irq = q2 ^ q3;

always @(posedge i_core_clk) begin
  q1 <= q;
  q2 <= q1;
  q3 <= q2;
end

 

Удачи! Rob.

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


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

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

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

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

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

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

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

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

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

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