Язык Verilog

Использование и разработка софта (преимущественно на ПЦ)

Moderator: Shaos

IgorR76
Senior
Posts: 102
Joined: 27 Jul 2015 15:20

Re: Язык Вырвиглотк

Post by IgorR76 »

Shaos wrote:они были все укуренные это точно...
:lol: :lol: :lol:
Ну, такая концепция. Но пользоваться можно вполне.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Язык Вырвиглотк

Post by Lavr »

IgorR76 wrote:Так эта зараза Квартус каждый раз при перекомпиляции расставляет элементы по разному, случайно. Приходится по 5-10 раз компилировать, чтоб заработало так, как надо.
Вобще-то они там двигаются вручную, если надо. Я тоже разок был в шоке, когда то, что уже работало,
вдруг перестало работать после повторной прошивки... :wink:
iLavr
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Язык Вырвиглотк

Post by Shaos »

Потому что всё надо делать СИНХРОННЫМ :mrgreen:

Задержки - счётчиками и т.д.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Язык Verilog

Post by Shaos »

Lavr wrote:
Shaos wrote:асинхронные схемы для FPGA противопоказаны - мне это рассказали на одном симпозиуме индустриальных железячников...
Но, как показывает практика - вполне работают асинхронные схемы в FPGA... :roll:
угу - примерно вот так работают :mrgreen:
Приходится по 5-10 раз компилировать, чтоб заработало...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Язык Verilog

Post by Lavr »

Shaos wrote:
Lavr wrote:
Shaos wrote:асинхронные схемы для FPGA противопоказаны - мне это рассказали на одном симпозиуме индустриальных железячников...
Но, как показывает практика - вполне работают асинхронные схемы в FPGA... :roll:
угу - примерно вот так работают :mrgreen:
Приходится по 5-10 раз компилировать, чтоб заработало...
Это он совсем не про то, а про то, что Квартус расставляет расставляет элементы по разному,
что вполне поправимо вручную.

А асинхронные схемы в FPGA вполне работают, хотя везде и пишут, что надо всё делать синхронно.
Но вон тот же newold86 на нашем же форуме сделал приличное количество асинхронных схемы в FPGA
и всё вполне работало!
У элементов в FPGA просто очень высокое быстродействие, но и голова не плечах дана людям не только
для того, чтобы в неё есть, и ею слушать, что сказали "на одном симпозиуме индустриальных железячников..." :wink:
iLavr
User avatar
Icer
Senior
Posts: 163
Joined: 21 Aug 2018 07:39
Location: Кемеровская обл.

Re: Starting with FPGA

Post by Icer »

Shaos wrote: Самая укурка имеет место быть с case/casez/casex :idea:

см.https://www.verilogpro.com/verilog-case-casez-casex/
Учусь по статьям на марсоходе(надеюсь не входит в реестр запрещенных или бранных выражений) и до просветления мне далеко.
Пока определился, что просто case достаточно, а casez/casex для гурманов.

Сам процесс перехода с программирования процев и мк на программирование плисс - вот точно укурка.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Starting with FPGA

Post by Lavr »

Icer wrote:Сам процесс перехода с программирования процев и мк на программирование плисс - вот точно укурка.
Да нет. Там нужно просто сразу понять, что это не программа в привычном смысле, а "это происходит одновременно".
Но обычно об этом и во всех туториалах, и, вероятно, на Марсоходе, всегда предупреждают.
iLavr
Sorgelig
Writer
Posts: 11
Joined: 22 Aug 2018 14:37

Re: Язык Вырвиглотк

Post by Sorgelig »

Вручную можно наверное расставить если схема простенькая.
А чтобы не было "надо скомпилить несколько раз чтобы заработало" надо делать всё синхронным.

Именно VHDL придумали шизофреники, ибо как объяснить это:

if rising_edge(CLK) then
if CLK'event and CLK = '1' then
wait until rising_edge(CLK);

Суть - одно и то же.
При этом записать так можно:
mysig <= '1' if sig1 = '1' and sig2 = '0' else '0';
а вот то же самое для порта записать нельзя! Нужно заводить отдельный сигнал.

Про арифметику и пересылку значений из переменных разных типов - это вообще ужас ужас. Даже сложить два значения нельзя без подключения нужной библиотеки. При это часто определения внутри библиотек конфликуют типа unsigned уже определен в одной, а тебе непременно нужна еще одна библа где этот unsigned тоже определен.. При этом у VHDL нет таких эоементарных операций как сдвиг! Для этого нужна аж целая библа!
Значения std_logic и boolean не совместимы из-за чего приходится писать кучу глупых выражений.
if пухлый - обязательно нужно if then end if; писать даже если нужно всего одно присвоение по условию вставить.
Я уже не говорю про отсуствие a = b ? c : d; конструкцию, отсутсвующую в VHDL для process блоков.

