Jump to content

    
pinchemierda

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

Recommended Posts

17 минут назад, Leka сказал:

А нужна цепочка ТС? Если конечная задача - сделать spi мост между МК и конкретной схемой, не стоит усложнять.

Я уже говорил, у автора тот же самый экзаменационный билет, что и в предыдущей теме, с тем же самым сигналом прерывания непонятно кого — прерывать мастера сразу после завершения только что законченного им же сеанса?

Edited by Plain

Share this post


Link to post
Share on other sites
Цитата

у автора тот же самый экзаменационный билет

Да какой там экзамен)) Последний экзамен сдал ещё лет 10 назад (и далеко не по цифровой электросхемотехнике и программированию). Это же для души, так сказать. Спортивный интерес. Правда, так долго на одном месте я ещё не застревал (параллельно stm32 изучаю и там, на мой ламерский взгляд,  всё проще).

Просто на моём этапе освоения рассматриваю ПЛИС не как самостоятельный мозг устройства, а как расширитель возможностей МК. И для этого сначала мне нужно подружить их. SPI, как мне кажется, идеальный вариант для этого. 

   

Цитата

По стандарту, мастер в сеансе выдаёт ровно столько тактов, сколько бит в сумме у всех сдвиговых регистров, соединённых в цепочку

К примеру, если взять какой-нибудь дисплей с spi, там же нет необходимости стробировать каждый байт CS-ом. Он сам понимает, что транзакция байта закончилась. Собственно, это и отличает интерфейс SPI от интерфейса sn74hc595. Если ошибаюсь, то тогда мне нужен SPI подобный последовательный интерфейс, который не требуется стробировать CS-ом (наверно без счётчика бит не обойтись). 

Share this post


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

рассматриваю ПЛИС не как самостоятельный мозг устройства, а как расширитель возможностей МК. И для этого сначала мне нужно подружить их. SPI, как мне кажется, идеальный вариант для этого. 

Тогда надо следовать не стандартам, а возможностям МК и ПЛИС, со своими протоколами (возможно, похожими на стандартные), физическими уровнями, и тд.  

Например, если МК может выдавать spi-клок при выcоком уровне cs - так и делать, получится надежный синхронный дизайн с синхронным сбросом. Z-состояние выхода делать не нужно, если нет необходимости. И тд и тп.

1 hour ago, Aldec said:

Расширителю  контролера на плис потребуется не только счетчик но и проверка CRC.

??? Чтобы жизнь медом не казалась?

Edited by Leka

Share this post


Link to post
Share on other sites
2 часа назад, pinchemierda сказал:

сначала мне нужно подружить их. SPI, как мне кажется, идеальный вариант

А дальше как было дело? Откуда появилось ТЗ с "прерыванием в 1 такт" и прочими фантазиями? Ну вот у меня, например, есть конкретный микроконтроллер, и у него есть конкретный модуль SPI — тогда я просто делаю совместимую лишь конкретно с ним схему. Если в ПЛИС нет сигнала хотя бы 50 МГц, не говоря о 200 МГц, зачем вообще её ставить, и тогда я бы написал вышепоказанный синхронный интерпретатор SPI, а не тратил бы время на идею ради идеи.

 

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

какой-нибудь дисплей с spi, там же нет необходимости стробировать каждый байт CS-ом

В стандарте SPI тоже нет такой необходимости — за сеанс (один интервал SS) можно передавать бесконечно битов. Другое дело, что ни в МК, ни в устройстве нет бесконечной длины сдвигового и параллельного регистров — тогда выбирают дополнение к стандарту, частный случай "точка-точка", т.е. одно устройство с индивидуальным SS, с добавлением ведомому счётчика бит, чтобы МК и устройство брали данные на лету. Или, например, есть другое дополнение стандарта — т.н. блочный синхронный режим SPI, когда тактовый сигнал идёт непрерывно, а SS выдаётся длиной в 1 такт в начале блока.

Share this post


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

если МК может выдавать spi-клок при выcоком уровне cs

Давать клок подчинённому устройству при неактивном уровне cs иначе не будет работать... Нигде такого не видел)) Хотелось бы без экзотики, обычный spi 0 slave

Share this post


Link to post
Share on other sites

Немного переделал под свои нужды:

	
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

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

Share this post


Link to post
Share on other sites
Только что, Джеймс сказал:

Гвозди бы делать из этих людей.. (крепче бы не было в мире гвоздей)

Да пробовал я reset на 44 pin! Те же яйца, только в профиль. Не в этом дело. 

Share this post


Link to post
Share on other sites
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 Я естественно уверен, что ничего этого вы делать не будете

Share this post


Link to post
Share on other sites

Всё советы, которые вы продублировали (кроме i_rst), были учтены в варианте, который работает только на частоте spi clk не выше 9МГц (при тактировании ПЛИС 50МГц). Решением этой проблемы возможно будет создание модуля (асинхронного SPI) не привязанного к частоте 50МГц (по советам Plain и Leka).   

Цитата

естественно уверен, что ничего этого вы делать не будете

В общем вы, пожалуйста, тоже будьте внимательнее :acute:

Share this post


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

Логично выглядит?

Share this post


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

В симуляторе логика работы устраивает, но в железе не работает

Не читал все, если повторю чьи-то слова, пардон. А в симуляторе точно повторено поведение железного мастера? Сравнение с осциллографом было сделано? Многое может пойти не так. 

Share this post


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

Всё советы, которые вы продублировали (кроме i_rst), были учтены в варианте,

> Да пробовал я reset на 44 pin! Те же яйца, только в профиль. Не в этом дело. 
>

Ну и в каком случае вы говорили то, что соответствует действительности?


Но ответа  на этот  вопрос не требуется - все и так понятно. Продолжайте искать "философский камень" (=читерский совет, который заставит работать ваш код на живую нитку).

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.