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

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

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

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

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


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

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

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

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

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


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

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

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

два 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)?

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

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

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


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

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

 

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

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

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


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

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

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

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

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

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


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

56 minutes ago, pinchemierda said:

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

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

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

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


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

И снова здравствуйте, уважаемые знатоки ПЛИС и 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

 

 

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


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

 

1 hour ago, pinchemierda said:

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

 

 

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

 

 

 

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


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

7 hours ago, pinchemierda said:

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

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

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


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

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

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

Цитата

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

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

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


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

1 hour ago, pinchemierda said:

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

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

 

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


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

51 minutes ago, new123 said:

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

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

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

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


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

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

 

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

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


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

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

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

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

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

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

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

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

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

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