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

Не понимаю код счётчика

Здравствуйте, уважаемые форумчане.

Привык всегда во всём досконально разбираться и вот, на этой почве столкнулся со следующей проблемой.

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

Вот код:

module counter_1 
    #( parameter WIDTH=3)                                 ? //   "#" зачем здесь этот символ, дальше понятно, параметр степень двойки, до куда считает счётчик  // ширина выходной шины счётчика, 3 линии, в общем считаем от 0 до 7
    (input clk,                                                        //  входной, тактовый  сигнал счётчика 
       input rst_n,                                                   //  входной сигнал сброса счётчика   
       output reg [WIDTH-1:0] cnt);                        ? //  "output reg" выходной регистр, наверное; " [WIDTH-1:0]" -  что это на работу не влияет, но линии от шины отъедает?  особенно первое число, второе, наверное значит от нуля 
           
            always@(posedge clk or negedge rst_n)     //   условие, если передний фронт clk или задний фронт rst_n, то начинаем
                begin                                                   //  начинаем
                   if(!rst_n)                                           ?//   если  - имеем задний фронт  rst_n, то        ( вопрос это я правильно понял, ! - здесь знак принадлежности, присутствия, совпадения? )
                      cnt <= {WIDTH{1'b0}};                 //  что то делаем с cnt, а что? а главное как? добавляем значение шириной в 1 бит на нулевой провод??     вообще ничего не понятно...   менял цифры - всё равно считает по 1 
                    else                                                 // иначе
                      cnt <= cnt - 1'b1;                           ? //  cnt назначаем значение cnt - 1? а почему не так, как через строчку выше? 
                    end                    // конецЪ
                
                      
endmodule  

Заранее большое спасибо за внимание и понимание!

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


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

Советую изучить в начале базовый синтаксис верилога, а потом уже здесь задавать вопросы. 
https://kit-e.ru/circuit/kratkij-kurs-hdl-chast-2-1/
https://marsohod.org/verilog
Этих двух курсов вам с лихвой хватит, чтобы вам все стало ясно по счетчику.

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


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

<делать каждый такт или при изменении резета с 1 на 0> {
	Если <резет == 0> (приставка _n означает, что сигнал скорее low-level, то есть активный при нуле)
      обнулить счетчик
	иначе
      декрементировать счетчик
}

 

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


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

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

Советую изучить в начале базовый синтаксис верилога

Спасибо конечно за такой совет, как работает счётчик я понимаю, но мне нужно назначение используемых операторов такого рода значений, и ресурсы эти я тоже изучаю, однако меня интересует как работает именно эта программка.  А программка взята из книжки "цифровой синтез, практический курс", стр  6-15, только счётчик я переделал на другое число.   В книжке так же не понятно написано...  Ну или я не понимаю. Не понимаю я написанный здесь код, ну дурак, таким родился.  Работа в целом мне понятна, мне нужна детализация, что, для чего и зачем.  В книжках и указанных Вами ресурсах необходимую детализацию для реализации счётчика мне найти не удалось.  Как работает приведённый в книжке пример тоже не понятно не смотря на её толщину в 555  страниц. 

1.jpg

19 минут назад, new123 сказал:

<делать каждый такт или при изменении резета с 1 на 0> {
	Если <резет == 0> (приставка _n означает, что сигнал скорее low-level, то есть активный при нуле)
      обнулить счетчик
	иначе
      декрементировать счетчик
}

 

Спасибо, а можно у Вас попросить прокомментировать назначение конкретных операторов и конструкций языка?  

24 минуты назад, new123 сказал:

<делать каждый такт или при изменении резета с 1 на 0> {
	Если <резет == 0> (приставка _n означает, что сигнал скорее low-level, то есть активный при нуле)
      обнулить счетчик
	иначе
      декрементировать счетчик
}

 

{WIDTH{1'b0}};   -  что означает форма записи?      почему нельзя просто записать в шину 3`b000  ?   зачем такая конструкция?

27 минут назад, new123 сказал:

<делать каждый такт или при изменении резета с 1 на 0> {
	Если <резет == 0> (приставка _n означает, что сигнал скорее low-level, то есть активный при нуле)
      обнулить счетчик
	иначе
      декрементировать счетчик
}

 

output reg [WIDTH-1:0] cnt      - вот этот фрагмент кода не понятен, особенно "[WIDTH-1:0] ".  [WIDTH-1:0]  - зачем это здесь ?  почему не [WIDTH-2:0], как объявлено в начале? назначение этой шины? 

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


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

22 minutes ago, МАСТЕР LO said:

{WIDTH{1'b0}};   -  что означает форма записи?      почему нельзя просто записать в шину 3`b000  ?   зачем такая конструкция?

Это  как раз  и объясняют в описании синтаксиса языка.  Запись  {WIDTH{1'b0}};   позволяет  автоматически задавать  ширину константы,  так как вместо WIDTH будет использована актуальная на момент компиляции величина соответствующая ширине регистра. А  запись  3'b000   имеет фиксированную ширину,  и  при смене ширины регистра вы будете вынуждены  править ее руками.  

 Что же касается  [WIDTH-1:0] -  cколько  битов (всего) будет в  регистре объявленном как reg [8:0] ... ?  А как  reg [8-1:0] ?  :scratch_one-s_head:

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


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

Можно еще разрядность указывать, чтобы избежать ругани синтезатора о невыровненности (и ошибок синтеза - даже гипотетических). Выглядеть будет еще страшнее
cnt [WIDTH-1:0] <= cnt [WIDTH-1:0] - {WIDTH-1{1'b0},1'b1};

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


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

32 минуты назад, RobFPGA сказал:

Это  как раз  и объясняют в описании синтаксиса языка.  Запись  {WIDTH{1'b0}};   позволяет  автоматически задавать  ширину константы,  так как вместо WIDTH будет использована актуальная на момент компиляции величина соответствующая ширине регистра. А  запись  3'b000   имеет фиксированную ширину,  и  при смене ширины регистра вы будете вынуждены  править ее руками.  

 Что же касается  [WIDTH-1:0] -  cколько  битов (всего) будет в  регистре объявленном как reg [8:0] ... ?  А как  reg [8-1:0] ?  :scratch_one-s_head:

Огромное СПАСИБО!!!  Начинаю осмыслять и искать где подробнее про это почитать!!!

3 минуты назад, Aleх сказал:

Можно еще разрядность указывать, чтобы избежать ругани синтезатора о невыровненности (и ошибок синтеза - даже гипотетических). Выглядеть будет еще страшнее
cnt [WIDTH-1:0] <= cnt [WIDTH-1:0] - {WIDTH-1{1'b0},1'b1};

Огромное СПАСИБО!!!  Начинаю осмыслять и искать где подробнее про это почитать!!!

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


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

3 hours ago, Aleх said:

Можно еще разрядность указывать, чтобы избежать ругани синтезатора о невыровненности (и ошибок синтеза - даже гипотетических). Выглядеть будет еще страшнее
cnt [WIDTH-1:0] <= cnt [WIDTH-1:0] - {WIDTH-1{1'b0},1'b1};

вопрос по теме, если я сделаю вот так, это будет одно и то же?

cnt <= WIDTH'(cnt - 1);

ругаться перестает, но досконально точно не знаю, насколько это правильно

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


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

49 minutes ago, new123 said:

вопрос по теме, если я сделаю вот так, это будет одно и то же?

Тут надо понимать  что  cnt <= cnt  + 1;  это  не тоже  самое что  cnt <= cnt  + 1'b1;   
В первом случае вы фактически пишете   cnt <= cnt  + 32'd1;  и потом удивляетесь  почему синтезатор ворчит на несовпадение разрядности. 

А так да, приведение  разрядности через WIDTH`(...) стандартная практика для SV.    

 

4 hours ago, Aleх said:

cnt [WIDTH-1:0] <= cnt [WIDTH-1:0] - {WIDTH-1{1'b0},1'b1};

Писать так нет смысла так как  cnt  уже имеет разрядность WIDTH.  А для  прибавления 1  достаточно  описать ее минимальной разрядности 1'b1. И она автоматом расширится до максимальной ширины операндов. 

Хотя  если  нужно  менять только часть cnt  то есть смысл и так.  

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


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

9 часов назад, RobFPGA сказал:

Тут надо понимать  что  cnt <= cnt  + 1;  это  не тоже  самое что  cnt <= cnt  + 1'b1;   
В первом случае вы фактически пишете   cnt <= cnt  + 32'd1;  и потом удивляетесь  почему синтезатор ворчит на несовпадение разрядности.

А разве стандартные преобразования типов тут не работают? Какая практическая разница в результате между + 1 и + 1'b1? В каких случаях это критично?

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


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

3 часа назад, dxp сказал:

практическая разница

В отсутствии или наличии варнинга. Зачем лишний варнинг на ровном месте?

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


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

А откуда берётся варнинг, если есть правила стандартных преобразований типов? Варниги лезут от тулов - одни ругаются, другие нет. Помнится, был опыт работы с Synplify, так он спокойно жевал  эти ' + 1' без криков, хотя очень придирчивый синтезатор и цеплялся буквально ко всему. А Quartus на том же коде пропускал массу всего, к чему придирался Synplify (кстати, по делу придирался по большей части), зато вот на это  ' + 1' ворчал.  В итоге, я просто заткнул его. Зачем писать больше, если можно писать меньше (не говоря уже о читабельности)? "Это короче, чем я могу написать, а компилятор должен понимать умолчания" © Б.Страуструп.

 

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

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


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

5 hours ago, dxp said:

А разве стандартные преобразования типов тут не работают? Какая практическая разница в результате между + 1 и + 1'b1? В каких случаях это критично?

1 hour ago, dxp said:

А откуда берётся варнинг, если есть правила стандартных преобразований типов? Варниги лезут от тулов - одни ругаются, другие нет.

Нет,  не критично.  И в стандарте об том говорится что операнды автоматом расширяются. Только вот в первом случае расширение будет до 32 бит,  а во втором до ширины cnt.  Затем при присвоении результат будет обрезан до ширины cnt.  Отсюда и  возникают варнинги в тех тулзах (Qu) которые на это обращают внимание. И IMHO судя по всему по собственному желанию, а не по требованию стандарта.  

 

         

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


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

2 hours ago, dxp said:

А Quartus на том же коде пропускал массу всего, к чему придирался Synplify (кстати, по делу придирался по большей части), зато вот на это  ' + 1' ворчал.

Всё потому, что Симплифай - это лидирующий производиткль тулзов для SPnR, а Квартус - условно-бесплатная поделка индусов, чтобы просто работало. Плюс есть мысль, что Симплифай имеет на борту автоматический LEC, который и выдаёт все нужные ворнинги

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


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

Ну, Synplify это только synthesis, PnR там нету (во всяком случае не было, когда я его использовал, ещё до поглощения Synopsys, но полагаю, что и сейчас этого тоже нет - PnR всегда было и остаётся прерогативой вендора чипа). А Quartus вполне приличный тул, и поддержка того же SV в нём началась раньше и была лучше, чем в Synplify (почему я сего и спрыгнул в пользу Quartus). Правда, это было ещё на каких то 7-8-9 версиях, после 13.1 он начал, имхо, портиться, к сожалению.

57 минут назад, RobFPGA сказал:

Только вот в первом случае расширение будет до 32 бит,  а во втором до ширины cnt.

Кстати, а вот тут может работа в 32-битных (интах) целых может оказаться эффективнее для симулятора - не надо эмулировать нестандартную ширину.

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


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

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

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

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

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

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

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

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

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

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