Eugene_eugene 0 18 мая, 2018 Опубликовано 18 мая, 2018 · Жалоба Всем привет! Делаю один проект на Verilog и столкнулся с проблемой, связанной с необходимостью добавления цикла с выходом по условию. Но, как я понимаю, циклы while, repeat и forever несинтезируемы, а с конструкцией for-disable возникают какие-то проблемы. Как правильно решить мою проблему? Можно ли использовать for-disable в данном случае? Вот на всякий случай мой фрагмент кода, который не работает (крашится при моделировании). Мне, в общем, надо тут пускать через модуль A_neural входные числа до тех пор, пока они не останется только одно число > или пока они все не станут нулями. Короче говоря, нейронная сеть Хемминга Очень прошу помощи с циклом с выходом по условию. С примером такого цикла. Заранее спасибо! genvar j; for(j=0;j<100; j=j+1) begin: break initial count = 0; genvar k; for(k=0;k<100;k=k+1) begin A_neural a(zout[9*(k+1)-1:9*k], zout, uout[9*(k+1)-1:9*k]); always @* if(uout[9*k + : 9] == 0) count = count + 1; end always @* if(count >= 9) disable break; end Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 33 18 мая, 2018 Опубликовано 18 мая, 2018 · Жалоба Приветсвую! ... Очень прошу помощи с циклом с выходом по условию. С примером такого цикла. Заранее спасибо! genvar j; for(j=0;j<100; j=j+1) begin: break ... disable break end Оххх :smile3046: ... что за.... 0,1,2,3 ...10 ... вдох :) Для начала - можете посмотреть что значит в verilog ключевое слово break, и где оно обычно применяется :laughing: Да и неприлично как то использовать ключевые слова для имен блоков - может это и злит симулятор? Ну и желательно уточнить - Вам это для синтеза нужно или для моделирования? Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x736C 0 18 мая, 2018 Опубликовано 18 мая, 2018 · Жалоба Цикл в программировании — это когда какие-то команды [процессора] повторяются одна за другой по кругу, т.е. в цикле. В вашем случае, цикла не будет. Также не будет выхода по условию. Т.к. выходить некуда и не из чего. Имею в виду именно ваш контекст. Необходимо поменять парадигму написания программы с Си на HDL. Было бы неплохо представлять, как это можно сделать на элементарных цифровых блоках (триггерах, регистрах, компараторах и т.п.). Если можно это нарисовать на листке бумаги схематично, то дальше уже несложно переложить все на язык HDL. Ну и желательно уточнить - Вам это для синтеза нужно или для моделирования? Так в названии же темы:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eugene_eugene 0 18 мая, 2018 Опубликовано 18 мая, 2018 · Жалоба Оххх :smile3046: ... что за.... 0,1,2,3 ...10 ... вдох :) Да, прощу прощения за такую сборную солянку. Я изучаю Verilog довольно короткое время, и на нем мне тянет писать так, как на плюсах. Для начала - можете посмотреть что значит в verilog ключевое слово break, и где оно обычно применяется :laughing: Да и неприлично как то использовать ключевые слова для имен блоков - может это и злит симулятор? Ну и желательно уточнить - Вам это для синтеза нужно или для моделирования? Для синтеза. Я только сейчас увидел, что прикрепил немного не тот код. Согласен, что там много чуши. Хотя наверняка еще больше чуши в коде ниже, хм genvar j; begin : genrar; for(j=0;j<100; j=j+1) initial count = 0; genvar k; for(k=0;k<10;k=k+1) begin A_neural a(zout[9*k + : 9], zout, uout[9*k + : 9]); always @* if(uout[9*k + : 9] == 0) count = count + 1; end always @* if(count >= 9) disable genrar; assign zout = uout; end В вашем случае, цикла не будет. Также не будет выхода по условию. Т.к. выходить некуда и не из чего. Имею в виду именно ваш контекст. Почему цикла не будет? Я же вызываю циклично экземпляры модуля нейрона А. Или Вы про внешний цикл? Да, я не понимаю, как его организовать Необходимо поменять парадигму написания программы с Си на HDL. Было бы неплохо представлять, как это можно сделать на элементарных цифровых блоках (триггерах, регистрах, компараторах и т.п.). Если можно это нарисовать на листке бумаги схематично, то дальше уже несложно переложить все на язык HDL. Да, наверное, это самая большая проблема. Попробую исправиться в этом, хм. Спасибо за совет! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 33 18 мая, 2018 Опубликовано 18 мая, 2018 · Жалоба Приветствую! Да, прощу прощения за такую сборную солянку. Я изучаю Verilog довольно короткое время, и на нем мне тянет писать так, как на плюсах.Да без проблем так сказать застали врасплох :) Для синтеза. Я только сейчас увидел, что прикрепил немного не тот код. Согласен, что там много чуши. Хотя наверняка еще больше чуши в коде ниже, хм genvar j; begin : genrar; for(j=0;j<100; j=j+1) initial count = 0; ... Если для синтеза то что тут делает initial ? это не синтезируемая кострукция. Почему цикла не будет? Я же вызываю циклично экземпляры модуля нейрона А. Или Вы про внешний цикл? Да, я не понимаю, как его организовать В приведенном коде Вы НЕ вызываете в цикле 1000 раз функцию A_neural - Вы синтезируете 1000 отдельных блоков A_neural ! Это то что Вы хотели? При этом связи между этими блоками задаются жестко на этапе синтеза и в процесе работы не меняются. Break цикла при синтезе возможен но при определенных условиях. Но уж точно нельзя менять число синтезированных модулей в зависимости от значения данных которые эти модули обрабатывают. Аналогом вызова функции можно грубо представить один модуль на вход которого коммутируются данные по очереди. Для начала попробуйте синтезировать код попроще - типа счетчика или сумматоров. Так как в реальном железе обычно состояние системы меняется не мгновенно - а за конечное время, по тактам. Поэтому такой код always @* if(uout[9*k + : 9] == 0) count = count + 1; // с точки зрения синтеза невозможен. // надо бы хотябы так always @(posedge clk) begin if (uout[9*k + : 9] == 0) count <= count + 1; end Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 19 мая, 2018 Опубликовано 19 мая, 2018 · Жалоба Как правильно решить мою проблему? Хотите расскажу как надо это делать? По скайпу голосом... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dantist2k17 0 19 мая, 2018 Опубликовано 19 мая, 2018 · Жалоба Всем привет! Делаю один проект на Verilog и столкнулся с проблемой, связанной с необходимостью добавления цикла с выходом по условию. Но, как я понимаю, циклы while, repeat и forever несинтезируемы, а с конструкцией for-disable возникают какие-то проблемы. Как правильно решить мою проблему? Можно ли использовать for-disable в данном случае? Вот на всякий случай мой фрагмент кода, который не работает (крашится при моделировании). Мне, в общем, надо тут пускать через модуль A_neural входные числа до тех пор, пока они не останется только одно число > или пока они все не станут нулями. Короче говоря, нейронная сеть Хемминга Очень прошу помощи с циклом с выходом по условию. С примером такого цикла. Заранее спасибо! genvar j; for(j=0;j<100; j=j+1) begin: break initial count = 0; genvar k; for(k=0;k<100;k=k+1) begin A_neural a(zout[9*(k+1)-1:9*k], zout, uout[9*(k+1)-1:9*k]); always @* if(uout[9*k + : 9] == 0) count = count + 1; end always @* if(count >= 9) disable break; end Сделайте привязку к частоте clk, на каждом такте оценивайте текущее состояние "системы" (например с помощью if ... else) и решайте как быть дальше, выходить из так называемого цикла или же нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться