реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Синтезируемый цикл с досрочным выходом по условию, Verilog
Eugene_eugene
сообщение May 18 2018, 21:42
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 18-05-18
Пользователь №: 104 378



Всем привет! Делаю один проект на 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
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение May 18 2018, 22:23
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 182
Регистрация: 23-12-04
Пользователь №: 1 643



Приветсвую!

Цитата(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.
Go to the top of the page
 
+Quote Post
x736C
сообщение May 18 2018, 22:28
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 268
Регистрация: 3-03-06
Пользователь №: 14 942



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


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

Так в названии же темыsm.gif
Go to the top of the page
 
+Quote Post
Eugene_eugene
сообщение May 18 2018, 22:53
Сообщение #4





Группа: Новичок
Сообщений: 4
Регистрация: 18-05-18
Пользователь №: 104 378



Цитата(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.


Да, наверное, это самая большая проблема. Попробую исправиться в этом, хм. Спасибо за совет!
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение May 18 2018, 23:36
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 182
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!
Цитата(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.
Go to the top of the page
 
+Quote Post
iosifk
сообщение May 19 2018, 07:22
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 3 982
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Eugene_eugene @ May 19 2018, 00:42) *
Как правильно решить мою проблему?

Хотите расскажу как надо это делать?
По скайпу голосом...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Dantist2k17
сообщение May 19 2018, 09:51
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 30-11-17
Пользователь №: 100 439



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


Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th August 2018 - 12:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01026 секунд с 7
ELECTRONIX ©2004-2016