Jump to content

    
Sign in to follow this  
Koluchiy

While, однако...

Recommended Posts

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

 

Суть в том, что в цикле из входного сигнала вычитается 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. Поиск тоже пробовал юзать, но чего-то он тоже отказался мне помогать...

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Попытался состряпать такую конструкцию.

 

Суть в том, что в цикле из входного сигнала вычитается 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 - должно помочь

 

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

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

Share this post


Link to post
Share on other sites
Попытался состряпать такую конструкцию.

правильно квартус пишет, вы пытаетесь синтезировать конструкцию с переменным количеством итераций. Кол-во итераций зависит от значения входа 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 плиток для третьего сыклона %)

Share this post


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

 

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

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

Edited by Koluchiy

Share this post


Link to post
Share on other sites
Как описать такой же алгоритм расчета так, чтобы и коротко/ясно было, и компиляторы скушали?

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

 

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

Share this post


Link to post
Share on other sites
Это не асинхронщина, а комбинационщина :).

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

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

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

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

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

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

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

Так?

 

 

Share this post


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

 

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

 

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

Share this post


Link to post
Share on other sites
Давайте уточним.....

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

 

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

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

 

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

Share this post


Link to post
Share on other sites
И что невозможно сделать конвейер, разнести процессы по разным тактам???

 

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites
Давайте не будем углубляться в особенности моего проекта, тем более, что я уже давно придумал альтернативное решение проблемы.

 

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

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

 

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

 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this