Koluchiy 0 30 июля, 2010 Опубликовано 30 июля, 2010 · Жалоба Попытался состряпать такую конструкцию. Суть в том, что в цикле из входного сигнала вычитается 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. Поиск тоже пробовал юзать, но чего-то он тоже отказался мне помогать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadon 0 30 июля, 2010 Опубликовано 30 июля, 2010 · Жалоба Я так понял вам нужно найти остаток веления на 21 , так для этого полно готовых решений , а это просто какая-то " ассинхронщина". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 30 июля, 2010 Опубликовано 30 июля, 2010 · Жалоба Попытался состряпать такую конструкцию. Суть в том, что в цикле из входного сигнала вычитается 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 - должно помочь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Koluchiy 0 30 июля, 2010 Опубликовано 30 июля, 2010 · Жалоба Это просто абстрактный кусок кода, который нужен только для разбирательства с while'ом. Это не асинхронщина, а комбинационщина :). попробуйте описать в виде FSM - должно помочь Мне нужно, чтобы требуемая операция выполнялась за один такт (вместе с еще некоторыми операциями). Как тут применить FSM? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 30 июля, 2010 Опубликовано 30 июля, 2010 · Жалоба Попытался состряпать такую конструкцию. правильно квартус пишет, вы пытаетесь синтезировать конструкцию с переменным количеством итераций. Кол-во итераций зависит от значения входа 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 плиток для третьего сыклона %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Koluchiy 0 30 июля, 2010 Опубликовано 30 июля, 2010 (изменено) · Жалоба правильно квартус пишет, вы пытаетесь синтезировать конструкцию с переменным количеством итераций. Кол-во итераций зависит от значения входа in, потому что писали вы в стиле функционального программирования. А вам нужно описать синтезируемую схему, выполняющую определенную функцию. По сути, то, что я описал, можно без проблем заменить таблицей-case'ом, т.к. каждому входному результату соответствует один выходной... Можно даже в несколько if'ов написать. Изменено 30 июля, 2010 пользователем Koluchiy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 30 июля, 2010 Опубликовано 30 июля, 2010 · Жалоба Как описать такой же алгоритм расчета так, чтобы и коротко/ясно было, и компиляторы скушали? смотри выше, только поддержку SV включите, потому как break в чистом V нет, там по другому надо делать %) ЗЫ. правда я так и не понял зачем вы в результате складываете значение модуля и остаток от деления, но вам должно быть виднее %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 30 июля, 2010 Опубликовано 30 июля, 2010 · Жалоба Это не асинхронщина, а комбинационщина :). Мне нужно, чтобы требуемая операция выполнялась за один такт (вместе с еще некоторыми операциями). Давайте уточним. Вы ведь не из тех любителей "камасутры", которые заставляют компилятор встать в неприличную позу, а потом удивляются, что он 15 мин стоит в неестественной позе... Ну так представьте, какую жизнь Вы хотите устроить кристаллу с Вашей "комбинационщиной"... Вот пришли входные данные, заработал вычитатель... На его выходах начинается дрыгание сигналов... Под это дрыгание начинает дергаться мультиплексор... Он в свою очередь заставит дергаться сумматор и еще один сумматор. Все это вместе начинает потреблять ток и греть кристалл. Пульсации тока добегают до керамических конденсаторов... В эфир пошла наводка... Ну и так далее... Это начало процесса. Потом идет долгая "мешанина" состояний, до тех пор, пока не отработает первый вычитатель, потом мультиплексор, потом сумматор, потом второй сумматор... Ну да, за один такт... А что, этот такт является предельной частотой для кристалла? И что невозможно сделать конвейер, разнести процессы по разным тактам??? Число 20 - это 16 + 4, т.е это всего два бита. 10Н и 4Н... Берем два бита по "И" - получаем условие по которому надо или не надо делать суммирование... Так что вся конструкция упрощается и проблема вся снимается... Так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Koluchiy 0 30 июля, 2010 Опубликовано 30 июля, 2010 · Жалоба смотри выше, только поддержку SV включите, потому как break в чистом V нет, там по другому надо делать %) ЗЫ. правда я так и не понял зачем вы в результате складываете значение модуля и остаток от деления, но вам должно быть виднее %) Посмотрел, SV юзать нельзя... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 30 июля, 2010 Опубликовано 30 июля, 2010 · Жалоба Давайте уточним..... Ндя, человек просто спросил почему квартус код не понимает, а вы полезли в философские размышления %) Возьмите lpm_divide и разделите 32 бита 16ть, в итоге будет куча сумматоров + стыковая логика и бегать на маленькой частоте. Если это устраивает то почему бы нет. Конвейеризировать деление, когда в этом нет необходимости ни к чему, кроме роста ресурса (за счет триггеров) не приведет %) Посмотрел, SV юзать нельзя... тогда поройтесь в стандарте и найдите как такое (break) делается в чистом верилоге %) ПС. Гусары молчать!!! пусть человек сам поработает %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Koluchiy 0 30 июля, 2010 Опубликовано 30 июля, 2010 · Жалоба И что невозможно сделать конвейер, разнести процессы по разным тактам??? Я извиняюсь, но у меня только один такт на требуемую операцию, так что конвейеры низя... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadon 0 30 июля, 2010 Опубликовано 30 июля, 2010 · Жалоба Я извиняюсь, но у меня только один такт на требуемую операцию, так что конвейеры низя... Какая у вас FPGA и какой такт ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Koluchiy 0 30 июля, 2010 Опубликовано 30 июля, 2010 · Жалоба Давайте не будем углубляться в особенности моего проекта, тем более, что я уже давно придумал альтернативное решение проблемы. Тем не менее, если кто-нибудь подскажет, как при помощи цикла (любого) описать искомую функцию так, чтобы это соответствовало Verilog-2001, буду очень благодарен :). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 30 июля, 2010 Опубликовано 30 июля, 2010 · Жалоба Давайте не будем углубляться в особенности моего проекта, тем более, что я уже давно придумал альтернативное решение проблемы. Тем не менее, если кто-нибудь подскажет, как при помощи цикла (любого) описать искомую функцию так, чтобы это соответствовало Verilog-2001, буду очень благодарен :). Так дело не пойдет. У Вас пытаются узнать необходимую информацию, чтобы дать более содержательный ответ, а Вы что-то скрываете... :1111493779: Зачем спрашивать, если Вы не прислушиваетесь к ответам? ЗЫ Вы случайно не студент какого-то ВУЗА и это необходимо в рамках курсовой или диплома? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadon 0 30 июля, 2010 Опубликовано 30 июля, 2010 · Жалоба Вы иожете понять , что любой цикл должен тактироватья , иначе получится абра-кадабра Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться