Jump to content

    
pinchemierda

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

Recommended Posts

57 minutes ago, Raven said:

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

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

Share this post


Link to post
Share on other sites
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 сигнала в пределах периода.

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

Share this post


Link to post
Share on other sites
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 Автору это пока не надо, у него другие проблемы, - до этих он еще не дошел

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
12 hours ago, Leka said:

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

 

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

Share this post


Link to post
Share on other sites
56 минут назад, pinchemierda сказал:

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

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

Share this post


Link to post
Share on other sites
Только что, 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.

Share this post


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

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

jpg.jpg

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

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

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

Share this post


Link to post
Share on other sites

А у меня в топ модуле кроме объявления 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

 

Share this post


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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Только что, Leka сказал:

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

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

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

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

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.