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

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

57 minutes ago, Raven said:

Ну это же совсем другое дело - в смысле удобочитаемости. И что-то советовать здесь гораздо удобнее. Сами-то чувствуете разницу?

Советовать в плане сброса тут к сожалению нечего - у Автора везде используется "стробированный" SPI-clock, поэтому тактовая частота сигнал сброса "не накроет".
То есть всё та же алхимия и поиски философского камня

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


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

4 minutes ago, pinchemierda said:

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

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

Вот статья толковая, но немного сумбурно.

Для начала нужно обьявить клоки (создать клок группы):

create_clock -name spi_clk -period 20 [get_ports SCLK ]	-waveform {0.000000 25.000000}

где spi_clk - просто название группы, период - длительность периода в ns, SCLK - порт в который заходит клок (в самом топовом модуле), вейвформа не обязательна, но желательна (с указанием начала 0 и 1 сигнала в пределах периода.

Создайте клок группы для всех имеющихся частот в проекте и дальше продолжим. А то я уже ни Ваших частот не помню ни их значений

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


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

1 hour ago, Leka said:

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

Нет, вы к сожалению путаете терминологию.
Советую почитать классическую статью
 http://www.sunburst-design.com/papers/CummingsSNUG2002SJ_Resets.pdf

Статья относительно большая, поэтому можете сразу посмотреть, чем отличается Рисунок 3 от Рисунка 4. 
Ну и в 6 разделе речь идет как раз про синхронизатор для асинхронного reset-а.

Ну и ДА, сlock ("чистый" clock!) должен "накрывать" cигнал асинхронного сброса. И сниматься естественно в подходящее время ("the reset release, also called reset removal")

P.S Автору это пока не надо, у него другие проблемы, - до этих он еще не дошел

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


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

Дальше лучше всего будет прочитать сий документ: https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/manual/mnl_timequest_cookbook.pdf

Помучится с переводом (если плох английский), но всё же разобраться. Ибо в этой доке собраны обсновы основ для задания тайминг констрейнов. Ну и у Альтеры самые крутые даташити и апноты

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


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

12 hours ago, Leka said:

 Асинхронный сброс  ... Противоречит здравой идее синхронного дизайна. Служит источником трудноуловимых ошибок. Замусоривает код. И тд и тп. 

 

C тем что не "костыль" уже вроде должны разобраться. Но мне есть еще что добавить. Дело в том, что код для ПЛИС/ASIC не может существовать как некая абстракция. Этот код-  хороший, этот код - плохой. Код еще  должен учитывать особенности архитектуры семейства, использование трассировочных  ресурсов и так далее. 

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


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

56 минут назад, pinchemierda сказал:

результирующий код

Если в Вашем частном случае данные на spitx неизменны во время сеанса, а потому выкинули их загрузку по спаду SS, то и сам буферный регистр стал лишним.

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


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

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

Если нужен именно асинхронный сброс  - лучше сформировать короткий импульс на фронте или спаде входного сигнала сброса, его и подавать на асинхронные входы триггеров

Сделал так, не помогло


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;

	reg clr = 0;
	
	always@(negedge SS or posedge clr)
	begin
		if(clr) clr <= 0;
		else clr <= 1;
	end
	
	always @(negedge SCLK or posedge clr) 
	begin
		if(clr) 
		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

синтезируется такая схема:

Это вообще как, нормально?

jpg.jpg

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

Создайте клок группы для всех имеющихся частот в проекте и дальше продолжим.

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

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


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

15 minutes ago, pinchemierda said:

Это вообще как, нормально?

jpg.jpg

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

Нет, это не нормально (но и не критическая ошибка). Да и не переживайте Вы о синхронном/асинхронном сбросе. Не это самое страшное.

По поводу констрейнов - частоты нужно обьявлять все. Как SCLK так и рабочую частоту для остального проекта.

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


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

А у меня в топ модуле кроме объявления spi_slave модуля пока больше ничего и нет:

module top(
			input wire i_spi_cs,
			input wire i_spi_clk,
			input wire i_spi_mosi,
			output wire o_spi_miso,
			
			output wire [7:0]o_rx_buf
);
			 
	spi_slave spi(
						 i_spi_cs,
						 i_spi_clk,
						 o_spi_miso,
						 i_spi_mosi,
						 o_rx_buf,
						 o_rx_buf //эхо
					 );

endmodule

 

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


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

module spi_slave(
    input SS,
    input SCLK,
    input MOSI,        
    output MISO,
    input [7:0] TX,    
    output reg [7:0] RX
);
    reg [7:0] txbuf; 
    reg [6:0] txsr; 
    reg [7:0] rxsr; 
    reg [2:0] cnt=0;    
    reg clr=0;
    
always@(negedge SS or posedge clr)
        if(clr) clr <= 0;
        else clr <= 1;

always @(negedge SCLK or posedge clr) 
        if(clr) cnt <= 0;
        else cnt <= cnt + 1;

always @(posedge SCLK)
        rxsr <= {rxsr, MOSI};            
        
always @(negedge SCLK)
        if(cnt == 7) RX <= rxsr;
	
always @(posedge SCLK)
        if(cnt == 0) txbuf <= TX;            
	
always @(negedge SCLK)        
        if(cnt == 0) txsr <= txbuf;
        else  txsr <= {txsr, 1'b0};
	
assign MISO = (SS) ? 1'bz : (cnt == 0) ? txbuf[7] : txsr[6];

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

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


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

Leka, попробовал. Проблема осталась, в выходном порту мусор ((. Лишь изредка нормализуется приём на пару секунд (особенно если свободные контакты руками полапать), но потом сразу же срывается. Что отправляется по MISO даже не смотрел.

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


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

SS программно управляется, нет ошибок ?

Последовательные резисторы есть по проводам (против звона) ?

 

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


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

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

SS программно управляется, нет ошибок ?

Пробовал и просто его на gnd цеплять, без подключения к мастеру.

Если к мастеру цепляю, то после инициализации МК сразу подаю 0 и больше не трогаю.

Уменьшение скорости SPI тоже не помогает.

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


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

К мастеру вопросов точно нет. В синхронном варианте связка МК <-> ПЛИС работает, только частота не максимальная, а 9МГц.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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