📜  门|门模拟 2017 |问题 10(1)

📅  最后修改于: 2023-12-03 14:58:37.759000             🧑  作者: Mango

门|门模拟 2017 |问题 10

本文将介绍门|门模拟2017年的第10个问题,这是一个模拟电路问题。

问题描述

在这个问题中,我们需要设计一个模拟电路,满足下列要求:

  • 器件:$2$个D型触发器、$2$个与非门、$1$个或非门,以及若干个电线。
  • 输入:两个单独的信号,分别为时钟信号和输入信号。
  • 输出:两个单独的信号,分别为$Q_1$和$Q_2$。

电路图如下所示:

电路图

任务

你需要使用任何你习惯的语言,实现这个电路的逻辑功能,并用样例数据和输出测试你的实现。

你需要提交你的实现代码和测试数据。

实现方式

一个较为简单明了的实现方式:

def door_door_2017_prob10(clk, inp):
    r1 = s1 = r2 = s2 = 1     # 初始化
    q1 = q2 = 0     # 初始状态

    for i in range(len(clk)):
        if clk[i]:
            if inp[i]:      # 输入为1,置反向触发器
                r1, s1 = s1, r1
                r2, s2 = s2, r2
            q1 = (not s1) if r1 else q1      # 更新Q1,利用反向触发器
            q2 = (not s2) if r2 else q2      # 更新Q2,利用反向触发器

    return q1, q2
测试数据

如下为测试样例数据:

def test_door_door_2017_prob10():
    clk = [0, 0, 0, 1, 1, 1, 0, 1, 0, 1]
    inp = [0, 1, 1, 1, 1, 0, 1, 1, 0, 0]
    q1, q2 = door_door_2017_prob10(clk, inp)
    assert q1 == 0 and q2 == 1, (q1, q2)

test_door_door_2017_prob10()
总结

这是一个较为简单的模拟电路问题,我们只需要实现逻辑功能,并结合测试数据检验实现是否正确即可。