Искусство схемотехники. Том 2 (Изд.4-е) - Хоровиц Пауль. Страница 52

  # !a & b & c & d & e & !f & g

D1 =>

a& !b & !c & e & f & g

  # !b & c & d & e & f &g

  # a & b & с & !d & e & f & g

  # a & b & !c & d & e & !f & g

  # a & b & c & d & !e & !f & g

  # a & b & с & !d & !e & !f & !g

D2 =>

а & !b & !с & d & е & f

  # а & !b & c & d & f & g

  # а & !b & !с & е & f & g

  # !а & b & с & !d & !е & f & g

  # !a & b & c & d & e & !f & g

  # !a & !b & !c & d & e & !f & g

  # a & b & с & !d & !e & !f & !g

D3 =>

a & b & c & f & g

  # a & !b & !c & d & e & f

  # a & !b & !c & e & f & g

  # !a & !b & c & d & e & f & g

  # !a & b & c & d & e & !f & g

  # !a & !b & !c & d & e & !f & g

D0.oe => 1

D1.oe => 1

D2.oe => 1

D3.oe => 1

Рис. 8.78. Преобразователь 7-сегментного представления в 16-ричное с минимизированными термами произведения.

Взгляните, все удовлетворяет ограничению «7 произведений». CUPL также рисует для вас карту перемычек (рис. 8.79).

Искусство схемотехники. Том 2 (Изд.4-е) - _217.jpg

Рис. 8.79. Карта перемычек преобразователя 7-сегментного представления в 16-ричное.

Конечно, вы не программируете ПМЛ так, а используете вместо этого прямую загрузку универсального JEDEC программирующего формата. В этом примере язык CUPL, очевидно, делает трудную задачу простой.

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

Как пример, давайте спроектируем регистровую ПМЛ для диаграммы состояний на рис. 8.80.

Искусство схемотехники. Том 2 (Изд.4-е) - _218.jpg

Рис. 8.80. Диаграмма состояний торгового автомата.

Это — торговый автомат, предназначенный для выдачи бутылки сладкой шипучей жидкости, когда опущено 25 цент или более. Существует некоторый вид монетного интерфейса, который «заглатывает», распознает монету и посылает на наш ПМЛ 2-битовый входной сигнал (С1, С0), действительный для одного такта, показывающего монету, которую опустили (01-5 цент, 10–10 — цент монета, 11–25 — цент монета, 00 — нет монеты). Задача машины состояний добавлять к общему вкладу и формировать выход, называемый «бутылка», когда опущено достаточно монет. Рис. 8.81 показывает спецификацию, выполненную в синтаксисе машины состояний языка CUPL.

/** Inputs **/

Pin = elk; /* clock — positive edge */

Pin = c0; /* coin type — low bit */

Pin = c1; /* coin type — high bit */

Pin = reset; /* reset input */

/** Outputs **/

Pin 18 = !Q0; /* bit 0 of state variable */

Pin 17 = !Q1; /* bit 1 */

Pin 16 = !Q2; /* bit 2 */

Pin 15 = !bottle; /* bottle disgorge command */

/* Define machine states with symbolic names;

"enough" = 25 cents or more */

$define S0 'b'000

$define S5 'b'001

$define S10 'b'010

$define S15 'b'011

$define S20 'b'100

$define ENOUGH 'b'101

/* define intermediate variables */

nocoin = !c0 & !c1 & !reset;

nicke1 = c0 & !c1 & !reset;

dime = !c0 & c1 & !reset;

quarter = c0 & c1 & !reset;

/* Define state bit variable field */

field statebit = [Q2..0];

/* Transition rules for vending machine */

sequence statebit {

present S0 if nocoin next S0;

     if nicke1 next S5;

     if dime next S10;

     if quarter next ENOUGH out bottle;

present S5 if nocoin next S5

     if nicke1 next S10;

     if dime next S15;

     if quarter next ENOUGH out bottle;

present S10 if nocoin next S10

     if nicke1 next S15;

     if dime next S20;

     if quarter next ENOUGH out bottle;

present S15 if nocoin next S15

     if nicke1 next S20;

     if dime next ENOUGH out bottle;

     if quarter next ENOUGH out bottle;

present S20 if nocoin next S20

     if nicke1 next ENOUGH out bottle;

     if dime next ENOUGH out bottle;

     if quarter next ENOUGH out bottle;

present ENOUGH next S0; }

Рис. 8.81. Спецификация торгового автомата на языке CUPL.

Как и прежде, мы начнем с определения входных-выходных контактов. Заметим, что мы добавили вход reset (сброс) так, чтобы вы могли перейти к начальному состоянию S0 (нет монеты). Затем мы определим состояния, потом правила перехода между ними. Если какие-либо выходы, либо регистровые, либо комбинационные, необходимо генерировать в течение состояний или переходов между состояниями, они определяются в то же самое время. В этом примере выход «бутылка» специфицируется как раздельный выходной регистр, т. е. выходные состояния дешифрировать не нужно. Фактически нужен только выход, а биты Q0-2 машины состояний могут быть представлены во внутренних регистрах, которые не генерируют прямо выводы; некоторые программируемые логические устройства имеют также внутренние регистры в дополнение к обычным выходным регистрам.

Заметим, что вы должны определить точно переход из некоторого состояния в себя, также, как мы делали для входа «нет монеты». Неопределенное условие безусловно сбрасывает состояние во все нули. Это происходит потому, что эти условия собираются в комбинационную логику для выставления на D-входы регистров и, таким образом, если условие не удовлетворяется, то соответствующий D-вход не подтверждается. Рис. 8.82 показывает вывод из языка CUPL.

** Expanded Product Terms **

Q0.d =>

!Q0 & !Q1 & cQ & !reset

      # !Q0 & !Q2 & cO & !reset

      # Q0 & !Q2 & !c0 & !reset

      # Q0 & !Q2 & c1 & !reset

      # !Q0 & !Q1 & Q2 & c1 & !reset

Q1.d =>

!Q1 & !Q2 & !c0 & c1 & !reset

      # !Q0 & Q1 & !Q2 & !c1 & !reset