Ну и куча куча всего такого из-за чего код пухлым и малочитаемым получается.
User avatar
Icer
Senior
Posts: 163
Joined: 21 Aug 2018 07:39
Location: Кемеровская обл.

Re: Язык Вырвиглотк

Post by Icer »

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

 module vga

Code: Select all

module vga(clk,color,h,v);
input clk;
output h,v;
output reg [2:0] color;

reg [9:0] h_cnt,v_cnt;

always @(posedge clk)
begin
   if (h_cnt<800) h_cnt<=h_cnt+1'b1; else
	begin
	   h_cnt<=1'b0;
		if (v_cnt<525) v_cnt<=v_cnt+1'b1; else v_cnt<=1'b0;
	end;
	
	if ((h_cnt>639)|(v_cnt>479)) color<=3'b000; else
	   if (v_cnt<160) color<=3'b100; else
		   if (v_cnt<320) color<=3'b010; else color<=3'b001;
end

assign h=~((h_cnt>639+16)&(h_cnt<639+16+96));
assign v=~((v_cnt>479+10)&(v_cnt<479+10+2));

endmodule

 фото
ep4ce10_vga.jpg

You do not have the required permissions to view the files attached to this post.
Last edited by Icer on 27 Aug 2018 20:46, edited 1 time in total.
Sorgelig
Writer
Posts: 11
Joined: 22 Aug 2018 14:37

Re: Язык Вырвиглотк

Post by Sorgelig »

Hаличие странных begin/end в verilog легко объяснимо. {} было отдано на bit concatenation. Всё таки HDL накладывает свои особенности, которые и пришлось внести сделав его несколько отличаемым от C/Java. Но в целом концепция C сохранилась.
Еще в verilog можно локальные перменные вводить в always блоки и работать с ними как с глобальными сигналами, то есть делать неблокирующие присвоения. В VHDL локальные переменные не могут иметь неблокирующие присвоения <=. Только блокирующие := разрешены приучающие к плохому стилю HDL программирования.

Есть у VHDL и хорошие фичи, которые либо хуже реализованы в Verilog либо не реализованы вообще. Но у Verilog есть развитие ввиде SystemVerilog в котором есть всё :)

Могу писать и на VHDL и на Verilog, но на Verilog скорость написания кода в разы выше. Ну и более компактно получается. В смешанныз проектах в VHDL приходится писать объявление компонента если он в Verilog. А если наоборот то ничего не надо писать дополнительно.
User avatar
Icer
Senior
Posts: 163
Joined: 21 Aug 2018 07:39
Location: Кемеровская обл.

Re: Язык Вырвиглотк

Post by Icer »

Больше подробностей и кода товарищи!
Shaos wrote: Самая укурка имеет место быть с case/casez/casex :idea:
см.https://www.verilogpro.com/verilog-case-casez-casex/
Так что же с ними не так?
Sorgelig wrote:{} было отдано на bit concatenation
Вроде бы понял, но формулировка заставила долго гуглить. {} позволяет объединить сигналы в массив и работать как с единым целым.
Sorgelig wrote:Только блокирующие := разрешены приучающие к плохому стилю HDL программирования.
Почти во всех статьях встречаю, что ":=" зло, но если оно работает и присутствует в языке -> необходимое зло. Особого понимания как оно применяется пока нет и даже спросить не знаю о чем.
User avatar
Shaos
Admin
Posts: 24080
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Язык Вырвиглотк

Post by Shaos »

Icer wrote:Больше подробностей и кода товарищи!
Shaos wrote: Самая укурка имеет место быть с case/casez/casex :idea:
см.https://www.verilogpro.com/verilog-case-casez-casex/
Так что же с ними не так?
Ну то, что они как бы есть, но использовать их нежелательно...
While wildcard case comparison can be useful, it also has its dangers. Imagine a potentially dangerous casez statement where the case expression is a vector and one bit resolves to a “Z”, perhaps due to a mistakenly unconnected input. That expression will match a case item with any value for the “Z” bit! To put in more concrete terms, if the LSB of irq in the above code snippet is unconnected such that the case expression evaluates to 3’b00Z, the third case item will still match and int0 will be set to 1, potentially masking a bug!

Even wilder: casex

Now that we understand the usage and dangers of casez, it is straight-forward to extend the discussion to casex. casex allows “Z”, “?”, and “X” to be treated as don’t care values in either the case expression and/or the case item when doing case comparison. That means, everything we discussed for casez also applies for casex, plus “X” is now also a wildcard. In my previous article on Verilog X Optimism I discussed how X’s can propagate around a design and mask design issues. These propagated X’s can easily cause problems when combined with casex statements. To avoid these problems, the recommendation from RTL Coding Styles That Yield Simulation and Synthesis Mismatches is not to use casex at all for synthesizable code.
Я тут за главного - если что шлите мыло на me собака shaos точка net
Sorgelig
Writer
Posts: 11
Joined: 22 Aug 2018 14:37

Re: Язык Вырвиглотк

Post by Sorgelig »

Shaos wrote: Now that we understand the usage and dangers of casez, it is straight-forward to extend the discussion to casex. casex allows “Z”, “?”, and “X” to be treated as don’t care values in either the case expression and/or the case item when doing case comparison. That means, everything we discussed for casez also applies for casex, plus “X” is now also a wildcard. In my previous article on Verilog X Optimism I discussed how X’s can propagate around a design and mask design issues. These propagated X’s can easily cause problems when combined with casex statements. To avoid these problems, the recommendation from RTL Coding Styles That Yield Simulation and Synthesis Mismatches is not to use casex at all for synthesizable code.
Ну тот, кто это писал явно сам укуренный был ибо смешал разные понятия.
X в логическом присвоении и использовании - это одно. А вот X в casex - это совсем другое, совершенно не имееющее отнощение к первому. X в casex - это просто маска, означающая не сравнивать данный бит. Чувак, написавший данный опус, сам никогда не использовал это и не знает как это работает. Просто почитал, сидя на толчке, описание и сделал вывод.
casex - очень полезная и мощная штука, позволяющая компактно записать матрицу соответсвий не прибегая к приоритетному селектору if else if else if else добавляющего нехилую задержку при длинной if цепочке. casex позволяет сильно сократить такие задержки при синтезе!
Аналог casex есть и в VHDL когда в when в case имеет значения типа "01--".
User avatar
Icer
Senior
Posts: 163
Joined: 21 Aug 2018 07:39
Location: Кемеровская обл.

Re: Язык Вырвиглотк

Post by Icer »

Sorgelig wrote:if else if else if else добавляющего нехилую задержку при длинной if цепочке
переписал свой быдлокод правда без casex
Так лучше?

 module vga

Code: Select all

module vga(clk,color,h,v);
input clk;
output h,v;
output [2:0] color;
reg [2:0] pixel;

reg [9:0] h_cnt,v_cnt;

always @(posedge clk)
begin
   if (h_cnt<800) h_cnt<=h_cnt+1'b1; else
	begin
	   h_cnt<=1'b0;
		if (v_cnt<525) v_cnt<=v_cnt+1'b1; else v_cnt<=1'b0;
	end;
/*	
	if ((h_cnt>639)|(v_cnt>479)) color<=3'b000; else
	   if (v_cnt<160) color<=3'b100; else
		   if (v_cnt<320) color<=3'b010; else color<=3'b001;
*/

	case (v_cnt[8:5])
	4'b0000: pixel<=3'b100;
	4'b0101: pixel<=3'b010;
	4'b1010: pixel<=3'b001;
	default;
	endcase

end

assign h=~((h_cnt>639+16)&(h_cnt<639+16+96));
assign v=~((v_cnt>479+10)&(v_cnt<479+10+2));
assign color=((h_cnt>639)|(v_cnt>479)) ? 1'b0 : pixel;

endmodule

Last edited by Icer on 27 Aug 2018 20:45, edited 1 time in total.
Sorgelig
Writer
Posts: 11
Joined: 22 Aug 2018 14:37

Re: Язык Вырвиглотк

Post by Sorgelig »

Icer wrote:
Sorgelig wrote:if else if else if else добавляющего нехилую задержку при длинной if цепочке
переписал свой быдлокод правда без casex
Так лучше?
3 if - не так много чтобы переписывать :)
Я бы лучше отказался от сравнений <>. В данном контексте при гарантированном последовательном счете лучше юзать == и !=. С точки зрения железа - это намного проще синтезировать чем сравнение на больше/меньше. Для видео генератора есть еще два важных сигнала - это HBlank и VBlank - сигналы гашения. Они тут неявно присутствуют, но лучше их выделить отдельно на выход. Всякие скандаблеры и скалеры треюбуют эти сигналы для точного выделения полезного видео сигнала. А у вас уже будут эти сигналы.

Code: Select all

if(h_cnt == HSYNC_BEG) hs <= 1;
if(h_cnt == HSYNC_END) hs <= 0;
if(h_cnt == HBLANK_BEG) hblank <= 1;
if(h_cnt == HBLANK_END) hblank <= 0;
и т.д.. При это не придется писать if else if else.