[南大OS] 七段数码管

#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>

typedef bool wire; // Wires
typedef struct {
  wire *value;
} reg; // Flip-flops

// Circuit constructs
#define CLOCK               for (; ; END_CYCLE)
#define NAND(X, Y)          (!((X) && (Y)))
#define NOT(X)              (NAND(X, 1))
#define AND(X, Y)           (NOT(NAND(X, Y)))
#define AND3(X, Y, Z)       AND(AND((X), (Y)), (Z)) 
#define AND4(X, Y, Z, W)    AND3(AND((X), (Y)), (Z), (W))
#define OR(X, Y)            (NAND(NOT(X), NOT(Y)))
#define OR3(X, Y, Z)        OR(OR((X), (Y)), (Z))
#define OR4(X, Y, Z, W)     OR(OR((X), (Y)), OR((Z), (W)))
#define XOR(X, Y)           OR(AND(X, NOT(Y)), AND(NOT(X), Y))

// Circuit emulation helpers
#define END_CYCLE ({ end_cycle(); putchar('\n'); fflush(stdout); sleep(1); })
#define PRINT(X) printf(#X " = %d; ", X)

// Wire and register specification
wire X, Y, Z, W, X1, Y1, Z1, W1, A, B, C, D, E, F, G;
reg b[4] = {{.value=&W},
            {.value=&Z},
            {.value=&Y},
            {.value=&X}};

// Dump wire values at the end of each cycle
void end_cycle() {
  PRINT(A); PRINT(B); PRINT(C); PRINT(D);
  PRINT(E); PRINT(F); PRINT(G);
}

int main() {
  CLOCK {
    // 1. Wire network specification (logic gates)
    X1 = NOT(X);
    Y1 = NOT(Y);
    Z1 = NOT(Z);
    W1 = NOT(W);

    A = AND(OR4(AND(Z, W1), XOR(X, Z), AND(Y, OR(X, W)), AND3(Y1, Z1, W1)), \
    NOT(AND4(X,Y, Z1, W)));
    
    B = OR(OR(AND(X1, Y1), AND3(X, Z1, W)), \
    OR(AND3(X, Y1, W1), AND3(X1, Y, OR(AND(Z1, W1), AND(Z, W)))));

    C = OR4(XOR(X, Y), AND3(X1, Y1, Z1), AND4(X1, Y1, Z, W), AND4(X, Y, Z1, W));

    D = OR4(AND(X, Z1), AND3(Y, Z, W1), AND3(Y1, Z, W), \
    OR(AND3(X1, Y1, W1), AND4(X1, Y, Z1, W)));
    
    E = OR4(AND(Z, W1), AND3(X, Z, W), AND3(X, Y, Z1), AND3(Y1, Z1, W1)); 
    
    F = OR4(AND(X,Y1), AND(Z1, W1), AND(X, Z), OR(AND3(X1, Y, Z1), AND3(Y, Z, W1)));

    G = OR4(AND(X, OR3(Y1, W, Z)), AND(Z, W1), AND3(X1, Y, Z1), AND3(X1, Y1, Z));

    // A = *b[3].value;
    // B = *b[2].value;
    // C = *b[1].value;
    // D = *b[0].value;

    // 2. Lock data in flip-flops and propagate output to wires
    wire c = 1;
    wire value;
    for (int i = 0; i < 4; ++i) {
      value = XOR(c, *b[i].value);
      c = AND(c, *b[i].value);
      *b[i].value = value;
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值