Модели триггеров. Динамическое управление записью, страница 2

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

При разработке моделей триггеров следует решить для себя вопрос, насколько глубоко и точно надо отражать в модели описанные процессы. Надо ли моделировать случайное поведение объекта, обращаясь к датчикам псевдослучайных чисел или достаточно просто «отлавливать» запрещённые комбинации входных сигналов и сообщать пользователю, в какой момент времени и на каком триггере они обнаружены. Можно предусмотреть режим остановки моделятора при обнаружении такой ситуации.

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

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

Если в алфавите моделей цифровых сигналов имеются значения типа фронт (­, /, R) или спад (¯, \, F), то никаких дополнительных проблем не возникает. В противном случае придётся завести для сигнала синхронизации не одну, а две переменных и сравнивать текущее и старое состояние этого сигнала, чтобы не пропустить момент его переключения.

Булевские модели триггеров, не учитывающие в явном виде временные задержки, могут преподнести ещё один неприятный сюрприз. Предположим, нам надо смоделировать работу трёхразрядного регистра сдвига вправо (рис.2).

Если для выходных сигналов Q1, Q2 и Q3 в моделях триггеров определено только по одному контейнеру, то его содержимое будет обновляться сразу же, как только моделятор вычислит текущее значение переменной.

Допустим, что регистр сброшен в «0» сигналом RESET, а затем пришла команда сдвига SHIFT (а точнее, её задний фронт). Результат моделирования должен получиться таким: Q1=1, Q2=0, Q3=0. Однако это произойдёт только в том случае, если моделятор будет вызывать модели триггеров в порядке справа налево, то есть сначала обработает триггер DD3, потом DD2, и, наконец, DD1. Если вызовы моделей будут происходить в обратном порядке, то результат окажется неверным: Q1=Q2=Q3=1. Это произошло потому, что, моделируя триггер DD2, программа использовала обновлённые значения на выходах триггера DD1 (Q1 = 1 и NQ1 = 0). То же самое происходит и с триггером DD3.


Рис. 2. Недостаточное видение проблем создания булевских моделей
триггеров может привести к серьёзным ошибкам моделирования

Понятно, что результат моделирования не должен зависеть от порядка обработки элементов схемы. Этого можно достичь, если для каждого выхода триггера зарезервировать не один, а два контейнера. Первый должен сохранять старое (текущее), а другой новое (только что вычисленное, будущее) значение триггера. При этом пока не будут обработаны все элементы схемы, моделятор должен использовать старые значения. Закончив очередной цикл работы, моделятор продвинет модельное время на один такт, и перепишет содержимое всех контейнеров. Будущие значения станут текущими, а контейнеры для будущих значений освободятся и их можно использовать для новых результатов.

Итак, модели триггеров строятся многими способами:

§  из отдельных вентилей в виде структурных моделей;

§  в форме характеристического уравнения (поведенческая аналитическая модель);

§  в виде блок-схемы алгоритма (поведенческая алгоритмическая модель).

Рассмотрим названные разновидности моделей на примере стробируемого RS-триггера, показанного на рис. 1.