1. 程式人生 > >《計算機系統要素學習》筆記之第2章 布林運算

《計算機系統要素學習》筆記之第2章 布林運算

《計算機系統要素學習》筆記之第2章 布林運算

  • 2-補碼:也稱基補碼。if x!=0 then x=2^n-x else x=0 其中n為位數
  • 規範詳述
  • 半加器(HalfAdder):進行兩個一位二進位制加法
  • 全加器(FullAdder):進行三個一位二進位制加法
  • 加法器(Add16):進行兩個n位二進位制加法
  • 增量器(Inc16):對指定數字加1
  • 算術邏輯單元(ALU):Arithmetic Logical Unit 是計算機平臺的核心部分,所有的算術功能都在這裡實現。
  • 實現
  • HalfAdder
    Xor(a=a,b=b,out=sum);
    And(a=a,b=b,out=carry);
  • FullAdder
    HalfAdder(a=a,b=b,sum=w1,carry=w2);
    HalfAdder(a=c,b=w1,sum=sum,carry=w3);
    HalfAdder(a=w2,b=w3,sum=carry,carry=w4);
  • Add16
    HalfAdder(a=a[0],b=b[0],sum=out[0],carry=c1);
    FullAdder(a=a[1],b=b[1],c=c1,sum=out[1],carry=c2);
    FullAdder(a=a[2],b=b[2],c=c2,sum=out[2],carry=c3);
    FullAdder(a=a[3],b=b[3],c=c3,sum=out[3],carry=c4);
    FullAdder(a=a[4],b=b[4],c=c4,sum=out[4],carry=c5);
    FullAdder(a=a[5],b=b[5],c=c5,sum=out[5],carry=c6);
    FullAdder(a=a[6],b=b[6],c=c6,sum=out[6],carry=c7);
    FullAdder(a=a[7],b=b[7],c=c7,sum=out[7],carry=c8);
    FullAdder(a=a[8],b=b[8],c=c8,sum=out[8],carry=c9);
    FullAdder(a=a[9],b=b[9],c=c9,sum=out[9],carry=c10);
    FullAdder(a=a[10],b=b[10],c=c10,sum=out[10],carry=c11);
    FullAdder(a=a[11],b=b[11],c=c11,sum=out[11],carry=c12);
    FullAdder(a=a[12],b=b[12],c=c12,sum=out[12],carry=c13);
    FullAdder(a=a[13],b=b[13],c=c13,sum=out[13],carry=c14);
    FullAdder(a=a[14],b=b[14],c=c14,sum=out[14],carry=c15);
    FullAdder(a=a[15],b=b[15],c=c15,sum=out[15],carry=c16);
  • Inc16
    Add16(a=in,b[0]=true,out=out);
  • ALU
    //輸出out
    Mux16(a=x,b=false,sel=zx,out=x1);
    Not16(in=x1,out=notx1);
    Mux16(a=x1,b=notx1,sel=nx,out=x2);
    Mux16(a=y,b=false,sel=zy,out=y1);
    Not16(in=y1,out=noty1);
    Mux16(a=y1,b=noty1,sel=ny,out=y2);
    Add16(a=x2,b=y2,out=addx2y2);
    And16(a=x2,b=y2,out=andx2y2);
    Mux16(a=andx2y2,b=addx2y2,sel=f,out=f1);
    Not16(in=f1,out=notf1);
    Mux16(a=f1,b=notf1,sel=no,out=f2);
    Mux16(a=f2,b=true,sel=false,out=out);
    //輸出ng
    And16(a=f2,b[15]=true,out=Andf2);
    Or16Way(in=Andf2,out=sel1);
    Mux(a=false,b=true,sel=sel1,out=ng);
    //輸出zr
    Or16Way(in=f2,out=sel2);
    Mux(a=true,b=false,sel=sel2,out=zr);