Jump to content

    
pinchemierda

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

Recommended Posts

Ну мне почему-то хотелось этот сигнал генерировать именно на стороне мк.

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

Share this post


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

хотелось этот сигнал генерировать именно на стороне мк

Из этого никак не следует, что его надо заводить в ПЛИС без синхронизации.

Share this post


Link to post
Share on other sites

Да уж тупанул)) Не те методички читаю (или потому что по диагонали). Спасибо за разъяснения!

А можно ещё вопрос чисто фундаментальный? Что вообще можно считать с т.з. верилога одновременными событиями?  Например есть такая ситуация: 

два always блока, которые должны выполнятся одновременно (в списках чувствительности у обоих есть, к примеру, posedge CLK):

always@(posedge CLK or posedge Reset)
begin
  if(Reset) //..........
  else counter <= counter+1;
end
  
always@(posedge CLK)
begin
  val <= counter; //чему будет равен val?
end  

При самом первом фронте CLK val будет равен инкрементированному значению уже? Или он будет равен исходному значению counter (до сложения с 1)?

Или таких ситуаций необходимо избегать, из-за неопределённости?

Edited by pinchemierda

Share this post


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

 

При самом первом фронте CLK val будет равен инкрементированному значению уже?

После тактового сигнала, на выходе регистра всегда будет то, что было на входе. И тут только один фронт, никакого второго нет. Соответственно, val=counter, counter=+1, т.е. буквально то, что описано операторами.

Share this post


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

Что вообще можно считать с т.з. верилога одновременными событиями? 

Стандартом Verilog порядок выполнения always/initial не специфицируется. Т.е. может быть произвольным.

А то как это обрабатывается симулятором хорошо описано у sunburst-design но это уже детальное объяснение.

Share this post


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

При самом первом фронте CLK val будет равен инкрементированному значению уже?

Почитайте про отличия 2х типов присваивания: '=' и '<='

Вопрос отпадёт сам собой

Share this post


Link to post
Share on other sites

И снова здравствуйте, уважаемые знатоки ПЛИС и Verilog! 

Гляньте, что не так с кодом? Пытаюсь SPI slave в железе запустить, в функциональном симуляторе (без учёта таймингов) всё как надо работает.

Приёмный буфер o_rx_buf вывел наружу и подключил 8 светодиодов для отладки. В результате в этом буфере всё что угодно, только не то, что реально отправляется по линии MOSI. На выходе MISO тоже не пойми что. Если закомментировать всё, что связано с MISO, то сразу всё оживает и модуль начинает правильно воспринимать данные на линии MOSI. Частота i_core_clk = 50МГц, частота SPI clk = 18 МГц (хотя пробовал и меньше). Всё пытался сделать максимально синхронным. 

module spi_slave(
			input i_core_clk,	//FPGA clock
			
			input i_cs,
			input i_clk,
			input i_mosi,
			output reg o_miso,
				
			output reg o_irq,
			output reg [7:0]o_rx_buf,
			input      [7:0]i_tx_buf	
);

	reg [2:0]counter;							//счётчик битов
	reg sync_clk;

//-------------------------- MOSI ---------------------------------		
	
	reg [7:0]sr_rx;							//сдвиговый приёмный регистр 
	
	//Детектирование фронта CLK
	always @(posedge i_core_clk)
	begin
		sync_clk <= i_clk;
		
		if(!counter && sync_clk) 
		begin
			o_irq <= 1'd1;
			o_rx_buf <= sr_rx;
		end
		else o_irq <= 1'd0;
	end
		
	always @(posedge sync_clk or posedge i_cs)
	begin
		if(i_cs) counter <= 3'd0;
		else 
		begin
			counter <= counter + 1'd1;
			sr_rx <= {sr_rx[6:0], i_mosi};
		end	
	end
	
//-------------------------- MISO ---------------------------------	

	reg [7:0]sr_tx;							//сдвиговый регистр отправки
	reg [2:0]tmp;
	
	always @(*)
	begin
		if(i_cs) o_miso = 1'dZ;
		else o_miso = sr_tx[7];  
	end
	
	always @(posedge i_core_clk)
	begin
		tmp <= counter;
		if(!counter) sr_tx <= i_tx_buf;
		if(counter != tmp) sr_tx <= sr_tx << 1'd1;
	end
	
endmodule

 

 

Share this post


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

 Всё пытался сделать максимально синхронным.

вы логику того что написали, точно представляете? выложите файл модуля и тестбенча, как оно у вас работает в симуляторе

Share this post


Link to post
Share on other sites

Симулировал в квартусе с использованием функционального симулятора (там не нужен тестбенч). Modelsim не освоил пока ((.

Файл модуля выложил. Могу диаграммы выложить, но опять ругаться будут)). А что там с логикой то? Можете поправить?

Цитата

что sync_clk у вас на глобальной цепи "сидит"

не совсем понял, что здесь означает "на глобальной цепи"

Share this post


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

А что там с логикой то? Можете поправить?

в трех словах: в утиль, все. осваивайте нормальный симулятор и тестбенчи. на все про все 2-3 часа туториала. 

 

Share this post


Link to post
Share on other sites
51 minutes ago, new123 said:

везет =) у меня пару недель ушло

это если в слепую идти или самодеятельностью заниматься. А если поставить софт, открыть туториал и идти по шагам, то первый простой проект (ЕМНИП, там обычный счетчик + тестбенч) проходится за 2-3 часа. За это время студент получает: навык работы со средой, проектом, компиляция, запуск моделирования, отладка). Потом уже туториал по проектной работе, работы с командной строки, библиотеки. 

Для старта этого достаточно. У меня студенты через это проходят все) Причем весь материал идет вместе с софтом)

Share this post


Link to post
Share on other sites

2-3 часа достаточно для того, чтобы пройти по шагам инструкции, но совершенно недостаточно для того, чтобы что-то значимое осело в  голове и появилось нормальное понимание и представление. Это легко проверяется - дайте студенту, не знакомому ранее с темой и прошедшему тутор, задание сделать теперь самостоятельно другое подобное задание - результат не обрадует. Скорость освоения у всех, конечно, разная, но отличается не кардинально - определяется скоростью образования синапсических связей в мозгу, а мозг штука инертная и за раз в него не вложишь много. Т.ч. пройти-то студент это пройдёт за 3 часа, но что он усвоит - большой вопрос. От бэкграунда ещё сильно зависит.

 

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

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.