Dr.Alex 0 24 февраля, 2015 Опубликовано 24 февраля, 2015 · Жалоба case x mod 4 is when 0 => when 1 => when 2 => when 3 => end case; Вивадо даёт следующий отлуп:: [synth 8-426] missing choice(s) 4 to 15 in case statement Откуда там 4 по 15-то? Поставить when others и забить или разбираться дальше? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aat_81 0 24 февраля, 2015 Опубликовано 24 февраля, 2015 · Жалоба case x mod 4 is when 0 => when 1 => when 2 => when 3 => end case; Вивадо даёт следующий отлуп:: [synth 8-426] missing choice(s) 4 to 15 in case statement Откуда там 4 по 15-то? Поставить when others и забить или разбираться дальше? А что есть X? Если сигнал Х четырехбитный все вроде как логично Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 24 февраля, 2015 Опубликовано 24 февраля, 2015 · Жалоба Откуда там 4 по 15-то? Ну, видимо, "x" был у Вас 4-битный. Соответственно, результат тоже 4-битный. А что "mod 4" ограничивает свой выход числом 3, об этом синтезатор не догадывается. Он просто ставит блок делителя, и заводит выход остатка (который тоже 4-битный) на компараторы условий case. Поэтому, просто сделайте case по двум младшим битам "x" - этим и варнинг уберете, и громадный и монстроидальный комбинаторный делитель из схемы, и лишние два провода из логики case. То есть, Ваш вариант для моделирования годится, а вот для синтеза - просто мегамонстр. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 24 февраля, 2015 Опубликовано 24 февраля, 2015 · Жалоба А что есть X? Если сигнал Х четырехбитный все вроде как логично Ну, видимо, "x" был у Вас 4-битный. В том-то и дело, что разрядность его не 4, а очень велика. Поэтому и непонятно, откуда берётся 4. Ещё интересно, что если сделать (x mod 2), то требует уже 8-и кейсов, а (x mod 1) - четырёх :-))) Он просто ставит блок делителя, и заводит выход остатка (который тоже 4-битный) на компараторы условий case. Поэтому, просто сделайте case по двум младшим битам "x" - этим и варнинг уберете, и громадный и монстроидальный комбинаторный делитель из схемы, и лишние два провода из логики case. То есть, Ваш вариант для моделирования годится, а вот для синтеза - просто мегамонстр. В монстроидальный делитель я категорически не верю, а mod 4 это и есть указание оставить 2 бита, ведь сигнал-то объявлен как integer. Ну может быть правильнее (x rem 4) сделать. Кстати это даже не варнинг, а самый что ни на есть фатальный еррор. UPD: Ещё забавно:: если х двухбитный, то всё ок, 4-х кейсов достаточно. Если же написать (x mod 4), то требуется уже 16 кейсов :-)))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 24 февраля, 2015 Опубликовано 24 февраля, 2015 · Жалоба В монстроидальный делитель я категорически не верю, а mod 4 это и есть указание оставить 2 бита, ведь сигнал-то объявлен как integer. Я немного неправильно сказал... mod 4 - это указание оставить 3 бита, так как число 4 - трехбитное, а выход остатка по разрядности соответствует входу делителя, если он уже, чем делимое, + опциональный бит знака. В Вашем случае, три бита остатка + бит знака (integer-то вроде тип со знаком, да и число 4 по умолчанию, наверное, имеет signed тип). А вот почему это еррор - это непонятно. Обычно это варнинг, что латч получился из-за неполного case. PS А не верить в делители - Ваше право. Однако, Synopsys на каждый mod втыкает DW_div - а уже внутри мегафункции все оптимизации. Квартус примерно так же делает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 24 февраля, 2015 Опубликовано 24 февраля, 2015 · Жалоба Я немного неправильно сказал... mod 4 - это указание оставить 3 бита, так как число 4 - трехбитное, а выход остатка по разрядности соответствует входу делителя, если он уже, чем делимое, + опциональный бит знака. В Вашем случае, три бита остатка + бит знака (integer-то вроде тип со знаком, да и число 4 по умолчанию, наверное, имеет signed тип). А вот почему это еррор - это непонятно. Обычно это варнинг, что латч получился из-за неполного case. Ну что ж, возможно. Значит просто поставить when others => NULL и забить. Да и латча у меня не будет, поскоку кейс в синхронном процессе.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 24 февраля, 2015 Опубликовано 24 февраля, 2015 · Жалоба Ну что ж, возможно. Значит просто поставить when others => NULL и забить. И еще потом не удивляться, если вдруг в проекте тайминги не сойдутся, или сотня-другая лутов из ниоткуда возьмется.... А что это вообще за фигня, чтобы в синхронном процессе так настырно требовали описать полный case? PS напишите лучше x and 3, если извлекать младшие биты религия не позволяет, так и понятнее, и гарантировано без делителей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 24 февраля, 2015 Опубликовано 24 февраля, 2015 · Жалоба И еще потом не удивляться, если вдруг в проекте тайминги не сойдутся, или сотня-другая лутов из ниоткуда возьмется.... Ну это вряд ли.. А что это вообще за фигня, чтобы в синхронном процессе так настырно требовали описать полный case? В ISE не требовали. А в виваде где-то настраивается серьёзность для разных ошибок, возможно и для этой тоже. напишите лучше x and 3, если извлекать младшие биты религия не позволяет, так и понятнее, и гарантировано без делителей. Низзя так с интегером.. :-о Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 24 февраля, 2015 Опубликовано 24 февраля, 2015 · Жалоба а x mod 4 для x == -3 чем равен? Если со знаком то кейз реально не полный) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 24 февраля, 2015 Опубликовано 24 февраля, 2015 · Жалоба а x mod 4 для x == -3 чем равен? Если со знаком то кейз реально не полный) По идее, -3 (A mod B => A - int(A/B)*B => -3 - int(-3/4)*4 = -3 - 0 = -3). Но я точно не знаю, надо бы стандарт VHDL открыть. В этом и отличие между mod и rem - кто-то, вроде, ставит знак делимого, а кто-то - делителя. Низзя так с интегером.. :-о Так преобразовать в нормальный тип. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 24 февраля, 2015 Опубликовано 24 февраля, 2015 · Жалоба Так преобразовать в нормальный тип. "Нормальный тип" это битовый (std_logic_vector, signed или unsigned), но там и вопросов нет, а я вот сторонник того чтобы где только можно использовать "небитовые" типы, то есть integer. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 24 февраля, 2015 Опубликовано 24 февраля, 2015 · Жалоба "Нормальный тип" это битовый Так в этом и дело, что в данной ситуации, где по сути надо выделить два младших бита числа, именно использование битового типа оправдано по всем фронтам (и по читаемости, и по сути, и по оптимальности реализации в железе), чем замороченной математической операции, с которой без пол-литры не поймешь, что там со знаками будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 24 февраля, 2015 Опубликовано 24 февраля, 2015 · Жалоба Так в этом и дело, что в данной ситуации, где по сути надо выделить два младших бита числа, именно использование битового типа оправдано по всем фронтам (и по читаемости, и по сути, и по оптимальности реализации в железе), чем замороченной математической операции, с которой без пол-литры не поймешь, что там со знаками будет. Есесно, всегда есть достоинства и недостатки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 24 февраля, 2015 Опубликовано 24 февраля, 2015 · Жалоба а я вот сторонник того чтобы где только можно использовать "небитовые" типы, то есть integer. не подкола ради, а для познания, с чем связана такая сторона? Я думал как раз правильнее сваливаться в итоге к типам железа, нежели к каким-то их представлениям... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dr.Alex 0 24 февраля, 2015 Опубликовано 24 февраля, 2015 · Жалоба Да што ж за день-то сегодня такой.. :-о :-о Обнаружил, что в синплифай можно написать z <= (('0' & x) + ('0' & y))(8 downto 1); а в XST нет! :-о :-о :-о Ругается именно на укорочение результата.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться