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

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

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

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

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

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

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


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

Цитата

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

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

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

   

Цитата

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

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

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


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

2 hours ago, pinchemierda said:

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

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

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

1 hour ago, Aldec said:

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

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

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

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


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

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

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

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

 

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

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

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

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


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

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

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

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

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


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

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

	
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

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

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


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

Только что, Джеймс сказал:

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

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

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


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

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

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


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

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

Цитата

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

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

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


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

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

И никаких negedge и никаких or posedge SS !

А что не так?

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


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

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

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

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


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

8 hours ago, pinchemierda said:

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

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

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


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

4 hours ago, pinchemierda said:

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

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

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


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

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


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

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

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

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

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

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

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

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

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

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