Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Синтезируемый цикл с досрочным выходом по условию
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Языки проектирования на ПЛИС (FPGA)
Eugene_eugene
Всем привет! Делаю один проект на Verilog и столкнулся с проблемой, связанной с необходимостью добавления цикла с выходом по условию. Но, как я понимаю, циклы while, repeat и forever несинтезируемы, а с конструкцией for-disable возникают какие-то проблемы.
Как правильно решить мою проблему? Можно ли использовать for-disable в данном случае?

Вот на всякий случай мой фрагмент кода, который не работает (крашится при моделировании). Мне, в общем, надо тут пускать через модуль A_neural входные числа до тех пор, пока они не останется только одно число > или пока они все не станут нулями. Короче говоря, нейронная сеть Хемминга

Очень прошу помощи с циклом с выходом по условию. С примером такого цикла. Заранее спасибо!

CODE
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
Приветсвую!

Цитата(Eugene_eugene @ May 19 2018, 00:42) *
...
Очень прошу помощи с циклом с выходом по условию. С примером такого цикла. Заранее спасибо!
CODE
genvar j;
for(j=0;j<100; j=j+1)
begin: break
...
disable break
end
Оххх smile3046.gif ... что за.... 0,1,2,3 ...10 ... вдох sm.gif

Для начала - можете посмотреть что значит в verilog ключевое слово break, и где оно обычно применяется laughing.gif
Да и неприлично как то использовать ключевые слова для имен блоков - может это и злит симулятор?
Ну и желательно уточнить - Вам это для синтеза нужно или для моделирования?

Удачи! Rob.
x736C
Цикл в программировании — это когда какие-то команды [процессора] повторяются одна за другой по кругу, т.е. в цикле.
В вашем случае, цикла не будет. Также не будет выхода по условию. Т.к. выходить некуда и не из чего. Имею в виду именно ваш контекст.
Необходимо поменять парадигму написания программы с Си на HDL.
Было бы неплохо представлять, как это можно сделать на элементарных цифровых блоках (триггерах, регистрах, компараторах и т.п.). Если можно это нарисовать на листке бумаги схематично, то дальше уже несложно переложить все на язык HDL.


Цитата(RobFPGA @ May 19 2018, 01:23) *
Ну и желательно уточнить - Вам это для синтеза нужно или для моделирования?

Так в названии же темыsm.gif
Eugene_eugene
Цитата(RobFPGA @ May 18 2018, 23:23) *
Оххх smile3046.gif ... что за.... 0,1,2,3 ...10 ... вдох sm.gif


Да, прощу прощения за такую сборную солянку. Я изучаю Verilog довольно короткое время, и на нем мне тянет писать так, как на плюсах.

Цитата(RobFPGA @ May 18 2018, 23:23) *
Для начала - можете посмотреть что значит в verilog ключевое слово break, и где оно обычно применяется laughing.gif
Да и неприлично как то использовать ключевые слова для имен блоков - может это и злит симулятор?
Ну и желательно уточнить - Вам это для синтеза нужно или для моделирования?

Для синтеза.
Я только сейчас увидел, что прикрепил немного не тот код. Согласен, что там много чуши. Хотя наверняка еще больше чуши в коде ниже, хм
CODE
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



Цитата(x736C @ May 18 2018, 23:28) *
В вашем случае, цикла не будет. Также не будет выхода по условию. Т.к. выходить некуда и не из чего. Имею в виду именно ваш контекст.


Почему цикла не будет? Я же вызываю циклично экземпляры модуля нейрона А. Или Вы про внешний цикл? Да, я не понимаю, как его организовать


Цитата(x736C @ May 18 2018, 23:28) *
Необходимо поменять парадигму написания программы с Си на HDL.
Было бы неплохо представлять, как это можно сделать на элементарных цифровых блоках (триггерах, регистрах, компараторах и т.п.). Если можно это нарисовать на листке бумаги схематично, то дальше уже несложно переложить все на язык HDL.


Да, наверное, это самая большая проблема. Попробую исправиться в этом, хм. Спасибо за совет!
RobFPGA
Приветствую!
Цитата(Eugene_eugene @ May 19 2018, 01:53) *
Да, прощу прощения за такую сборную солянку. Я изучаю Verilog довольно короткое время, и на нем мне тянет писать так, как на плюсах.
Да без проблем так сказать застали врасплох sm.gif

Цитата(Eugene_eugene @ May 19 2018, 01:53) *
Для синтеза.
Я только сейчас увидел, что прикрепил немного не тот код. Согласен, что там много чуши. Хотя наверняка еще больше чуши в коде ниже, хм
CODE
genvar j;
begin : genrar;
for(j=0;j<100; j=j+1)
initial count = 0;
...

Если для синтеза то что тут делает initial ? это не синтезируемая кострукция.

Цитата(Eugene_eugene @ May 19 2018, 01:53) *
Почему цикла не будет? Я же вызываю циклично экземпляры модуля нейрона А. Или Вы про внешний цикл? Да, я не понимаю, как его организовать

В приведенном коде Вы НЕ вызываете в цикле 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
Цитата(Eugene_eugene @ May 19 2018, 00:42) *
Как правильно решить мою проблему?

Хотите расскажу как надо это делать?
По скайпу голосом...
Dantist2k17
Цитата(Eugene_eugene @ May 18 2018, 21:42) *
Всем привет! Делаю один проект на Verilog и столкнулся с проблемой, связанной с необходимостью добавления цикла с выходом по условию. Но, как я понимаю, циклы while, repeat и forever несинтезируемы, а с конструкцией for-disable возникают какие-то проблемы.
Как правильно решить мою проблему? Можно ли использовать for-disable в данном случае?

Вот на всякий случай мой фрагмент кода, который не работает (крашится при моделировании). Мне, в общем, надо тут пускать через модуль A_neural входные числа до тех пор, пока они не останется только одно число > или пока они все не станут нулями. Короче говоря, нейронная сеть Хемминга

Очень прошу помощи с циклом с выходом по условию. С примером такого цикла. Заранее спасибо!

CODE
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) и решайте как быть дальше, выходить из так называемого цикла или же нет.


Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.