📜  使用 Prolog 的电路(组合和顺序)实现

📅  最后修改于: 2021-09-16 10:30:56             🧑  作者: Mango

先决条件 – Prolog |一个介绍

概述 :
数字电路或数字电子学是电子学的一个分支,它处理数字信号以执行各种任务以满足各种要求。施加到这些电路的输入信号是数字形式的,以0和1的二进制语言格式表示。这些电路是通过使用执行逻辑运算的逻辑门(如 AND、OR、NOT、NANAD、NOR、XOR 门)设计的。这种表示有助于电路从一种状态切换到另一种状态以提供精确的输出。数字电路系统主要是为了克服模拟系统速度较慢且获得的输出数据可能包含错误的缺点而设计的。数字电路有组合电路和顺序电路两种。

使用 Prolog 实现:
Prolog 是一种逻辑和声明性的编程语言。 Prolog 这个名字本身是逻辑编程的缩写。

例子 :
这里出现了问题,我们如何在序言代码中描述电路。考虑以下电路图。

电路图中有 3 个输入,A、B、C。我们将在下面的代码行中考虑并通过上面的电路图作为序言代码。

circuit1(A,B,C,Q,R):-
    not(A,T1),
    and(A,B,T2),
    nand(T1,T2,T3),
    xnor(T3,C,T4),
    dff(T4,Q,R).

描述 :
这里 Q 和 R 是输出变量。 T1-T4 是中间门的实例值或输出。已使用的逻辑门是:- NOT、AND、NAND 和 XNOR 门。有 1 个 D-FLIP FLOP 和 2 个输出 Q 和 Q’。我们将真值表视为事实,将电路图视为序言中的规则,如以下代码所示。

笔记 –
在下面的代码中,真值表是为 g-prolog 编写的。在 swi-prolog 中,真值表是预定义的。

代码实现:
在这里,我们将实现逻辑并在 prolog 中编写代码。

步骤1 :
在这里,我们将为 2 个输入 A 和 B 实现所有逻辑门的真值表。

% Made by - Maninder kaur 
% Following are the truth tables of all logic gates for 2 inputs A and B.

and(0,0,0).
and(0,1,0).
and(1,0,0).
and(1,1,1).

or(0,0,0).
or(0,1,1).
or(1,0,1).
or(1,1,1).

not(0,1).
not(1,0).

nand(0,0,1).
nand(0,1,1).
nand(1,0,1).
nand(1,1,0).

nor(0,0,1).
nor(0,1,0).
nor(1,0,0).
nor(1,1,0).

xor(0,0,0).
xor(0,1,1).
xor(1,0,1).
xor(1,1,0).

xnor(0,0,1).
xnor(0,1,0).
xnor(1,0,0).
xnor(1,1,1).

第2步 :
在这里,我们将为 4 个输入 A、B、C 和 D 实现 OR GATE 的真值表。

% Following is the truth tables of OR GATE for 4 inputs A ,B ,C and D.
% (Used in 8X3 Encoder)

or4(0,0,0,0,0).
or4(0,0,0,1,1).
or4(0,0,1,0,1).
or4(0,0,1,1,1).
or4(0,1,0,0,1).
or4(0,1,0,1,1).
or4(0,1,1,0,1).
or4(0,1,1,1,1).
or4(1,0,0,0,1).
or4(1,0,0,1,1).
or4(1,0,1,0,1).
or4(1,0,1,1,1).
or4(1,1,0,0,1).
or4(1,1,0,1,1).
or4(1,1,1,0,1).
or4(1,1,1,1,1).

第 3 步:
在这里,我们将实现半加器。

% HALF ADDER :-
% INPUT VARIABLES - A,B,C
% OUTPUT VARIABLES - S ,Ca(Sum and Carry)

half_adder(A,B,S,Ca):-
    xor(A,B,S),
    and(A,B,Ca).

第四步 :
在这里,我们将实现全加器。

%FULL ADDER :-
%INPUT VARIABLES - A,B,C
%OUTPUT VARIABLES - S ,Ca (Sum and Carry)

full_adder(A,B,C,S,Ca):-
     xor(A,B,T1),
    xor(C,T1,S),
    and(T1,C,T2),
    and(A,B,T3),
    or(T3,T2,Ca).

第 5 步:
在这里,我们将实现半减法器。

%    HALF SUBTRACTOR :-
%    INPUT VARIABLES - A,B
%    OUTPUT VARIABLES - D ,BO (Difference and borrow)

half_sub(A,B,D,BO):-
    xor(A,B,D),
    not(A,T1),
    and(B,T1,BO).

第 6 步:
在这里,我们将实现完整的减法器。

% FULL SUBTRACTOR :-
% INPUT VARIABLES - A,B
% OUTPUT VARIABLES - D ,BO (Difference and borrow)

full_sub(A,B,BI,D,BO) :-
    xor(A,B,T1),
    xor(T1,BI,D),
    not(T1,T2),
    not(A,T3),
    nand(T2,BI,T4),
    nand(T3,B,T5),
    nand(T4,T5,BO).

第 7 步:
现在,我们将实现 2 × 4 解码器。

% 2 X 4 DECODER
% INPUT VARIABLES - A,B
% OUTPUT VARIABLES - D0,D1,D2,D3

decoder_2x4(A,B,D0,D1,D2,D3):-
    not(A,A_0),
    not(B,B_0),
    and(A_0,B_0,D0),
    and(A_0,B,D1),
    and(A,B_0,D2),
    and(A,B,D3).

第 8 步:
现在,我们将实现 3 × 8 解码器。

% 3 X 8 ENCODER
% OUTPUT VARIABLES - A,B
% INPUT VARIABLES - D0,D1,D2,D3,D4,D5,D6,D7

encoder_8x3(_,D1,D2,D3,D4,D5,D6,D7,A,B,C):-
    or4(D1,D3,D5,D7,A),
    or4(D2,D3,D6,D7,B),
    or4(D4,D5,D6,D7,C).

第 9 步:
现在,我们将实现 2 X 1 MULTIPLEXER。

% 2 X 1 MULTIPLEXER
% INPUT VARIABLES - A,B,S (Selector)
% OUTPUT VARIABLES - Z

mux_2x1(A,B,S,Z):-
    not(S,S1),
    and(A,S1,I0),
    and(B,S,I1),
    or(I0,I1,Z).

第 10 步:
现在,我们将实现 1 × 2 DEMULTIPLEXER。

% 1 X 2 DEMULTIPLEXER
% INPUT VARIABLES - I (Input) ,S (Selector)
% OUTPUT VARIABLES - A,B

demux_1x2(I,S,A,B):-
    not(S,S_0),
    and(I,S_0,A),
    and(I,S,B).

第 11 步:
现在,我们将实现 1 × 4 DEMULTIPLEXER。

% 1 X 4 DEMULTIPLEXER
% INPUT VARIABLES - I (Input) ,S0 and S1(Selectors)
% OUTPUT VARIABLES - A,B,C,D

demux_1x4(I,S0,S1,A,B,C,D):-
    decoder_2x4(S0,S1,T0,T1,T2,T3),
    and(I,T0,A),
    and(I,T1,B),
    and(I,T2,C),
    and(I,T3,D).

第 12 步:
现在,我们将实现 D FLIP FLOP。

% D FLIP FLOP TRUTH TABLE

dff(0,0,1).
dff(1,1,0).

第 13 步:
现在,我们将实现电路代码。

% CIRCUITS

circuit1(A,B,C,Q,R):-
    not(A,T1),
    and(A,B,T2),
    nand(T1,T2,T3),
    xnor(T3,C,T4),
    dff(T4,Q,R).

输出 :