Jump to content

    
pinchemierda

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

Recommended Posts

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

Цитата

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

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

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

Share this post


Link to post
Share on other sites
5 minutes ago, pinchemierda said:

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

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

4 hours ago, pinchemierda said:

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

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

Share this post


Link to post
Share on other sites
11 minutes ago, pinchemierda said:

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

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

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

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

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

Нереально

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
1 minute ago, pinchemierda said:

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

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

Share this post


Link to post
Share on other sites
35 minutes ago, Leka said:

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

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

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

Share this post


Link to post
Share on other sites
6 часов назад, Leka сказал:

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
2 hours ago, pinchemierda said:

Помогло!

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

Share this post


Link to post
Share on other sites
3 hours ago, pinchemierda said:

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

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

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

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

Share this post


Link to post
Share on other sites

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

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.

Share this post


Link to post
Share on other sites
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-бриджи. Вместо того чтобы объяснить, как сделать просто и правильно.

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

Share this post


Link to post
Share on other sites
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

 

Share this post


Link to post
Share on other sites

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

 

Предавать  флаг приема  в  системный клок в вашем случае лучше   используя 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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.