Перейти к содержанию
    

Попытался состряпать такую конструкцию.

 

Суть в том, что в цикле из входного сигнала вычитается 21, пока результат не будет меньше 20.

 

module TRX_TestTU12NumDecoder 
               (
                 in,
                 out
               );

input       [5:0] in;
output  reg [5:0] out;

       reg [5:0] temp;

always @(*)
begin

 temp = in;
 out = 0;

 while(temp > 20)
   begin
     temp = temp - 21;
     out = out + 1;
   end

 out = out + temp;

end

endmodule

 

Компиляторы (Quartus 8.0, ISE 9.2) на такой текст ругаются неприличными словами:

loop with non-constant loop condition must terminate within 250 iterations

 

Очевидно, что при 6тиразрядных переменных должно быть максимум 3 итерации.

Господа знатоки, направьте на путь правильный, стандарт читал - не помогает...

 

P.S. Поиск тоже пробовал юзать, но чего-то он тоже отказался мне помогать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так понял вам нужно найти остаток веления на 21 , так для этого полно готовых решений , а это просто какая-то " ассинхронщина".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попытался состряпать такую конструкцию.

 

Суть в том, что в цикле из входного сигнала вычитается 21, пока результат не будет меньше 20.

 

module TRX_TestTU12NumDecoder 
               (
                 in,
                 out
               );

input       [5:0] in;
output  reg [5:0] out;

       reg [5:0] temp;

always @(*)
begin

 temp = in;
 out = 0;

 while(temp > 20)
   begin
     temp = temp - 21;
     out = out + 1;
   end

 out = out + temp;

end

endmodule

 

Компиляторы (Quartus 8.0, ISE 9.2) на такой текст ругаются неприличными словами:

 

 

Очевидно, что при 6тиразрядных переменных должно быть максимум 3 итерации.

Господа знатоки, направьте на путь правильный, стандарт читал - не помогает...

 

P.S. Поиск тоже пробовал юзать, но чего-то он тоже отказался мне помогать...

попробуйте описать в виде FSM - должно помочь

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это просто абстрактный кусок кода, который нужен только для разбирательства с while'ом.

 

Это не асинхронщина, а комбинационщина :).

 

попробуйте описать в виде FSM - должно помочь

 

Мне нужно, чтобы требуемая операция выполнялась за один такт (вместе с еще некоторыми операциями).

Как тут применить FSM?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попытался состряпать такую конструкцию.

правильно квартус пишет, вы пытаетесь синтезировать конструкцию с переменным количеством итераций. Кол-во итераций зависит от значения входа in, потому что писали вы в стиле функционального программирования. А вам нужно описать синтезируемую схему, выполняющую определенную функцию.

 

Поэтому

Это просто абстрактный кусок кода, который нужен только для разбирательства с while'ом.
для синтеза не катит, но для понимая использования while для моделирования например, пойдет %)

 

Для синтеза можно было писать так

always @(*)
begin

temp = in;
out = 0;
for (int i = 0; i < 4; i++) begin 
  if (temp < 21) break;
  temp -= 21; 
  out++;
end 
out += temp;

end

 

попробуйте описать в виде FSM - должно помочь

всё бы вам FSM ы ставить, задача решается на 4 вычитателях + немного стыковой логики, итого на 36 плиток для третьего сыклона %)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

правильно квартус пишет, вы пытаетесь синтезировать конструкцию с переменным количеством итераций. Кол-во итераций зависит от значения входа in, потому что писали вы в стиле функционального программирования. А вам нужно описать синтезируемую схему, выполняющую определенную функцию.

 

По сути, то, что я описал, можно без проблем заменить таблицей-case'ом, т.к. каждому входному результату соответствует один выходной...

Можно даже в несколько if'ов написать.

Изменено пользователем Koluchiy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как описать такой же алгоритм расчета так, чтобы и коротко/ясно было, и компиляторы скушали?

смотри выше, только поддержку SV включите, потому как break в чистом V нет, там по другому надо делать %)

 

ЗЫ. правда я так и не понял зачем вы в результате складываете значение модуля и остаток от деления, но вам должно быть виднее %)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это не асинхронщина, а комбинационщина :).

Мне нужно, чтобы требуемая операция выполнялась за один такт (вместе с еще некоторыми операциями).

Давайте уточним. Вы ведь не из тех любителей "камасутры", которые заставляют компилятор встать в неприличную позу, а потом удивляются, что он 15 мин стоит в неестественной позе...

Ну так представьте, какую жизнь Вы хотите устроить кристаллу с Вашей "комбинационщиной"...

Вот пришли входные данные, заработал вычитатель... На его выходах начинается дрыгание сигналов... Под это дрыгание начинает дергаться мультиплексор... Он в свою очередь заставит дергаться сумматор и еще один сумматор. Все это вместе начинает потреблять ток и греть кристалл. Пульсации тока добегают до керамических конденсаторов... В эфир пошла наводка... Ну и так далее...

Это начало процесса. Потом идет долгая "мешанина" состояний, до тех пор, пока не отработает первый вычитатель, потом мультиплексор, потом сумматор, потом второй сумматор...

Ну да, за один такт... А что, этот такт является предельной частотой для кристалла? И что невозможно сделать конвейер, разнести процессы по разным тактам???

Число 20 - это 16 + 4, т.е это всего два бита. 10Н и 4Н... Берем два бита по "И" - получаем условие по которому надо или не надо делать суммирование... Так что вся конструкция упрощается и проблема вся снимается...

Так?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

смотри выше, только поддержку SV включите, потому как break в чистом V нет, там по другому надо делать %)

 

ЗЫ. правда я так и не понял зачем вы в результате складываете значение модуля и остаток от деления, но вам должно быть виднее %)

 

Посмотрел, SV юзать нельзя...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Давайте уточним.....

Ндя, человек просто спросил почему квартус код не понимает, а вы полезли в философские размышления %) Возьмите lpm_divide и разделите 32 бита 16ть, в итоге будет куча сумматоров + стыковая логика и бегать на маленькой частоте. Если это устраивает то почему бы нет. Конвейеризировать деление, когда в этом нет необходимости ни к чему, кроме роста ресурса (за счет триггеров) не приведет %)

 

Посмотрел, SV юзать нельзя...

тогда поройтесь в стандарте и найдите как такое (break) делается в чистом верилоге %)

 

ПС. Гусары молчать!!! пусть человек сам поработает %)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И что невозможно сделать конвейер, разнести процессы по разным тактам???

 

Я извиняюсь, но у меня только один такт на требуемую операцию, так что конвейеры низя...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я извиняюсь, но у меня только один такт на требуемую операцию, так что конвейеры низя...

Какая у вас FPGA и какой такт ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Давайте не будем углубляться в особенности моего проекта, тем более, что я уже давно придумал альтернативное решение проблемы.

 

Тем не менее, если кто-нибудь подскажет, как при помощи цикла (любого) описать искомую функцию так, чтобы это соответствовало Verilog-2001, буду очень благодарен :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Давайте не будем углубляться в особенности моего проекта, тем более, что я уже давно придумал альтернативное решение проблемы.

 

Тем не менее, если кто-нибудь подскажет, как при помощи цикла (любого) описать искомую функцию так, чтобы это соответствовало Verilog-2001, буду очень благодарен :).

Так дело не пойдет. У Вас пытаются узнать необходимую информацию, чтобы дать более содержательный ответ, а Вы что-то скрываете... :1111493779:

 

Зачем спрашивать, если Вы не прислушиваетесь к ответам?

 

ЗЫ Вы случайно не студент какого-то ВУЗА и это необходимо в рамках курсовой или диплома?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...