📜  门| GATE-CS-2016(套装2)|第 65 题(1)

📅  最后修改于: 2023-12-03 15:28:45.054000             🧑  作者: Mango

门| GATE-CS-2016(套装2)|第 65 题

这道题目涉及到电路设计和kmap化简。给定一个逻辑电路,需要我们对其进行简化和最小化。

逻辑电路

首先,我们需要了解给定的逻辑电路,其实际上是一个3输入3输出的电路。我们可以用以下逻辑表达式来描述它:

A_out = (not A and B and C) or (A and not B and C) or (A and B and not C)
B_out = (not A and not B) or (not A and C) or (A and not C)
C_out = (not A and B) or (not A and not C) or (B and C)

其中,ABC 分别代表输入信号,A_outB_outC_out 为输出信号。

Karnaugh Map 简化

接着,我们可以利用 Karnaugh Map(K-map)对以上的逻辑表达式进行简化。下面是对应的 K-map:

K-map.png

我们可以将上图中的每一格列出对应的布尔表达式:

A\BC | 00     01     11     10
-----+----------------------------
  0  | !A!B!C  !AC!B  ABC    AB!C
  1  | !AB     !A!C   A!C!B !A!BC
  1  | !A!B    !A!C   B!C!A !BC

在 K-map 中,我们可以发现由若干格共同组成的矩形区域隐含了一种特殊的简化方式,叫做矩形化简法。

具体而言,先找到能涵盖所有 1 的最小矩形,这些格子通常被称为主项(prime implicant);接着,再利用尽可能少的矩形涵盖所有未被涵盖的 1,这些格子通常被称为次项(sub-prime implicant)。最终的简化表达式即为主项与次项的积和和积。

对于以上逻辑电路,我们可以对每个输出做 K-map 简化。以 A_out 为例,我们可以画出对应图形:

A_out_K-map.png

根据上图,我们可以发现有一个大小为 $2\times2$ 的矩形区域,它涵盖了四个 1,其中两个 1 和一个 0 是必要的。因此,我们可以得到一个主项:(not A and B) or (A and not C)。同时,在左上角和右上角都有一个单独的 1,分别构成两个大小为 $1\times2$ 的矩形区域。因此,我们也可以得到两个次项:(not A and B and C)(A and B and not C)。因此:

A_out = (not A and B and C) or (A and not B and C) or (A and B and not C)

对于 B_outC_out,同样可以通过画出对应的 K-map 并利用矩形化简法得到它们的简化表达式:

B_out = (not A and not B) or (not A and C) or (A and not C)
C_out = (not A and B) or (not A and not C) or (B and C)
最小化

以上表达式已经是一个简化的形式,但并不是最简的形式。我们可以通过进一步的代数化简来得到最小化表达式。

代数化简

首先,我们可以看到 A_out 中的每个主项都有两个变量,而 A_out 本身只有三个变量,这暗示我们可以使用弗雷根(Veitch)图来得到更加简化的形式。

以下是对 A_out 所对应的 Veitch 图:

A_out_Veitch.png

对于不同的对齐方式,我们分别得到如下不同放置方式的 Veitch 图。

A_out_Veitch1.png

A_out_Veitch2.png

A_out_Veitch3.png

我们可以看到,这些 Veitch 图中都有一个大小为 $2\times2$ 的矩形区域,它涵盖了我们之前得到的主项。同时,这些 Veitch 图中也涵盖了次项。因此,我们可以对这些 Veitch 图做化简,得到最小化表达式。

同样地,对于 B_outC_out,我们分别可以得到它们所对应的 Veitch 图,并进行最小化。最终得到的最小形式为:

A_out = B xor C
B_out = A xor C
C_out = A xor B
Verilog 代码

最后,我们可以将以上表达式转换为一个简单的 Verilog 模块:

module logic_circuit (
    input wire A,
    input wire B,
    input wire C,
    output wire A_out,
    output wire B_out,
    output wire C_out
);

    assign A_out = B ^ C;
    assign B_out = A ^ C;
    assign C_out = A ^ B;

endmodule

这个模块接受 ABC 三个输入信号,以及 A_outB_outC_out 三个输出信号,其中 ^ 代表异或运算。在输入信号变化时,输出信号会随之自动更新,因此,这个模块可以用来实现上面所描述的逻辑电路。