User Tag List

Страница 159 из 191 ПерваяПервая ... 155156157158159160161162163 ... ПоследняяПоследняя
Показано с 1,581 по 1,590 из 1910

Тема: ПЛИС и всё что с ними связано

  1. #1581

    Регистрация
    31.03.2008
    Адрес
    Москва
    Сообщений
    735
    Спасибо Благодарностей отдано 
    10
    Спасибо Благодарностей получено 
    80
    Поблагодарили
    37 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я активно использую case, особенно, если много значений. Прочитал где-то, что длинные if then else хуже по быстродействию.
    Главное - описать все значения анализируемого в case сигнала, особенно в асинхронных блоках, чтобы не получилось защелки.
    Тут может помочь default.
    ZXM-Phoenix rev.01 2048K, VG93 hw emulator

    Этот пользователь поблагодарил IanPo за это полезное сообщение:

    dosikus(23.09.2019)

  2. #1582
    HardWareMan
    Гость

    По умолчанию

    IanPo, case удобен только программисту. В железе он преобразуется в дешифратор а потом опять в шифратор, это всё прекрасно видно в RTL. Это не особо важно для жирной FPGA, но критично для CPLD. Правильно сказали за варианты: если case не полный (например, для 5ти битного числа следует описать все 32 варианта, так или иначе), то синтезатор начинает сходить с ума и мешает кашу.

    А вот if это всего лишь атомарная логическая операция. При этом, даже сравнение вида Temp[4:0] == 5'h13 (которое в RTL показывается как сравнение) сворачивается в чипе в обычную AND функцию, которую, к слову, можно описать и самому (для вышеуказанного примера это будет Temp[4] & ~Temp[3] & ~Temp[2] & Temp[1] & Temp[0]). Если в кейсе всего 3 случая, то 3 таких if заметно выгодны, кроме организации варианта с default.

    В конечном итоге, тем кто собрался всерьёз писать на xHDL я настоятельно советую изучать и цифровую схематехнику. Это позволяет описать будущую схему гораздо эффективнее.

    Этот пользователь поблагодарил HardWareMan за это полезное сообщение:

    dosikus(23.09.2019)

  3. #1583

    Регистрация
    13.02.2016
    Адрес
    г. Королёв
    Сообщений
    493
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    12
    Поблагодарили
    11 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от dosikus Посмотреть сообщение
    Кстати , везде где не смотрю, на верилоге воротят нос от Case.
    Чем оно так чревато и чревато ли?

    По мне так вполне читаемый декодер получается,
    Очень удобный оператор, для твоего случая - самое оно.
    (в моём vgu можешь убедиться)

    Сам использую где не чревато,
    ибо чревато и ещё как...

    Цитата Сообщение от IanPo Посмотреть сообщение
    Я активно использую case, особенно, если много значений. Прочитал где-то, что длинные if then else хуже по быстродействию.
    Главное - описать все значения анализируемого в case сигнала, особенно в асинхронных блоках, чтобы не получилось защелки.
    Тут может помочь default.
    Цитата Сообщение от HardWareMan Посмотреть сообщение
    IanPo, case удобен только программисту. В железе он преобразуется в дешифратор а потом опять в шифратор, это всё прекрасно видно в RTL. Это не особо важно для жирной FPGA, но критично для CPLD.
    Во, видишь?
    Два диаметрально противоположных мнения
    и оба неправильные...
    Ща объясню...

    Цитата Сообщение от dosikus Посмотреть сообщение
    или у мну взгляд от С зашоренный?
    И это в том числе.

    Видишь ли, в ПЛИС нет последовательных операций, логика не ждёт, когда закончится одна операция и начнётся другая, весь код выполняется одновременно.
    То есть, условно говоря, основной цикл, все подпрограммы и прерывания работают одновременно, всем гуртом.

    Ща:

    В чём "цимус" оператора case?
    В том, что он отрабатывает все условия внутри себя одновременно, в отличие от, допустим, if-elseif-else - они отрабатывают условия последовательно - сначала первое, потом второе и так далее до конца. На каждую обработку тратится время (задержка внутри компаратора и ключей, соединяющих всю требуху внутри ПЛИС в общую схему), на каждый цикл сравнения, а ведь все они находятся внутри тактового блока, и в конечном итоге задержка накопится до такой степени, что часть условий просто перестанет обрабатываться - на них тупо не хватит времени за период тактового сигнала, и это при в общем-то корректной схеме (IanPo тут прав, а неправ HardWareMan). С другой стороны, у параллельного оператора case есть свои ограничения - он не может выделять приоритеты (покажу ниже) (HardWareMan тут прав, а неправ IanPo), зато он более "высокочастотный". И тут снова алаверды HardWareMan-у, ибо рабочими лошадками тут являются в основном CPLD.
    Либо жирные FPGA за несколько тыщ долларов штучка (снова HardWareMan прав)...

    Рассмотрим такой пример: есть, кроме всего прочего, 2 сигнала, один из которых должен быть обработан в текущем цикле, но только один из них, независимо, пришли они раздельно или одновременно. Пока неважно, который именно, сейчас пусть будет любой.
    назовём их wire in1 и wire in2
    Соберём их в общую шину для оператора case - wire [1:0] in = {in1, in2};
    Теперь обработаем несколькими вариантами:
    case (in)
    2'b10 : <operators>
    2'b01 : <operators>
    ....
    Эта конструкция отработает неправильно, точнее не всегда правильно. Правильно она отработает только когда сигналы будут приходить раздельно, а если вдруг вместе, то не сделает ничего...
    Чтобы сделало, надо, чтоб отрабатывался и второй сигнал, добавим его:
    case (in)
    2'b10, 2'b11 : <operators>
    2'b01, 2'b11 : <operators>
    ....
    Вообще на самом деле это, конечно, бред...
    (кто знает, по которой ветке здесь ломанётся case? )...
    Коллизия видна невооружённым взглядом.
    Зато if-elseif отработает правильно
    if(in1) <operators>
    elseif(in2) <operators>
    Он выполнит первое условие, если оно произошло, независимо от того, произошло ли событие само по себе, либо одновременно с in2.
    Условие задачи выполнено.
    Правда в случае одновременных in1 и in2 этот селектор проигнорирует in2.

    Есть ещё один селектор - casex, в котором x означает любое (1 или 0) значение, но, во-первых, с ним в нашей задаче получается та же каша, что и с простым case, а во-вторых, проверяет он условия так же, как и if-elseif-else последовательно, то есть имеет недостатки как одного, так и другого..., но бывает удобным при множественном выборе. Ну и бонусом выступает его приоритетность, будет выполнено условие, которое выше по тексту.

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

    P.S.
    Извини, что не сразу отвечаю, на работе, как ни странно, приходится работать...
    Последний раз редактировалось omercury; 23.09.2019 в 21:07.

  4. #1584
    HardWareMan
    Гость

    По умолчанию

    omercury, а вот если бы ты оформил 2 параллельных ifа то они бы работали одновременно (одинаковая задержка) и "весили" бы минимально:
    Код:
    // Общий блок внутри begin/end
    if (in1 & ~in2) begin ... end
    if (~in1 & in2) begin ... end
    // Конец общего блока
    Вот эти два условия внутри одной пары begin/end будут работать одновременно и займут каждый по одному элементу (инвертирование входа не является отдельным ресурсом) и будут управлять каждый своим begin/end. Вложенные if/else нужны именно там, где они нужны, например в генераторе синхросигналов развертки VGA: на строке Х мы активируем кадровый импульс присвоив триггеру 1, а на строке Y, соответственно, снимаем. Причем, если его вынести "за скобки" (т.е. за пределы работы самого счётчика строк) он продолжит работать правильно, но при этом управление счётчиком не будет влиять на этот кусок схемы, дополнительно тратя на это ресурсы. Именно так, длинные цепочки мультиплексоров (схема влияния ifоф) могут быть прилично сокращены и умение сформулировать логическую схему в этом как раз и помогает, о чём я уже говорил выше.

    - - - Добавлено - - -

    PS case в верилоге может объединять несколько значений под один begin/end блок, как и в С. Это бывает тоже необходимо.

    - - - Добавлено - - -

    PPS
    Цитата Сообщение от omercury Посмотреть сообщение
    if-elseif-else - они отрабатывают условия последовательно - сначала первое, потом второе и так далее до конца. На каждую обработку тратится время (задержка внутри компаратора и ключей, соединяющих всю требуху внутри ПЛИС в общую схему), на каждый цикл сравнения, а ведь все они находятся внутри тактового блока, и в конечном итоге задержка накопится до такой степени, что часть условий просто перестанет обрабатываться - на них тупо не хватит времени за период тактового сигнала, и это при в общем-то корректной схеме (IanPo тут прав, а неправ HardWareMan).
    Если источник всех операторов if в каскаде един и внешний (т.е. данные сравнения в ifах не зависят друг от друга, а такое в 99% написанного кода) то все компараторы отработают одновременно. А вот уже их результат будет подан на цепочку мультиплексоров, задержка который всяко меньше полноценного компаратора (который в большинстве случаев всё равно преобразуется во многовходовый И). Причем, синтезатор с некоторой версии умеет их сворачивать в сбалансированное дерево, если логика схемы это позволяет - это тоже уменьшает задержку.

    пример

    Это:

    Сворачивается в это:
    [свернуть]


    - - - Добавлено - - -

    PPPS Кстати, стэйт-машина, оформленная через case с некоторой версии синтезатора корректно распознаётся и сворачивается в компактную логику, причём RTL позволяет прям выделить этот блок. Я, правда, только один раз такое замутил, как-то не особо нужно было.

    Как я уже говорил: всегда заглядывайте в RTL, чтобы посмотреть как именно вас понял синтезатор.
    Последний раз редактировалось HardWareMan; 23.09.2019 в 21:55.

  5. #1585

    Регистрация
    13.02.2016
    Адрес
    г. Королёв
    Сообщений
    493
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    12
    Поблагодарили
    11 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    omercury, а вот если бы ты оформил 2 параллельных ifа то они бы работали одновременно (одинаковая задержка) и "весили" бы минимально:
    Код:
    // Общий блок внутри begin/end
    if (in1 & ~in2) begin ... end
    if (~in1 & in2) begin ... end
    // Конец общего блока
    Вот эти два условия внутри одной пары begin/end будут работать одновременно и займут каждый по одному элементу (инвертирование входа не является отдельным ресурсом) и будут управлять каждый своим begin/end.
    Да именно так.
    Но предыдущий if они таки подождут...

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    Вложенные if/else нужны именно там, где они нужны, например в генераторе синхросигналов развертки VGA: на строке Х мы активируем кадровый импульс присвоив триггеру 1, а на строке Y, соответственно, снимаем. Причем, если его вынести "за скобки" (т.е. за пределы работы самого счётчика строк) он продолжит работать правильно, но при этом управление счётчиком не будет влиять на этот кусок схемы, дополнительно тратя на это ресурсы. Именно так, длинные цепочки мультиплексоров (схема влияния ifоф) могут быть прилично сокращены и умение сформулировать логическую схему в этом как раз и помогает, о чём я уже говорил выше.
    case там тоже прекрасно отработает, ибо условий во-первых не так много, а, во-вторых, нет дублирующихся условий - все константы разные.

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    PPS

    Если источник всех операторов if в каскаде един и внешний (т.е. данные сравнения в ifах не зависят друг от друга, а такое в 99% написанного кода) то все компараторы отработают одновременно.
    Нет, они будут срабатывать последовательно потому, что каждый последующий if должен проверить - сработал ли предыдущий.

  6. #1586
    HardWareMan
    Гость

    По умолчанию

    Цитата Сообщение от omercury Посмотреть сообщение
    Нет, они будут срабатывать последовательно потому, что каждый последующий if должен проверить - сработал ли предыдущий.
    Ты пример в моём посте посмотри (я обновил, ты мог упустить), компараторы сработают одновременно. Результат будет отрабатываться согласно приоритета. А это несколько разные вещи (полноценный компаратор однозначно медленнее простого мультиплексора).

    - - - Добавлено - - -

    PS В примере, правда, все ifы равноправны, но даже если бы я их выстроил через else поменялся бы только порядок обработки результата на конкретно заданный мною, а не выбранный синтезатором. В примере приоритетно обрабатывается только 1 регистр, который общий для всех условий. Остальные события работают независимо друг от друга. Такой немного кривой пример, но суть и так понятна.

  7. #1587

    Регистрация
    13.02.2016
    Адрес
    г. Королёв
    Сообщений
    493
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    12
    Поблагодарили
    11 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    Ты пример в моём посте посмотри (я обновил, ты мог упустить), компараторы сработают одновременно.
    Он процитирован, и кажется идентичным отображённому в посте.
    Венрёмся к условию задачи:
    Цитата Сообщение от omercury Посмотреть сообщение
    2 сигнала, один из которых должен быть обработан в текущем цикле, но только один из них, независимо, пришли они раздельно или одновременно.
    Валидные значения: 'b01, 'b10 и 'b11
    Блок case, также, как и if/else, выполняет только одну ветку из всех условий, находящихся в блоке.
    Чтоб сделать наглядней абсурдность ситуации, заменим <operators> на установку и сброс триггера.
    блок
    Код:
    case (in)
    2'b10 : reg <= 1'b1;
    2'b01 : reg <= 1'b0;
    обработает одно из двух валидных состояний, пропущено значение 'b11

    блок
    Код:
    if(in1) reg <= 1'b1;
    elseif(in2) reg <= 1'b0;
    обработает один из 3х доступных вариантов
    а что сделает это?
    Цитата Сообщение от HardWareMan Посмотреть сообщение
    Код:
    // Общий блок внутри begin/end
    if (in1 & ~in2) begin ... end
    if (~in1 & in2) begin ... end
    // Конец общего блока
    - - - Добавлено - - -

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    Как я уже говорил: всегда заглядывайте в RTL, чтобы посмотреть как именно вас понял синтезатор.
    Тут собеседник-то не всегда понимает, а ты про синтезатор.

    - - - Добавлено - - -

    И вообще, о чём-то не о том мы...
    Речь шла о том, что для разных ситуаций бывают удобными разные решения, а не о том, как выкрутиться из всех случаев каким-то одним.
    Последний раз редактировалось omercury; 24.09.2019 в 00:26.

  8. #1588

    Регистрация
    14.04.2013
    Адрес
    г. Ростов-на-Дону
    Сообщений
    608
    Спасибо Благодарностей отдано 
    70
    Спасибо Благодарностей получено 
    54
    Поблагодарили
    48 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    В конечном итоге, тем кто собрался всерьёз писать на xHDL я настоятельно советую изучать и цифровую схематехнику. Это позволяет описать будущую схему гораздо эффективнее.
    Цитата Сообщение от HardWareMan Посмотреть сообщение
    всегда заглядывайте в RTL, чтобы посмотреть как именно вас понял синтезатор
    К этому добавлю ещё.

    Заглядывать надо не только в RTL, но и в fitter, там тоже бывают неожиданные решения, но уже от оптимизатора.

    Не надо пытаться на HDL писать программу, это часто приводит к несинтезируемым схемам и взаимонепониманию с синтезатором. На HDL надо описывать схему. И мы описываем не "что делать при...", а комбинационную схему из логических элементов и мультиплексоров, которая готовит сигналы, которые будут защёлкнуты в триггер по тактовому сигналу.

  9. #1589
    HardWareMan
    Гость

    По умолчанию

    Цитата Сообщение от omercury Посмотреть сообщение
    Он процитирован, и кажется идентичным отображённому в посте.
    Я там добавил спойлер с примером.
    Цитата Сообщение от omercury Посмотреть сообщение
    Вернёмся к условию задачи:

    Валидные значения: 'b01, 'b10 и 'b11
    Блок case, также, как и if/else, выполняет только одну ветку из всех условий, находящихся в блоке.
    Чтоб сделать наглядней абсурдность ситуации, заменим <operators> на установку и сброс триггера.
    блок
    Код:
    case (in)
    2'b10 : reg <= 1'b1;
    2'b01 : reg <= 1'b0;
    обработает одно из двух валидных состояний, пропущено значение 'b11

    блок
    Код:
    if(in1) reg <= 1'b1;
    elseif(in2) reg <= 1'b0;
    обработает один из 3х доступных вариантов
    а что сделает это?
    Цитата Сообщение от HardWareMan
    // Общий блок внутри begin/end
    if (in1 & ~in2) begin ... end
    if (~in1 & in2) begin ... end
    // Конец общего блока
    Ровно то же самое, что и в твоём примере с case. 1 условие из двух. Ведь мы же хорошие мальчики и переносим сигналы условия в свой тактовый домен, верно? И у case точно такие же требования. Ну а чтобы модифицировать мой пример под твой пример, то надо описать вот так:
    Код:
    // Общий блок внутри begin/end
    if (in1 & ~in2) begin ... end
    if (~in1 & in2) begin ... end
    if (in1 & in2) begin ... end
    // Конец общего блока
    Что касается твоего:
    Код:
    if(in1) reg <= 1'b1;
    elseif(in2) reg <= 1'b0;
    То он тоже обработает один из 2х доступных вариантов:
    1. in1=1, тогда он по приоритету сработает и значение in2 проигнорируется.
    2. in1=0, тогда проанализируется значение in2.
    И согласись, это совсем не то, что ты описал как {1,0}:{0,1}:{1:1}. Это будет соответствовать вот такой таблице:
    Код:
    in1 in2 res
     1   x   #1
     0   1   #2
     0   0   --
    Мой пример для этого будет выглядеть вот так:
    Код:
    // Общий блок внутри begin/end
    if (in1) begin ... end
    if (~in1 & in2) begin ... end
    // Конец общего блока
    В общем, следует понимать, что все условия на одном уровне в одном блоке обрабатываются одновременно. Но так как мы и так избавляемся от метастабильности (а кто не избавляется, то сам себе злобный буратино) то можно сказать, что case это лишь красивое описание группы таких условий. Причем даже твой случай в case можно описать как комбинация 2'b1x + 2'b01 и оно сработает. Т.е., в большинстве случаев case и группа if в одном блоке решение равноправное. А вот случаи, когда красивее то или иное решение есть. В случае с case это когда надо организовать условие с default. Надеюсь, не надо объяснять в чём сила этого самого default? А в случае с набором условий - да хоть мой пример выше. Или иногда надо организовать несколько значений, которые проще описать в виде логического уравнения, например (in1 | (in2 & ~in3)). Потому как это ведет к перечислению всех вариантов, которые попадают под эту формулу в одном условии case. А в случае данной формулы это будет целых 5 значений. Хотя, если константы именованы то case тупо нагляднее, о чём я и говорил: удобство для погромиста.
    Последний раз редактировалось HardWareMan; 24.09.2019 в 07:32.

  10. #1590

    Регистрация
    29.03.2005
    Адрес
    Ярославль
    Сообщений
    1,102
    Спасибо Благодарностей отдано 
    14
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну таки посмотрим в RTL , попробую оценить сам а вы ткните если вру.









    pix_count - cчетчик вверх с параллельной загрузкой, со сбросом при значении 1056-1 - длина всей строки с со всеми причиндалами.







    CASE(pix_count) - декодер hsync .
    Вот это и есть то что HardWareMan описал - дешифратор на Equal и затем шифратор на NOR и OR ?

    - - - Добавлено - - -

    Да и , пробую симулировать в Modelsim , естественно пока только один этот модуль ,без PLL и HDMI, да и тестбенчи пока не готов писать , гружу вручную добавляю тактовую и вручную делаю сброс.
    Все отображается и работает , почти все - кроме данных в vram. Как это исправить или Modelsim не грузит сторонние файлы?




    Последний раз редактировалось dosikus; 24.09.2019 в 09:57.
    ZXM-Phoenix 1024+PROF ROM+SMUC+VGA
    Profi 1024+CF+CPM+VGA
    ATARI 800XL+SIO2PC+SIO2SD
    RK86@Maximite

Страница 159 из 191 ПерваяПервая ... 155156157158159160161162163 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. ДВК (и всё, что с ними связано)
    от Grand в разделе ДВК, УКНЦ
    Ответов: 4575
    Последнее: 17.11.2025, 11:38
  2. PAL/GAL и все что с ними связано.
    от Mick в разделе Клоны на ПЛИС, МК и БМК
    Ответов: 489
    Последнее: 19.09.2025, 18:39
  3. SMUC на дискретах и ПЛИС
    от spensor в разделе Scorpion
    Ответов: 846
    Последнее: 02.05.2025, 08:36
  4. Ответов: 1215
    Последнее: 10.02.2025, 19:04
  5. Вопрос по ПЛИС
    от Zloy в разделе Несортированное железо
    Ответов: 23
    Последнее: 17.10.2015, 17:12

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •