Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Экспериментируя с оператором TRUTH_TABLE, следует помнить, что компилятор языка DSL автоматически проверяет дублирующие входные термы. Он зафиксирует ошибку, как только обнаружит два или более перекрывающихся (overlapping) набора.

Особенно внимательным надо быть в ситуациях, когда используются значения. X. Например, записав для входных сигналов A, D1, D0 комбинацию: 0, .X., .X. (рис.11, а), вы фактически определили четыре набора (рис.11, б).

Добавление в левую таблицу любого из неявно заданных наборов (рис.11, б), приведёт к ошибке перекрытия (рис.11, в).

Рис.11. Ошибка, связанная с перекрытием наборов (0 .X. .X.) и

Таблица истинности, как и прочие конструкции, может вкладываться в другие операторы, например IF или CASE. Очевидно, что результирующее уравнение будет определяться содержанием родительской конструкции.

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

МАССИВЫ И ГРУППЫ

Одним из важнейших требований, предъявляемых к языку описания аппаратуры, является возможность изображать не только одиночные, но и шинные сигналы. В САПР PCAD 4.5 шинный сигнал можно было объявить и использовать только внутри PML-модели. Графический редактор PC-CAPS этого пакета не поддерживал шины и многоразрядные контакты. Другими словами, такую схему как 4-разрядный сумматор (рис.12, а) нельзя было ни нарисовать, ни промоделировать, не отказавшись от шин. Чтобы решить задачу, потребовалось бы вместо шин рисовать отдельные проводники, а при моделировании в качестве внешнего интерфейса использовать одиночные сигналы (рис.12, б).

НЕ нашли? Не то? Что вы ищете?

В отличие от САПР PCAD 4.5 в редакторе Schematics пакета DesignLab 8 можно создавать и шины и многоразрядные контакты, а в языке DSL описывать их с помощью одномерных массивов и/или групп. На рис.12, в показана DSL-модель сумматора, использующая описания шинных сигналов в виде массивов, а на рис.12, г – в виде групп.

Рис.12. DSL-модели шинных структур (на примере 4-разрядного сумматора)

В САПР DesignLab графический редактор допускает три равнозначных определения шины и многоразрядных контактов: A[3-0], B[3..0], SUM[3:0] (рис.12, а). Они отличаются разделителем между левой и правой границами диапазона – это символы «-», «..» и «:».

В языке DSL разрешён только один формат разделителя: [msb..lsb]. Здесь msb и lsb соответственно старший и младший значащие разряды (от англ. Most Significant Bit и Least Significant Bit). Запомните, левое значение диапазона всегда определяет старший разряд (как и в позиционном коде). Сказанное остаётся справедливым независимо от того, какой задаётся диапазон: убывающий [3..0] или возрастающий [0..3].

Шину можно объявить и внутри DSL-модели, причём двумя разными способами (рис.13, б). С одним из них мы уже знакомы, так декларированы массивы L[7..0] и M[0..7]. Другой формат определяет имя и размер (size) массива. Он записывается в виде: F[4]. Теперь в квадратных скобках стоит одно число – это и есть размер массива. В нашем примере массив F[4] содержит 4 элемента (проводника шины) – от F[3] до F[0]. Этим приёмом можно задать только убывающий диапазон, который чаще всего и применяется на практике.

Шинные сигналы, представленные массивами, могут обрабатываться как единое целое (например, SUM = A.+. B; см. рис.12, в) или как одиночные сигналы в шине – элементы массива (например, F[0] = D[1] * D[0]; см. рис.13, б). Таким образом, каждый элемент массива можно проиндексировать и использовать как индивидуальный сигнал.

Следует обратить внимание ещё на одну вещь. В тексте DSL-модели, правда, в разных местах, встречаются очень похожие конструкции: при декларации массива F[4] и в исполняемом разделе, например F[3]. Но они несут совершенно разную нагрузку. В первом случае объявляется весь массив, а во втором – подразумевается отдельный его элемент.

Рис. 13. В выражения языка DSL можно включать массивы целиком (Y = F)
или использовать их отдельные элементы (F[1] = /D[1])

Мы обсудили крайние режимы работы с массивом как с целым и как с отдельным его элементом. Однако язык DSL позволяет ссылаться и на любую часть массива (подмассив), например компилятор «проглотит» и такую запись:

F[3..2] = 6;

Здесь используется двухразрядный подмассив F[3..2], содержащий элементы F[3] и F[2], которым требуется присвоить число 6 (двоичный эквивалент 110). Это число не вписывается в разрядную сетку подмассива F[3..2], что приведёт к отбрасыванию старшего разряда константы, а элементы подмассива получат значения: F[3] = 1, F[2] = 0.

Подмассивы можно использовать для передачи данных со сдвигом, например запись:

Y[3..1] = D[2..0]; Y[0] =D[3];

приведёт к циклическому сдвигу данных в сторону старших разрядов.

Заканчивая разговор о массивах, замечу, что в качестве индекса массива может быть использована не только константа, но и выражение, например, записи F[2 .*. 2] или F[3 .+. 1] эквивалентны прежнему определению: F[4]. Более того, используя макроопределение: MACRO SIZE 4; можно с тем же успехом написать: F [SIZE];. Объявив FF [SIZE .*. 2];, мы декларируем массив FF шириной 8 бит.

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

Приведём пример определения 12-разрядного массива F:

§  F [1100b] “ двоичный формат константы;

§  F [14o]; “ восьмеричный формат константы;

§  F [12]; “ десятичный формат константы (по умолчанию);

§  F [12d]; “ десятичный формат константы;

§  F [0Ch] “ шестнадцатеричный формат константы; она должна начинаться с цифры, иначе компилятор сочтёт её идентификатором.

Группа, в отличие от массива, позволяет объединять в единое целое (в шину) одиночные сигналы с различными именами (идентификаторами). Чтобы «собрать» сигналы в группу, достаточно поместить их внутрь квадратных скобок, то есть выполнить операцию конкатенации. В языке PML такая конструкция называлась cat_узлом.

Например, сигналы A, B, C, D можно объединить в группу [A, B, C, D] и работать с ней как с 4-разрядным массивом (с шинным сигналом). Так же как и в массиве, сигнал, занимающий левую позицию в группе, считается самым старшим битом в слове.

Группе можно присвоить значение ([A, B, C, D] = 12;), обнулить все входящие в неё сигналы ([A, B, C, D] = 0;) передать текущее содержимое массива ([A, B, C, D] = F;) или значение из другой группы ([A, B, C, D] = [Q3..Q0]).

В отличие от cat-узла языка PML в группу можно собрать не только отдельные сигналы, но и целые выражения, например [/A, B*C, 1, D]. Более того, в группы допускается объединять не только входные и внутренние сигналы (узлы), но и выходные (см. рис.12, г), чего нельзя было сделать в языке PML.

Язык DSL поддерживает даже иерархию групповых описаний, то есть элементом группы может быть другая группа или массив.

Если сигналы имеют имена с порядковым описанием, например Q0, Q1, Q2, Q3, Q4, Q5, Q6, Q7, то, объединяя их в группу, достаточно указать только крайние сигналы. Так группа [Q6..Q3] содержит четыре сигнала: Q6, Q5, Q4, Q3. Этот приём был использован в DSL-модели сумматора, показанной на рис. 12, г.

При работе с массивами и группами важно помнить, что связанные одним выражением они должны иметь и одинаковую размерность. Вспомните, как в языке PML мы складывали 5-разрядный массив с одноразрядным (см. лекцию N). И всё получалось. В языке DSL компилятор такую вольность не пропустит.

Знакомясь с DSL-моделями 4-разрядного сумматора, приведёнными на рис.12, вы, вероятно, заметили в них один дефект: при сложении больших чисел происходит переполнение, и старший разряд суммы теряется. Короче, сумматор надо усовершенствовать, добавив в него выходной, а для полноты картины и входной, переносы.

Новая версия показана на рис.14.

Чтобы выровнять диапазоны слагаемых, в старшие разряды добавлены нули, причём в группу с входным переносом CI пришлось добавить не один, а четыре старших разряда, установив их все в 0 (рис.14, г).

В варианте, показанном на рис.14, в принято иное решение. Объявлен внутренний массив F[4] и все его разряды установлены в 0 (F = 0). После этого массив F объединён в одну группу с входным переносом CI ([F, CI]). Без всякого сомнения, вы отыщите и другие интересные решения, если воспользуетесь операторами IF, CASE или TRUTH_TABLE.

Впрочем, одну модель сумматора с использованием таблицы истинности TRUTH_TABLE мы всё-таки рассмотрим. Вы обнаружите в ней массивы и группы. Об этой возможности уже упоминалось, и вот пришло время рассмотреть её детально. На рис. 15 показан один из возможных вариантов.

Рис.14. Усовершенствованные DSL - модели сумматора с учётом
входного и выходного переносов

Рис.15. DSL-модель сумматора с использованием таблицы истинности TRUTH_TABLE

АРИФМЕТИЧЕСКИЕ ОПЕРАТОРЫ

В выражениях с арифметическими операциями могут участвовать массивы, группы и константы. Мы уже встречались с операцией суммирования шинных сигналов, представленных массивами и/или группами. Эта операция обозначается символом плюс, обрамлённым точками, то есть вот так: .+. (см. рис.12, 14). Точки используются для того, чтобы отличить арифметическое сложение от логического сложения (дизъюнкции).

Другие возможные в языке DSL арифметические операции приведены в таблице 3.

В арифметических операциях.*. (умножение), ./. (деление) и. MOD. (модуль) могут участвовать только константы. В арифметических операциях.+. (сложение) и.-. (вычитание) к ним добавляются массивы и группы. Напомню, что массивы и группы, связанные одним выражением, должны быть одинаковой ширины.

Это требование не относится к константам. Перед выполнением операции она автоматически приводится к размерности массива или группы. Если же значение константы не вписывается в разрядность массива или группы, то её старшие разряды будут отброшены и потеряны.

Таблица 3

Оператор

Определение

Приоритет

Пример

.*.

Умножение

2

5 .*. 7

./.

Деление

2

10 ./. 2

.MOD.

Деление по модулю

2

17 .MOD. 3

.+.

Сложение

3

A.+. B

.-.

Вычитание

3

A.-. B

ОПЕРАТОРЫ ОТНОШЕНИЙ

Такие операторы позволяют сравнивать между собой константы, идентификаторы, массивы и группы. Операторы отношений выдают в качестве результата значение 1, если выражение истинно, или - 0, если оно ложно.

В таблице 4 приведены допустимые в языке DSL операторы отношений.

Таблица 4

Оператор

Определение

Приоритет

Пример

=

Равно

4

A=B

<> 

Не равно

4

A<>B

Меньше

4

A<B

Больше

4

A>B

<=

Меньше или равно

4

A<=B

>=

Больше или равно

4

A>=B

Когда необходимо проверить сразу несколько операторов отношений, то их удобно объединять в условные выражения с помощью логических операций OR, AND и NOT. Они имеют самый низкий приоритет, и потому начинают работать после того, как все другие операции будут выполнены. Это делает необязательным применение скобочных форм.

Понятно, что операторы отношений, прежде всего, предназначены для условных операторов IF и IF-THEN-ELSE. Но они могут использоваться и в операторах присваивания.

Например, выражение:

OUT1 = / (IN1=IN2);

фактически моделирует работу элемента с функцией XOR (исключающее ИЛИ). Действительно, оператор отношения (IN1=IN2) выдаёт 1, когда значения сигналов на входах IN1 и IN2 равны, то есть на наборах 00 и 11. На этих наборах выход элемента XOR должен равняться 0, что и обеспечивает данное выражение благодаря инверсии «/». Конечно, ту же функцию можно реализовать и более понятным способом, например OUT1 = IN1 (+) IN2; или OUT1 = (+)(IN1, IN2); или даже так: OUT1 = IN1*/IN2 + /IN1*IN2;.

В рассмотренном примере оператор отношения не проявил каких-либо преимуществ, и только запутал дело, но в других ситуациях его использование может дать более компактный DSL-код. Покажем это на примере 4-разрядного компаратора COMP_DSL (рис.16).

Рис.16. DSL-модели 4-разрядного цифрового компаратора

В модели, показанной на рис.16, в, декларируется внутренний 3-разрядный массив F[3]. Если в результате сравнения двоичных чисел A и B выяснится, что A меньше B, то в старший разряд этого массива будет поставлена 1 (F=4) и позднее она будет передана на выход AlB (когда выполнится оператор [AlB, AeqB, AmB] = F;). Аналогичным образом выясняются значения на выходах AeqB и AmB.

В модели, показанной на рис.16, г, сначала выполняется оператор отношений [A3..A0]<[B3..B0];. Если A<B, то результатом будет 1, и она будет присвоена выходу AlB. В противном случае выход AlB получит значение 0. Состояния остальных выходов AeqB, AmB вычисляются по тем же правилам.

Весьма привлекательно выглядит модель того же самого компаратора с применением таблицы истинности (рис.17). Она показывает, что в качестве входных данных могут использоваться не только одиночные сигналы и их выражения, но и выражения, использующие массивы (или группы).

В данном примере выражения представляют собой операторы отношений, причём в качестве операндов выступают одномерные массивы A и B. Если отношение истинно, то в соответствующем столбце таблицы будем стоять 1, в противном случае 0. Предположим, что A=B (второй столбец). На втором наборе это отношение истинно. Следовательно, надо присвоить значение 1 выходному сигналу AeqB (вторая строка).

Рис.17. DSL-модель 4-разрядного цифрового компаратора с использованием
оператора TRUTH_TABLE

ТАКТИРУЕМЫЕ УЗЛЫ

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

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

Чтобы почувствовать разницу между названными типами узлов, приведём DSL-модель абстрактного элемента DC_DSL (рис.18), который передаёт данные с входа D на выходы Q и Q_SYN. При этом выход Q является асинхронным (обычный буфер), а Q_SYN тактируется управляющим сигналом C (как D-триггер). Уточним, что данные на выход Q_SYN передаются только с появлением фронта сигнала C (рис.18, в).

Рис.18. Ключевое слово CLOCKED_BY определяет синхронизацию узла DFF
управляющим сигналом C

Описания асинхронного (DF) и тактируемого (DFF) узлов отличаются наличием во втором случае ключевого слова CLOCKED_BY. Оно то и определяет управляющий сигнал (в примере сигнал C), по положительному фронту которого входные сигналы передаются на выход (в этот момент выполняется оператор DFF=D;). Обратите внимание, пока не пришёл первый фронт сигнала C, выход вообще не определён и ему назначено значение X (Unknown).

Чтобы активным стал не фронт, а срез сигнала C, достаточно проинвертировать его, записав: CLOCKED_BY /C. В принципе, после ключевого слова CLOCKED_BY может следовать целое выражение. Такая возможность используется в модели счётчика с входом разрешения E и сбросом по входу R (рис.19).

Рис. 19. DSL-модель двоичного суммирующего счётчика со входом разрешения счёта E

В варианте, показанном на рис19, б после ключевого слова CLOCKED_BY следует выражение: C*E. Если на входе E низкий уровень, то счёт запрещён (выражение C*E всегда равно нулю). При E=1 положительный фронт на входе C увеличивает содержимое счётчика на 1.

В модели используется ещё одна новая конструкция: RESET_BY R;. Это асинхронный сброс декларированных узлов. В данном примере обнуление счётчика осуществляется высоким уровнем на входе R. Если записать RESET_BY /R;, то сброс будет происходить при появлении нуля на входе R. Отметим, что приоритет действия RESET_BY выше, чем CLOCKED_BY. Опцию RESET_BY разрешается использовать только для тактируемых узлов, то есть совместно с CLOCKED_BY.

При внимательном рассмотрении можно обнаружить в построенной модели один дефект. Он проявляет себя при некорректном управлении счётчиком, когда разрешение счёта E=1 приходит не в паузе, а во время формирования вершины импульса C.

В этой ситуации выражение C*E становится равным 1, и счётчик отреагирует на него так, как будто он обнаружил счётный импульс (а ведь на входе C в это время фронта нет).

В модели, показанной на рис.19, в этот недостаток устранён проверкой условия E=1 перед тем, как выполнять счёт. Если условие не выполняется, счётчик сохраняет текущее состояние (ELSE Y=Y;).

Казалось бы, оператор Y=Y; ничего нового не делает, а только подтверждает текущее состояние счётчика. Но попробуйте опустить его, и модель перестанет правильно работать. Вероятно всё дело в том, что при отсутствии альтернативы компилятор полагает излишним и сам оператор IF.

А, возможно, он просто «обиделся», ведь в языке DSL есть специальная конструкция, предусмотренная для этих целей.

Она называется CLOCK_ENABLED_BY, и определяет выражение для разрешения синхронизации опцией CLOCKED_BY. Другими словами, когда сигнал, определяемый ключевым словом CLOCK_ENABLED_BY, принимает значение 1, сигналу синхронизации, заданному конструкцией CLOCKED_BY, разрешается управлять тактируемыми узлами. На рис.20 показано, как это делается на практике.

Рис. 20. Конструкция CLOCK_ENABLED_BY разрешает счёт по сигналу E=1

Предположим, у нас появилось желание превратить суммирующий счётчик в вычитающий, а заодно и сделать так, чтобы он начинал счёт с кода 1111. Первое желание удовлетворить проще простого: в операторе Y=Y.+.1; достаточно заменить арифметическую операцию.+. на.-. А вот, чтобы по сигналу R в счётчике устанавливались все единицы, надо использовать новое ключевое слово: PRESET_BY (рис.21). Эта конструкция работает аналогично RESET_BY, только происходит не сброс, а установка в 1 всех управляемых этой опцией узлов.

Рис. 21. Вычитающий счётчик с конструкцией PRESET_BY, начинающий счёт с кода 1111

DSL-МОДЕЛИ ТРИГГЕРОВ

Вероятно, вы уже догадались, что тактируемые узлы, которые использовались в последних примерах, очень напоминают работу D-триггера с динамическим управлением (рис.22). В простейшем исполнении такой триггер имеет только два входа: вход данных D и вход синхронизации C (рис.22, а). Синхронизация реализуется с помощью опции CLOCKED_BY.

Используя конструкцию CLOCK_ENABLED_BY можно предусмотреть вход разрешения (в примере он имеет имя E), который будет разрешать или блокировать синхронизацию (рис.22, б).

На рис.22, в к D-триггеру добавлен асинхронный вход сброса R, который декларируется опцией RESET_BY. Наконец, на рис.22, г мы видим триггер с асинхронной установкой S и сбросом R. Для описания входа установки S использована соответствующая опция PRESET_BY. Из сказанного следует, что конкретный вид триггера конфигурируется управляющими узлами.

Единственно чего не хватает – это описания входа данных D. Но оказывается, что такое описание и не нужно, потому что в языке DSL имена информационных тактируемых входов (а их всего шесть - D, J, K, S, R и T) генерируются компилятором автоматически по следующему правилу. Имя, объявленное как тактируемый узел, считается прямым выходом триггера. Компилятор берёт это имя, добавляет к нему суффикс. D (или J., K., S., R., T. для иных типов триггеров) и генерирует имя входа данных (на рис.22 вход данных получил имя Q. D).

Рис. 22. Различные конфигурации D-триггера, генерируемые программой PLSyn
по DSL-описанию

В подтверждение сказанному построим модель D-триггера (рис.23) с конфигурацией, показанной на рис.22, г. Обратите внимание, переменная F. D нигде не декларирована, но компилятор её знает – это вход данных D-триггера. Он сам сгенерировал это имя по объявленному выходу F, дописав к нему суффикс. D.

Рис. 23. DSL-модель D-триггера с динамическим управлением по входу C,
асинхронным сбросом и установкой по входам R и S

Чтобы модель лучше воспринималась, и было ясно, что речь идёт о D-триггере, а не о каком-то абстрактном узле F, в формат описания тактируемых узлов можно добавить тип используемых триггеров. Для нашего примера декларация D-триггера будет выглядеть так:

D_FLOP NODE F CLOCKED_BY C RESET_BY R PRESET_BY S;

Теперь появляется возможность опустить и слово NODE:

D_FLOP F CLOCKED_BY C RESET_BY R PRESET_BY S;

Вариант объявления тактируемого узла без указания типа триггера допустим только в одном случае, когда речь идёт о D-триггере. Все остальные типы триггеров требуют явной декларации. Для этого существуют следующие ключевые слова: D_LATCH, JK_FLOP, SR_FLOP и T_FLOP. Их модели показаны на рис.24.

Рис. 24. DSL-модели триггера-защёлки - а), JK-триггера, срабатывающего по спаду - б),
RS-триггера = в), T-триггера - г)

Обратите внимание, для триггеров с двумя информационными входами компилятор генерирует не одно, а два имени F. J и F. K или F. S и F. R.

Ещё одна особенность встроенных в язык DSL триггеров состоит в том, что они имеют только один (прямой) выход. Триггеры реальных микросхем отличаются наличием как прямого, так и инверсного выходов. Чтобы моделировать такие триггеры, их приходится оформлять в виде отдельных процедур, например так, как это показано на рис.25. Созданные DSL-модели реальных триггеров занесём в библиотечный файл LIB_DSL_PROC. dsl.

Рис. 25. DSL-модели реальных триггеров K555TM2 и K555TV6

DSL-МОДЕЛИ РЕГИСТРОВ

Если в списке тактируемых узлов объявить не одиночный сигнал, а массив (шину), то мы получим описание не триггера, а регистра. Например, запись:

D_FLOP Y[7..0] CLOCKED_BY C RESET_BY R ;

означает, что декларирован 8-разрядный регистр на D-триггерах. Конечно, есть все основания утверждать, что перед нами восемь триггеров. Но ведь это не изолированные триггеры – они имеют общие входы синхронизации и сброса, поэтому точнее называть их регистром. Отсюда и происходит другое название тактируемых узлов - регистровые узлы (в противовес комбинационным).

Впрочем, сказанное не является для нас откровением - похожие конструкции уже использовались ранее при построении моделей счётчиков (см. рис.19).

Теперь мы применим их для моделей регистровых схем. На рис.26 изображена DSL-модель 8-разрядного регистра сдвига с трёхстабильным выходом. Сделаем важное замечание: мы хотим, чтобы режим внутреннего сдвига сохранялся и в том случае, когда выход переводится в Z-состояние.

Рис. 26. DSL-модель 8-разрядного регистра сдвига с трехстабильным выходом

Новым в этой модели являются для нас две вещи: опция ENABLED_BY /OE и место её включения.

С помощью опции ENABLED_BY задаётся управляющий узел (в примере OE), который переводит схему в состояние высокого импеданса (если OE=1) и разрешает (ENABLE) выдавать данные, когда OE=0. Сигнал OE специально проинвертирован (/OE), чтобы разрешение осуществлялось низким уровнем.

Мы привыкли к тому, что управляющие конструкции, такие как, CLOCKED_BY, RESET_BY, PRESET_BY, приписывались к тактируемым узлам, то есть к внутренним переменным DSL-модели. Но оказывается их разрешено использовать и с выходными параметрами процедур.

Если бы опция ENABLED_BY /OE была определена в строке описания внутренних узлов, то перевод регистра в Z-состояние блокировал бы и операцию сдвига. В варианте, показанном на рис.26, в Z-состояние переключаются только выходные буферы (сигналы Q[7..0]), а «внутренний» регистр Y[7..0] продолжает сдвиги. В реальных схемах именно так и протекают процессы (например, 533ИР25).

В отличие от других управляющих опций, конструкция ENABLED_BY может использоваться не только с тактируемыми, но и комбинационными узлами. Следующий пример (рис.27) подтверждает сказанное. Здесь изображён мультиплексор MUX_4, коммутирующий одно из двух 4-разрядных двоичных чисел на общий выход. Заметим, что если во время рисования DSL-блока в редакторе Schematics, вы объявите выход Y[3..0] как highZ (высокоомный выход), то при генерации DSL-шаблона к имени выхода будет автоматически добавлена опция ENABLED_BY.

Рис.27. DSL-модель мультиплексора, переключающего два 4-разрядных
двоичных числа A или B на общий выход Y

Однако мы немного отвлеклись. Вернёмся к регистрам и рассмотрим DSL-модель кольцевого регистра сдвига (рис.28). Он работает в соответствии с логической таблицей, показанной на рис. 28, б. Если M=1 (Mode - режим), то в регистр с входа DR вдвигается число последовательным кодом.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3