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

Перенос кода с языка C

Добрый день. Прошу помощи в написание модуля Verilog.

Есть код на C, обычный ногодрыг для МК atmega328.

static void init_latch(void)
{
	SET(LAT);
	_delay_us(1);
	SET(DCK);
	CLR(DCK);
	SET(DCK);
	CLR(DCK);
	SET(DCK);
	CLR(DCK);
	_delay_us(1);
	CLR(LAT);
}

Так вот вопрос, как в модуле Verilog сделать тоже самое?

module pulse_init(clk, enable, lat, dck);
 
input	enable; //нужно этим входом включать этот модуль
input	clk;

output	lat;
output	dck;


always @ (posedge clk)
lat = 1;

dck = 1;
dck = 0;
dck = 1;
dck = 0;
dck = 1;
dck = 0;
dck = 1;
dck = 0;

lat = 0;

endmodule

Это естественно не работает. Прошу сильно не пинать, Verilog я только начал изучать. И немного не доганяю, как организовать ногодрыг.

Заранее спасибо.

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


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

16 минут назад, RIMUS1989i сказал:

Добрый день. Прошу помощи в написание модуля Verilog.

Есть код на C, обычный ногодрыг для МК atmega328.


static void init_latch(void)
{
	SET(LAT);
	_delay_us(1);
	SET(DCK);
	CLR(DCK);
	SET(DCK);
	CLR(DCK);
	SET(DCK);
	CLR(DCK);
	_delay_us(1);
	CLR(LAT);
}

Так вот вопрос, как в модуле Verilog сделать тоже самое?


module pulse_init(clk, enable, lat, dck);
 
input	enable; //нужно этим входом включать этот модуль
input	clk;

output	lat;
output	dck;


always @ (posedge clk)
lat = 1;

dck = 1;
dck = 0;
dck = 1;
dck = 0;
dck = 1;
dck = 0;
dck = 1;
dck = 0;

lat = 0;

endmodule

Это естественно не работает. Прошу сильно не пинать, Verilog я только начал изучать. И немного не доганяю, как организовать ногодрыг.

Заранее спасибо.

Вам нужно описать цифровую схему Вашего ногодрыга. Это роще всего сделать описав двоичный счетчик. И нужый разряд подключить к ножке.  Но Вам надо бы начать изучать  Verilog по книгам. Потом посмотрите готовые примеры от Xilinx или Vivado.

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


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

Раз знаете си, зачем верилог? Пишите сразу на hls, функция ожидания есть в утилитах, ну или for с II=1

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


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

Подскажите где скачать HLS compiler? Если есть у кого поделитесь пожалуйста. Попробую изучить.

У меня пока макетка с altera MAX2.

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


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

23 minutes ago, RIMUS1989i said:

Подскажите где скачать HLS compiler? …

У меня пока макетка с altera MAX2.

Забудьте пока про HLS, экстрасенсы промахнулись. Изучайте синтезируемый Верилог. 

И принципы синхронного дизайна.

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


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

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

HLS compliler? Тут во многом зависит от того на какой платформе вы работаете, если Xilinx, то добро пожаловать в дивный мир Vitis HLS 

У Intel свой тулчейн, так же есть вендер независимые инструменты, такие как MG, ах да siemens, Catapult HLS

 

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


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

20 часов назад, RIMUS1989i сказал:

Добрый день. Прошу помощи в написание модуля Verilog.

...

 

code.v tb_1.sv

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


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

Lmx2315, Спасибо добрый человек. Но пока я не понимаю как Ваш код переделать для меня... Набросал свой код вроде бы делает что надо.

module pulse_init(clk, enable, lat, dck);

input	enable;
input	clk;

output	lat;
output	dck;

reg [4:0] count;
reg set = 1;
reg lat = 0;
reg dck = 0;


always @(posedge clk)//or posedge rst
begin
	if(enable && set)
	begin
		lat = 1;
		case(count) 
			0: begin
				dck = 0;
				end
			1: begin
				dck = 1;
				end
			2: begin
				dck = 0;
				end
			3: begin
				dck = 1;
				end
			4: begin
				dck = 0;
				end
			5: begin 
				dck = 1;
				end
			6: begin
				dck = 0;
				end
			7: begin
				dck = 1;
				end
			8: begin
				dck = 0;
				end
		default: begin
			set = 0;
			count = 9;
			lat = 0;
		end
		endcase
		
		count = count + 1;
	end 
	else 
	begin
		lat = 0;
		dck = 0;
		set = 1;
		count = 0;
	end
end
endmodule

Вот структура "case" мне не очень нравится.

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


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

Блокирующие присваивания в синхронном блоке не принято применять (если хотят это потом синтезировать) .

з.ы.

мой код выполняет ваши требования из первого сообщения - разве нет?

10 минут назад, RIMUS1989i сказал:

Lmx2315, Спасибо добрый человек. Но пока я не понимаю как Ваш код переделать для меня... Набросал свой код вроде бы делает что надо.


 

Вот структура "case" мне не очень нравится.

Кстати , обратите внимание на неполноту вашего задания - то что в мк можно заниматься "ногодрыганьем" в ПЛИС выродится в "ничего" . 

В плис надо обязательно указывать сколько нужно находиться в каком состоянии или сигнал не будет меняться вовсе.

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


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

31 minutes ago, Lmx2315 said:

Блокирующие присваивания в синхронном блоке не принято применять (если хотят это потом синтезировать) .

Как раз если синтезатор не совсем тупой (а у Xilinx и Altera они достаточно умные), то блокирующее и неблокирующее присваивание на результат синтеза не влияет. Эти штуки были придуманы, чтобы правильно делать моделирование в симуляторах. Синтез же просто выплюнет варнинги на неподобающий синтаксис и пойдёт дальше :smile:

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


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

Про переделать, я подразумевал, что не могу его преобразовать в графику, т.к. нет входов и выходов. Сейчас на данном этапе я пишу модуль, преобразую его в графический вид и рисую схему в Quartus. подключаю пины I/O и т.д. 

А вообще нужен модуль со следующей логикой работы: при восходящем фронте на enable, должен появиться сигнал на lat через такт clk появится четыре такта на dck и через такт clk на lat должен пропасть сигнал. И это должно происходить один раз  при восходящем фронте на enable, пока это не произойдет еще раз. но не должно срабатывать если в процессе выполнения манипуляций с lat и dck произошло событие на enable. Это в лучшем варианте.

Прикрепил тестовый проект.

test.rar

 

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

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


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

 

25 минут назад, Nick_K сказал:

Как раз если синтезатор не совсем тупой (а у Xilinx и Altera они достаточно умные), то блокирующее и неблокирующее присваивание на результат синтеза не влияет. Эти штуки были придуманы, чтобы правильно делать моделирование в симуляторах. Синтез же просто выплюнет варнинги на неподобающий синтаксис и пойдёт дальше :smile:

т.е. если написать:

always @(posedge clk)

begin

A1=A0;

A2=A1;

A3=A2;

end

То синтезатор поймёт, что я хотел задержку на регистрах сделать, а не приравняет мне вот так A3=A0 ?

 

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


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

4 минуты назад, Lmx2315 сказал:

 

т.е. если написать:

always @(posedge clk)

begin

A1=A0;

A2=A1;

A3=A2;

end

То синтезатор поймёт, что я хотел задержку на регистрах сделать, а не приравняет мне вот так A3=A0 ?

 

Именно так. Вы описали обычный сдвиговый регистр.

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


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

Just now, Lmx2315 said:

 

т.е. если написать:

always @(posedge clk)

begin

A1=A0;

A2=A1;

A3=A2;

end

То синтезатор поймёт, что я хотел задержку на регистрах сделать, а не приравняет мне вот так A3=A0 ?

 

Я же говорю - не совсем бездарный синтезатор поймёт. Поймёт, что конструкция под клоком и что есть пересохранение. Да это синтаксически неправильно. Да на это будет куча ворнингов. Но это будут обчные флопы. И да, так лучше не писать. Единственная оговорка, это тип объявленных переменных A0-A3, если reg - тогда регистры, если wire - тогда у вас ошибка в 2х местах :wink:
Вся магия блок и неблок присвоения - это позволить более точно ферифицировать код. А также анализировать возможные схемные проблемы. Например приведённый вами код в симуляторе будет отражать неправильно работающие флопы, что позволяет смоделировать различные не совсем легальные состояния силикона.

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


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

38 минут назад, Flip-fl0p сказал:

Именно так. Вы описали обычный сдвиговый регистр.

попробовал в квартусе  18.1:

module top (clk,in,out);
input wire clk;
input wire in;
output wire out;

reg A0;
reg A1;
reg A2;
reg A3;

always @(posedge clk)
begin

A0=in;
A1=A0;
A2=A1;
A3=A2;

end

assign out=A3;

endmodule

Синтезировался один регистр A3 .

Что я сделал не так?

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


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

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

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

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

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

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

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

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

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

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