RIMUS1989i 0 25 февраля, 2021 Опубликовано 25 февраля, 2021 · Жалоба Добрый день. Прошу помощи в написание модуля 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 я только начал изучать. И немного не доганяю, как организовать ногодрыг. Заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 25 февраля, 2021 Опубликовано 25 февраля, 2021 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dmitry-tomsk 0 25 февраля, 2021 Опубликовано 25 февраля, 2021 · Жалоба Раз знаете си, зачем верилог? Пишите сразу на hls, функция ожидания есть в утилитах, ну или for с II=1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RIMUS1989i 0 26 февраля, 2021 Опубликовано 26 февраля, 2021 · Жалоба Подскажите где скачать HLS compiler? Если есть у кого поделитесь пожалуйста. Попробую изучить. У меня пока макетка с altera MAX2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 26 февраля, 2021 Опубликовано 26 февраля, 2021 · Жалоба 23 minutes ago, RIMUS1989i said: Подскажите где скачать HLS compiler? … У меня пока макетка с altera MAX2. Забудьте пока про HLS, экстрасенсы промахнулись. Изучайте синтезируемый Верилог. И принципы синхронного дизайна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 26 февраля, 2021 Опубликовано 26 февраля, 2021 · Жалоба В долгосрочной перспективе, если вы собираетесь оставаться в мире программируемой логики, лучше изучать HLS. HLS compliler? Тут во многом зависит от того на какой платформе вы работаете, если Xilinx, то добро пожаловать в дивный мир Vitis HLS У Intel свой тулчейн, так же есть вендер независимые инструменты, такие как MG, ах да siemens, Catapult HLS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 26 февраля, 2021 Опубликовано 26 февраля, 2021 · Жалоба 20 часов назад, RIMUS1989i сказал: Добрый день. Прошу помощи в написание модуля Verilog. ... code.v tb_1.sv Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RIMUS1989i 0 26 февраля, 2021 Опубликовано 26 февраля, 2021 · Жалоба 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" мне не очень нравится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 26 февраля, 2021 Опубликовано 26 февраля, 2021 · Жалоба Блокирующие присваивания в синхронном блоке не принято применять (если хотят это потом синтезировать) . з.ы. мой код выполняет ваши требования из первого сообщения - разве нет? 10 минут назад, RIMUS1989i сказал: Lmx2315, Спасибо добрый человек. Но пока я не понимаю как Ваш код переделать для меня... Набросал свой код вроде бы делает что надо. Вот структура "case" мне не очень нравится. Кстати , обратите внимание на неполноту вашего задания - то что в мк можно заниматься "ногодрыганьем" в ПЛИС выродится в "ничего" . В плис надо обязательно указывать сколько нужно находиться в каком состоянии или сигнал не будет меняться вовсе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 26 февраля, 2021 Опубликовано 26 февраля, 2021 · Жалоба 31 minutes ago, Lmx2315 said: Блокирующие присваивания в синхронном блоке не принято применять (если хотят это потом синтезировать) . Как раз если синтезатор не совсем тупой (а у Xilinx и Altera они достаточно умные), то блокирующее и неблокирующее присваивание на результат синтеза не влияет. Эти штуки были придуманы, чтобы правильно делать моделирование в симуляторах. Синтез же просто выплюнет варнинги на неподобающий синтаксис и пойдёт дальше Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RIMUS1989i 0 26 февраля, 2021 Опубликовано 26 февраля, 2021 (изменено) · Жалоба Про переделать, я подразумевал, что не могу его преобразовать в графику, т.к. нет входов и выходов. Сейчас на данном этапе я пишу модуль, преобразую его в графический вид и рисую схему в Quartus. подключаю пины I/O и т.д. А вообще нужен модуль со следующей логикой работы: при восходящем фронте на enable, должен появиться сигнал на lat через такт clk появится четыре такта на dck и через такт clk на lat должен пропасть сигнал. И это должно происходить один раз при восходящем фронте на enable, пока это не произойдет еще раз. но не должно срабатывать если в процессе выполнения манипуляций с lat и dck произошло событие на enable. Это в лучшем варианте. Прикрепил тестовый проект. test.rar Изменено 26 февраля, 2021 пользователем RIMUS1989i Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 26 февраля, 2021 Опубликовано 26 февраля, 2021 · Жалоба 25 минут назад, Nick_K сказал: Как раз если синтезатор не совсем тупой (а у Xilinx и Altera они достаточно умные), то блокирующее и неблокирующее присваивание на результат синтеза не влияет. Эти штуки были придуманы, чтобы правильно делать моделирование в симуляторах. Синтез же просто выплюнет варнинги на неподобающий синтаксис и пойдёт дальше т.е. если написать: always @(posedge clk) begin A1=A0; A2=A1; A3=A2; end То синтезатор поймёт, что я хотел задержку на регистрах сделать, а не приравняет мне вот так A3=A0 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 26 февраля, 2021 Опубликовано 26 февраля, 2021 · Жалоба 4 минуты назад, Lmx2315 сказал: т.е. если написать: always @(posedge clk) begin A1=A0; A2=A1; A3=A2; end То синтезатор поймёт, что я хотел задержку на регистрах сделать, а не приравняет мне вот так A3=A0 ? Именно так. Вы описали обычный сдвиговый регистр. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 26 февраля, 2021 Опубликовано 26 февраля, 2021 · Жалоба Just now, Lmx2315 said: т.е. если написать: always @(posedge clk) begin A1=A0; A2=A1; A3=A2; end То синтезатор поймёт, что я хотел задержку на регистрах сделать, а не приравняет мне вот так A3=A0 ? Я же говорю - не совсем бездарный синтезатор поймёт. Поймёт, что конструкция под клоком и что есть пересохранение. Да это синтаксически неправильно. Да на это будет куча ворнингов. Но это будут обчные флопы. И да, так лучше не писать. Единственная оговорка, это тип объявленных переменных A0-A3, если reg - тогда регистры, если wire - тогда у вас ошибка в 2х местах Вся магия блок и неблок присвоения - это позволить более точно ферифицировать код. А также анализировать возможные схемные проблемы. Например приведённый вами код в симуляторе будет отражать неправильно работающие флопы, что позволяет смоделировать различные не совсем легальные состояния силикона. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 26 февраля, 2021 Опубликовано 26 февраля, 2021 · Жалоба 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 . Что я сделал не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться