nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 10:06



Reply to topic  [ 67 posts ]  Go to page Previous  1, 2, 3, 4, 5  Next
Язык Verilog 
Author Message
Senior

Joined: 27 Jul 2015 15:20
Posts: 101
Reply with quote
Shaos wrote:
они были все укуренные это точно...

:lol: :lol: :lol:
Ну, такая концепция. Но пользоваться можно вполне.


22 Aug 2018 18:00
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
IgorR76 wrote:
Так эта зараза Квартус каждый раз при перекомпиляции расставляет элементы по разному, случайно. Приходится по 5-10 раз компилировать, чтоб заработало так, как надо.

Вобще-то они там двигаются вручную, если надо. Я тоже разок был в шоке, когда то, что уже работало,
вдруг перестало работать после повторной прошивки... :wink:

_________________
iLavr


22 Aug 2018 18:14
Profile
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22410
Location: Silicon Valley
Reply with quote
Потому что всё надо делать СИНХРОННЫМ :mrgreen:

Задержки - счётчиками и т.д.

_________________
:dj: https://mastodon.social/@Shaos


22 Aug 2018 18:53
Profile WWW
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22410
Location: Silicon Valley
Reply with quote
Lavr wrote:
Shaos wrote:
асинхронные схемы для FPGA противопоказаны - мне это рассказали на одном симпозиуме индустриальных железячников...

Но, как показывает практика - вполне работают асинхронные схемы в FPGA... :roll:

угу - примерно вот так работают :mrgreen:
Quote:
Приходится по 5-10 раз компилировать, чтоб заработало...

_________________
:dj: https://mastodon.social/@Shaos


22 Aug 2018 19:01
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Lavr wrote:
Shaos wrote:
асинхронные схемы для FPGA противопоказаны - мне это рассказали на одном симпозиуме индустриальных железячников...

Но, как показывает практика - вполне работают асинхронные схемы в FPGA... :roll:

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

А асинхронные схемы в FPGA вполне работают, хотя везде и пишут, что надо всё делать синхронно.
Но вон тот же newold86 на нашем же форуме сделал приличное количество асинхронных схемы в FPGA
и всё вполне работало!
У элементов в FPGA просто очень высокое быстродействие, но и голова не плечах дана людям не только
для того, чтобы в неё есть, и ею слушать, что сказали "на одном симпозиуме индустриальных железячников..." :wink:

_________________
iLavr


22 Aug 2018 19:12
Profile
Senior
User avatar

Joined: 21 Aug 2018 07:39
Posts: 163
Location: Кемеровская обл.
Reply with quote
Shaos wrote:
Самая укурка имеет место быть с case/casez/casex :idea:

см.https://www.verilogpro.com/verilog-case-casez-casex/


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

Сам процесс перехода с программирования процев и мк на программирование плисс - вот точно укурка.


22 Aug 2018 22:11
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Icer wrote:
Сам процесс перехода с программирования процев и мк на программирование плисс - вот точно укурка.

Да нет. Там нужно просто сразу понять, что это не программа в привычном смысле, а "это происходит одновременно".
Но обычно об этом и во всех туториалах, и, вероятно, на Марсоходе, всегда предупреждают.

_________________
iLavr


22 Aug 2018 22:23
Profile
Writer

Joined: 22 Aug 2018 14:37
Posts: 11
Reply with quote
Вручную можно наверное расставить если схема простенькая.
А чтобы не было "надо скомпилить несколько раз чтобы заработало" надо делать всё синхронным.

Именно 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 блоков.

Ну и куча куча всего такого из-за чего код пухлым и малочитаемым получается.


23 Aug 2018 02:03
Profile
Senior
User avatar

Joined: 21 Aug 2018 07:39
Posts: 163
Location: Кемеровская обл.
Reply with quote
За лутил vga приблуду и накатал портянку с подглядками в чужие проекты. Вроде работает.
Почти все понятно хоть и на обкуренном языке!

 module vga
Code:
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

 фото
Attachment:
ep4ce10_vga.jpg
ep4ce10_vga.jpg [ 81.33 KiB | Viewed 7741 times ]


Last edited by Icer on 27 Aug 2018 20:46, edited 1 time in total.



23 Aug 2018 06:43
Profile
Writer

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

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

Могу писать и на VHDL и на Verilog, но на Verilog скорость написания кода в разы выше. Ну и более компактно получается. В смешанныз проектах в VHDL приходится писать объявление компонента если он в Verilog. А если наоборот то ничего не надо писать дополнительно.


23 Aug 2018 07:50
Profile
Senior
User avatar

Joined: 21 Aug 2018 07:39
Posts: 163
Location: Кемеровская обл.
Reply with quote
Больше подробностей и кода товарищи!
Shaos wrote:
Самая укурка имеет место быть с case/casez/casex :idea:
см.https://www.verilogpro.com/verilog-case-casez-casex/
Так что же с ними не так?

Sorgelig wrote:
{} было отдано на bit concatenation
Вроде бы понял, но формулировка заставила долго гуглить. {} позволяет объединить сигналы в массив и работать как с единым целым.

Sorgelig wrote:
Только блокирующие := разрешены приучающие к плохому стилю HDL программирования.
Почти во всех статьях встречаю, что ":=" зло, но если оно работает и присутствует в языке -> необходимое зло. Особого понимания как оно применяется пока нет и даже спросить не знаю о чем.


23 Aug 2018 19:47
Profile
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22410
Location: Silicon Valley
Reply with quote
Icer wrote:
Больше подробностей и кода товарищи!
Shaos wrote:
Самая укурка имеет место быть с case/casez/casex :idea:
см.https://www.verilogpro.com/verilog-case-casez-casex/
Так что же с ними не так?

Ну то, что они как бы есть, но использовать их нежелательно...
Quote:
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.

_________________
:dj: https://mastodon.social/@Shaos


23 Aug 2018 22:48
Profile WWW
Writer

Joined: 22 Aug 2018 14:37
Posts: 11
Reply with quote
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--".


24 Aug 2018 04:37
Profile
Senior
User avatar

Joined: 21 Aug 2018 07:39
Posts: 163
Location: Кемеровская обл.
Reply with quote
Sorgelig wrote:
if else if else if else добавляющего нехилую задержку при длинной if цепочке
переписал свой быдлокод правда без casex
Так лучше?
 module vga
Code:
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.



24 Aug 2018 05:26
Profile
Writer

Joined: 22 Aug 2018 14:37
Posts: 11
Reply with quote
Icer wrote:
Sorgelig wrote:
if else if else if else добавляющего нехилую задержку при длинной if цепочке
переписал свой быдлокод правда без casex
Так лучше?


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

Code:
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.


24 Aug 2018 07:13
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 67 posts ]  Go to page Previous  1, 2, 3, 4, 5  Next

Who is online

Users browsing this forum: Shaos and 22 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.