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

if/elsif или case ?

Пишу дизайн где есть более чем 2х ступеньчатые условия как фунция от отсчетов счетчиков.

Можно реализовать с помощью, скажем 4 if/elsif либо с помошью case. Кроме того есть другой кусок дизайна где условия реализуються с помощью 8 if/elsif либо опять-же через case.

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

4х ступенчатая часть реализуется с помощью первого ifа и затем 3 eslifов (каждый проверяет счетчик на условия count < X, где Х - потолок отсчета заданного окна, ессно Х меняется как функция от нужного окна).

У 8-ступенчатого куска - тоже самое только там первый if и далее 7 elsifов.

 

С другой стороны можно написать более эстетично с помощью caseов, но тогда в каждом условии caseа нужно определять взаимо-исключающее состояние счетчиков (т.е. Х1 < count < Х2) что не требовалось в eslifах (ибо они сами взаимо-исключающие).

 

Я так понимаю в случае if/elsif синтезатор строит компараторы на счетчик с заданными значениями границ "окон", затем делает взаимо-исключающую логику.

А в случае с case, наверно синтезатор не будет наверно строить взаимо-исключающую логику после компараторов, но сами компараторы будут строиться многоступеньчато...

 

Так что-же будет более оптимально в плане ресурсов/скорости ? (хотя в конкретном случае нет надобности в крайних скоростях...)

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


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

Не пытаясь угадывать заранее, предлагаю собрать простенький проект из счетчика и if-elsif, а потом из счетчика и case. И сравнить их по результатам разводки, а так же посмотреть, что там в RTL создалось. Времени займет немного, а полезно. Сам бы сейчас сделал, но на той машине, за которой сижу, квартуса нет. :)

 

Вообще, это еще и от кристалла зависит, скольки входовые там LUT и прочее.

 

Например, на сколько помню, альтера рекомендует делать примерно так:

x1=0<=Counter<Up1;

x2=Up1<=Counter<Up2;

x3=Up2<=Counter<Up3;

x4=Up3<=Counter;

 

Далее x1x2x3x4 сводится к {a1,a2}, давая все варианты от 00 до 11.

 

a1=!(x1||x2);

a2=(x2||x4);

 

а потом делается full case для {a1,a2}.

Но воспоминания эти смутны, могу что-то напутать.

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


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

case более компактный и быстрый, т.к. у него нет приоритетов

межде условиями

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


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

У 8-ступенчатого куска - тоже самое только там первый if и далее 7 elsifов.

 

Так что-же будет более оптимально в плане ресурсов/скорости ? (хотя в конкретном случае нет надобности в крайних скоростях...)

 

То, что Вы описываете - это решение "в лоб", а оно никогда не будет эффективным.

Ведь счетчик не может одновременно иметь несколько значений. Следовательно на самом деле всего-то и нужно иметь вычитатель нижнего значения и только два уровня для сравнений.

В начале заносим в уровни данные для первого окна - низ и верх.

Добежал счетчик до нижнего уровня - производим вычитание этого значения из уровней и из счетчика и запоминает, что находимся в первом окне. Переросли за первое окно - назначаем уровни для второго окна.

Ну и так далее. Что-то типа нониуса на штанген-циркуле... Вместо 7 схем сравнения - имеем только две, но загружаемые и один вычитатель. Константы можно хранить в маленьком блоке памяти...

Ну и простейший автомат, который будет загружать уровни и заносить в регистр номер ступени. По номеру ступени нужно выбирать уставки.

А если в проекте есть контроллер, то такие дела можно ему дать как команду и он легко справится с такой работой. Даже без наращивания схем сравнения.

Удачи!

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


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

Ну и так далее. Что-то типа нониуса на штанген-циркуле... Вместо 7 схем сравнения - имеем только две, но загружаемые и один вычитатель. Константы можно хранить в маленьком блоке памяти...

 

Ну если рассмотреть эту схему с загружаемым сравнением и конвеерное сравнение то надо обезательно смотреть на кристал и на разрядность данных. Потому как иногда загрузка и сравнение могут выполняться дольше ...

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


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

Ну если рассмотреть эту схему с загружаемым сравнением и конвеерное сравнение то надо обезательно смотреть на кристал и на разрядность данных. Потому как иногда загрузка и сравнение могут выполняться дольше ...

 

А на самом деле можно иметь только одну уставку... Только трактовать ее по-разному: "Нижняя" - "Верхняя" ...

Действительно, для сравнения с загружаемой уставкой требуется больше ресурсов, чем для сравнения с константой. Но ведь "сравнивалка" нужна только одна, а не 7 ! Да и при разбивке на зоны общая разрядность уменьшится... Пусть хоть и на 2 разряда, но все же..

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


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

А на самом деле можно иметь только одну уставку... Только трактовать ее по-разному: "Нижняя" - "Верхняя" ...

Действительно, для сравнения с загружаемой уставкой требуется больше ресурсов, чем для сравнения с константой. Но ведь "сравнивалка" нужна только одна, а не 7 ! Да и при разбивке на зоны общая разрядность уменьшится... Пусть хоть и на 2 разряда, но все же..

 

Я об этом не подумал :) Но для трактовки нижней/верзней тоже нужно что-то сделать....

Но в итоге тогда этот алгоритм будет здорого выигравать! Круто - возьму на вооружение!

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


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

Я об этом не подумал :) Но для трактовки нижней/верзней тоже нужно что-то сделать....

Но в итоге тогда этот алгоритм будет здорого выигравать! Круто - возьму на вооружение!

на предыдущей работе я такую штуку проходил. Там надо было параллелить два DC-DC замыкая полевики, причем параллелить можно было только если они имели одинаковое выходное напряжение. Напряжение измерялось АЦП и эти цифры обрабатывались в ПЛИСЕ.

Но и кроме этого еще до черта алгоритмов...

У меня там были сделаны два софт-микропроцессора, схема сравнения входила в состав микропроцессора и сравнивала состояние двух регистров процессора, а программно анализировались флаги "больше или равно" и "меньше"... Так что такая функция при наличии микропроцессора реализуется "попутно" со всем остальным...

и уже заодно, один микроконтроллер 17-бит, он гонял данные, а другой - 1бит, вот он разбирал все логическое управление на примерно 50 шт. реле и обрабатывал все алгоритмы для 17-ти битного, т.е он ему сплавлял состояние автомата...

Удачи!

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


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

То, что Вы описываете - это решение "в лоб", а оно никогда не будет эффективным.

Ведь счетчик не может одновременно иметь несколько значений. Следовательно на самом деле всего-то и нужно иметь вычитатель нижнего значения и только два уровня для сравнений.

В начале заносим в уровни данные для первого окна - низ и верх.

Добежал счетчик до нижнего уровня - производим вычитание этого значения из уровней и из счетчика и запоминает, что находимся в первом окне. Переросли за первое окно - назначаем уровни для второго окна.

Ну и так далее. Что-то типа нониуса на штанген-циркуле... Вместо 7 схем сравнения - имеем только две, но загружаемые и один вычитатель. Константы можно хранить в маленьком блоке памяти...

Ну и простейший автомат, который будет загружать уровни и заносить в регистр номер ступени. По номеру ступени нужно выбирать уставки.

А если в проекте есть контроллер, то такие дела можно ему дать как команду и он легко справится с такой работой. Даже без наращивания схем сравнения.

Удачи!

 

Да, спасибо, интересный вариант. Пока сделал "в лоб", попробую по вашему рецепту, сравню после синтеза. А сколько ресурсов занимает вычитание ?

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

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


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

А сколько ресурсов занимает вычитание ?

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

Если 8 окон, то на 3 разрада меньше... Не так сильно много, но все же...

По поводу сумматора-вычитателя вариант суммирования константы имеет вдвое меньше ресурсов, по сравнению с суммированием данных от регистра...

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


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

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

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

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

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

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

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

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

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

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