Скачиваний:
49
Добавлен:
22.05.2015
Размер:
146 Кб
Скачать
☆

Моделирование комбинационных схем

Моделирование электронных схем начинается с определения функциональных элементов и правил их работы. Пусть функциональными элементами являются двухвходовые логические элементы И, ИЛИ и инвертор НЕ.

Так как эти элементы работают в двоичной логике, введём новый домен, содержащий только два элемента – ноль и единицу:

domains bool = [0..1].

Опишем логику работы элементов в виде соответствия выходного сигнала Out поданным входным сигналам In1 и In2:

class facts

и : (bool In1,bool In2,bool Out). или : (bool In1,bool In2,bool Out). не : (bool In,bool Out). clauses

и(0,0,0).  и(0,1,0).  и(1,0,0).  и(1,1,1). или(0,0,0).  или(0,1,1).  или(1,0,1).  или(1,1,1). не(0,1).  не(1,0).

А теперь разработаем на Прологе модель элемента И‑НЕ на основе двух соответствующих элементов. Для этого выход Y элемента И соединим со входом элемента НЕ (рис.2).

Объявим предикат в разделе предикатов:

и_не : (bool In1,bool In2,bool Out) nondeterm anyflow.

и определим правило в разделе предложений:

и_не(X1,X2,Z) :- и(X1,X2,Y), не(Y,Z).

Обратите внимание, что переменная Y, являющаяся выходной в предикате и(X1,X2,Y) , одновременно является входной в предикате не(Y,Z). Это полностью соответствует описанию на рис.1.

Пример 5. Проверим работу элемента И‑НЕ с помощью нижеуказанной программы:

implement main

    open core, console

domains bool = [0..1]. constants className = "com/visual-prolog/main". classVersion = "$JustDate: $$Revision: $". class facts и : (bool In1,bool In2,bool Out). или : (bool In1,bool In2,bool Out). не : (bool In,bool Out). class predicates и_не : (bool In1,bool In2,bool Out) nondeterm anyflow. clauses classInfo(className, classVersion). и(0,0,0).  и(0,1,0).  и(1,0,0).  и(1,1,1). или(0,0,0).  или(0,1,1).  или(1,0,1).  или(1,1,1). не(0,1).  не(1,0). и_не(X1,X2,Z) :- и(X1,X2,Y), не(Y,Z). run():-    init(),    и_не(X1,X2,Z),    writef("% % -> %",X1,X2,Z),nl,    fail();    write("Всё!!!"),    _=readchar(). end implement main goal

   mainExe::run(main::run).

Запустите эту программу и убедитесь, что она печатает на экране таблицу истинности для элемента И‑НЕ. Эта модель может работать при любой комбинации входных и выходных данных.

Пример 6. Для определения выхода Z элемента И‑НЕ при входах 0 и 1 достаточно изменить цель следующим образом:

run():-

   init(),

   и_не(0,1,Z),

   writef("0 1 -> %",Z),nl,

   fail();

   write("Всё!!!"),

   _=readchar().

Пример 7. Обратная задача: какие должны быть входы X1, X2 для того, чтобы выход Z был единицей? Для её решения достаточно указать требуемый выход, а в качестве входов использовать свободные переменные:

run():-

   init(),

   и_не(X1,X2,1),

   writef("% % -> 1",X1,X2),nl,

   fail();

   write("Всё!!!"),

   _=readchar().

Пример 8. Комбинированная задача: какой должен быть вход X2 для того, чтобы при входе X1 = 1 выход Z был единицей? Для её решения надо указать значения для X1 и Z, а переменную X2 оставить свободной, чтобы Пролог сам нашёл её значение:

run():-

   init(),

   и_не(1,X2,1),

   writef("1 % -> 1",X2),nl,

   fail();

   write("Всё!!!"),

   _=readchar().

Пример 9. Надо проверить, допустима ли такая комбинация входных и выходных значений: X1=1,X2=1,Z=0. Укажем её в предикате и_не(1,1,0):

run():-

   init(),

   и_не(1,1,0),

   writef("1 1 -> 0"),nl,

   fail();

   write("Всё!!!"),

   _=readchar().

Задача 6. Разработайте и проверьте модель элемента ИЛИ‑НЕ.

Задача 7. Разработайте и проверьте модель xor/3 двухвходового сумматора по модулю 2. Его по-другому называют “исключающее ИЛИ”. Логика его работы проста – если входы различны, то на выходе – единица, иначе – ноль.

Задание повышенной трудности. Разработайте и проверьте модель двухразрядного двоичного сумматора sum/7. Описание аргументов: sum(X1, X2, Y1, Y1, Z1, Z1, P). Здесь складывается двухразрядное число X и двухразрядное число Y. Получаемый результат: двухразрядное число Z и сигнал переноса P.

Соседние файлы в папке Лабораторные работы