МАСТЕР LO 0 10 февраля, 2022 Опубликовано 10 февраля, 2022 · Жалоба Здравствуйте, уважаемые форумчане. Привык всегда во всём досконально разбираться и вот, на этой почве столкнулся со следующей проблемой. По-скольку я начинающий, мне просто не хватает знаний, что бы понять код элементарного двоичного счётчика. Вот код: 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 Заранее большое спасибо за внимание и понимание! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Cianid 0 10 февраля, 2022 Опубликовано 10 февраля, 2022 · Жалоба Советую изучить в начале базовый синтаксис верилога, а потом уже здесь задавать вопросы. https://kit-e.ru/circuit/kratkij-kurs-hdl-chast-2-1/https://marsohod.org/verilog Этих двух курсов вам с лихвой хватит, чтобы вам все стало ясно по счетчику. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 10 февраля, 2022 Опубликовано 10 февраля, 2022 · Жалоба <делать каждый такт или при изменении резета с 1 на 0> { Если <резет == 0> (приставка _n означает, что сигнал скорее low-level, то есть активный при нуле) обнулить счетчик иначе декрементировать счетчик } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
МАСТЕР LO 0 10 февраля, 2022 Опубликовано 10 февраля, 2022 · Жалоба 4 минуты назад, Cianid сказал: Советую изучить в начале базовый синтаксис верилога Спасибо конечно за такой совет, как работает счётчик я понимаю, но мне нужно назначение используемых операторов такого рода значений, и ресурсы эти я тоже изучаю, однако меня интересует как работает именно эта программка. А программка взята из книжки "цифровой синтез, практический курс", стр 6-15, только счётчик я переделал на другое число. В книжке так же не понятно написано... Ну или я не понимаю. Не понимаю я написанный здесь код, ну дурак, таким родился. Работа в целом мне понятна, мне нужна детализация, что, для чего и зачем. В книжках и указанных Вами ресурсах необходимую детализацию для реализации счётчика мне найти не удалось. Как работает приведённый в книжке пример тоже не понятно не смотря на её толщину в 555 страниц. 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], как объявлено в начале? назначение этой шины? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 10 февраля, 2022 Опубликовано 10 февраля, 2022 · Жалоба 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] ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Avex 1 10 февраля, 2022 Опубликовано 10 февраля, 2022 · Жалоба Можно еще разрядность указывать, чтобы избежать ругани синтезатора о невыровненности (и ошибок синтеза - даже гипотетических). Выглядеть будет еще страшнее cnt [WIDTH-1:0] <= cnt [WIDTH-1:0] - {WIDTH-1{1'b0},1'b1}; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
МАСТЕР LO 0 10 февраля, 2022 Опубликовано 10 февраля, 2022 · Жалоба 32 минуты назад, RobFPGA сказал: Это как раз и объясняют в описании синтаксиса языка. Запись {WIDTH{1'b0}}; позволяет автоматически задавать ширину константы, так как вместо WIDTH будет использована актуальная на момент компиляции величина соответствующая ширине регистра. А запись 3'b000 имеет фиксированную ширину, и при смене ширины регистра вы будете вынуждены править ее руками. Что же касается [WIDTH-1:0] - cколько битов (всего) будет в регистре объявленном как reg [8:0] ... ? А как reg [8-1:0] ? Огромное СПАСИБО!!! Начинаю осмыслять и искать где подробнее про это почитать!!! 3 минуты назад, Aleх сказал: Можно еще разрядность указывать, чтобы избежать ругани синтезатора о невыровненности (и ошибок синтеза - даже гипотетических). Выглядеть будет еще страшнее cnt [WIDTH-1:0] <= cnt [WIDTH-1:0] - {WIDTH-1{1'b0},1'b1}; Огромное СПАСИБО!!! Начинаю осмыслять и искать где подробнее про это почитать!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
new123 0 10 февраля, 2022 Опубликовано 10 февраля, 2022 · Жалоба 3 hours ago, Aleх said: Можно еще разрядность указывать, чтобы избежать ругани синтезатора о невыровненности (и ошибок синтеза - даже гипотетических). Выглядеть будет еще страшнее cnt [WIDTH-1:0] <= cnt [WIDTH-1:0] - {WIDTH-1{1'b0},1'b1}; вопрос по теме, если я сделаю вот так, это будет одно и то же? cnt <= WIDTH'(cnt - 1); ругаться перестает, но досконально точно не знаю, насколько это правильно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 10 февраля, 2022 Опубликовано 10 февраля, 2022 · Жалоба 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 то есть смысл и так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 34 11 февраля, 2022 Опубликовано 11 февраля, 2022 · Жалоба 9 часов назад, RobFPGA сказал: Тут надо понимать что cnt <= cnt + 1; это не тоже самое что cnt <= cnt + 1'b1; В первом случае вы фактически пишете cnt <= cnt + 32'd1; и потом удивляетесь почему синтезатор ворчит на несовпадение разрядности. А разве стандартные преобразования типов тут не работают? Какая практическая разница в результате между + 1 и + 1'b1? В каких случаях это критично? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 14 11 февраля, 2022 Опубликовано 11 февраля, 2022 · Жалоба 3 часа назад, dxp сказал: практическая разница В отсутствии или наличии варнинга. Зачем лишний варнинг на ровном месте? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 34 11 февраля, 2022 Опубликовано 11 февраля, 2022 · Жалоба А откуда берётся варнинг, если есть правила стандартных преобразований типов? Варниги лезут от тулов - одни ругаются, другие нет. Помнится, был опыт работы с Synplify, так он спокойно жевал эти ' + 1' без криков, хотя очень придирчивый синтезатор и цеплялся буквально ко всему. А Quartus на том же коде пропускал массу всего, к чему придирался Synplify (кстати, по делу придирался по большей части), зато вот на это ' + 1' ворчал. В итоге, я просто заткнул его. Зачем писать больше, если можно писать меньше (не говоря уже о читабельности)? "Это короче, чем я могу написать, а компилятор должен понимать умолчания" © Б.Страуструп. Но может я чего-то не знаю, не понимаю, что-то упускаю, какой-то важный нюанс (хотя ещё ни разу ничего не прилетело с этой стороны). Вот поэтому и интересуюсь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 11 февраля, 2022 Опубликовано 11 февраля, 2022 · Жалоба 5 hours ago, dxp said: А разве стандартные преобразования типов тут не работают? Какая практическая разница в результате между + 1 и + 1'b1? В каких случаях это критично? 1 hour ago, dxp said: А откуда берётся варнинг, если есть правила стандартных преобразований типов? Варниги лезут от тулов - одни ругаются, другие нет. Нет, не критично. И в стандарте об том говорится что операнды автоматом расширяются. Только вот в первом случае расширение будет до 32 бит, а во втором до ширины cnt. Затем при присвоении результат будет обрезан до ширины cnt. Отсюда и возникают варнинги в тех тулзах (Qu) которые на это обращают внимание. И IMHO судя по всему по собственному желанию, а не по требованию стандарта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 11 февраля, 2022 Опубликовано 11 февраля, 2022 · Жалоба 2 hours ago, dxp said: А Quartus на том же коде пропускал массу всего, к чему придирался Synplify (кстати, по делу придирался по большей части), зато вот на это ' + 1' ворчал. Всё потому, что Симплифай - это лидирующий производиткль тулзов для SPnR, а Квартус - условно-бесплатная поделка индусов, чтобы просто работало. Плюс есть мысль, что Симплифай имеет на борту автоматический LEC, который и выдаёт все нужные ворнинги Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 34 11 февраля, 2022 Опубликовано 11 февраля, 2022 · Жалоба Ну, Synplify это только synthesis, PnR там нету (во всяком случае не было, когда я его использовал, ещё до поглощения Synopsys, но полагаю, что и сейчас этого тоже нет - PnR всегда было и остаётся прерогативой вендора чипа). А Quartus вполне приличный тул, и поддержка того же SV в нём началась раньше и была лучше, чем в Synplify (почему я сего и спрыгнул в пользу Quartus). Правда, это было ещё на каких то 7-8-9 версиях, после 13.1 он начал, имхо, портиться, к сожалению. 57 минут назад, RobFPGA сказал: Только вот в первом случае расширение будет до 32 бит, а во втором до ширины cnt. Кстати, а вот тут может работа в 32-битных (интах) целых может оказаться эффективнее для симулятора - не надо эмулировать нестандартную ширину. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться