JAvaコードシミュレーションコンピュータ実現原理(一)加算器シミュレーション

7265 ワード

加算器には2つの基本論理ゲート回路がある:異或ゲート、与ゲート回路からなる
 
 
加算は最も基本的な算術演算である.だから、コンピューターを作りたいなら(これは本書で暗黙的に議論されている問題です)まず、2つの数を加算できる機械を構築する方法を知っておく必要があります.この問題を解決すると、加算はコンピュータの唯一のことです.加算に使用される機械を使用することで、加算を構築して減算、乗算、除算、不動産抵当金の計算、誘導を実現することができます.火星に衛星、将棋、電話料金などの機能を発射する機械.現代の計算機や計算機に比べて,本章で構成した加算機は膨大で,重く,速度が遅く,ノイズが大きい.しかし、興味深いことに、その部品を構成するのは、スイッチ、電球、電線、電池、いくつかの論理ゲートを構成できるリレーなど、前の章で学んだ電子機器です.この加算機に含まれているすべての部品は1、2 0年前に発明されました.そして、私たちは本当に部屋に建てる必要はありません.紙と頭の中でこの機械を構築すればいいだけです.この加算機はバイナリ数でしか動作しません現代のコンピューターが不足しています補助装置.キーボードで追加したい数を入力することはできません.代わりに、一連のスイッチで追加する数を表すしかありません.ディスプレイで結果を表示することもできません.電球が並んでいるだけです.しかし、この加算機は確かに2つの数を加算する機能を実現しており、その動作はコンピュータと非常に似ています.2進数加算は10進数加算と似ています.法が似ている.2 4 5と6 7 3のような10進数を加算すると、問題を簡単なステップに分解し、ステップごとに1対の10進数だけを加算します.本例では,第1ステップは5と3を加算する.生活の中で、加算表を覚えていれば、問題の解決はずっと速くなります.10進数加算と2進数加算の大きな違いは、2進数の加算表が10進数の加算表よりずっと簡単であることです:+0 10 0 11 1 0
学校でこの表を覚えたことがあるかもしれません.0に0を足すと0になり、0に1を足すと1になり、1に0を足すと0になり、1に1を足すと0になり、1に1を足すと0になり、1に進みます.加算結果の数にゼロを加算すると、+0 10 0 0 0 11 0 1 0というように、2進数加算の結果が2桁になるように、加算表を書き換えることができます.それぞれ「和」と「進位」(例えば「1に1を足すと0になり、進位は1になる」)と呼ばれています.この2進法表を2つの表に分けることができます.1枚目は「和」を表す表:+と0 10 0 11 1 0 2枚目は「進位」を表す表ですの表:+進位0 10 0 01 0 1このようにバイナリ加算を見ると便利です.加算の機会が分かれて和と進位を求めるからです.バイナリ加算機を構築するには、テーブルに記述された動作を実行できる回路を設計する必要がある.スイッチ、電球、電線などの回路のすべての部品はバイナリ数として表すことができるため、この回路はバイナリ数のみで動作するため、回路の複雑さを大幅に低減する.10進数加算と同様に、2進数加算も最も右の列から始まり、列ごとに2つの数を加算します.注意して、右から3番目の列に加算すると、1つのキャリーが発生します.同様の場合も6、7、8列目に発生する.私たちはどのくらいの数を追加しますか?この加算機は頭の中でしか作られていないので、長い数字を加えることができます.より合理的には、8ビットを超えないバイナリ数を選択します.すなわち、オペランドの範囲は、0 0 0 0〜0 0 0 0 0〜1111〜1111、すなわち、10進数の0〜2 5である.2つの8ビットバイナリ数の和は、最大1〜1111〜111 0、すなわち5 1 0であってもよい.
 
次の2つの1ビットのバイナリ加算のキャリーテーブルを見ると、論理ゲートとバイナリ加算の間に何らかのつながりがあることをすぐに考えることができます:+キャリー0 10 0 01 0あなたは、前章で述べたゲートとの出力が同じであることに気づいたかもしれません:A N D 0 10 0 01 0 1で、ゲートと2つの1ビットの加算で得られたキャリーを計算するために使用することができます.私たちは少し進歩したようですが、次のステップはリレーが次の仕事を完成できるかどうかを見てみましょう.+と0 10 0 11 1 0はバイナリ加算のもう半分の問題です.和を表すこの人は進位ほど簡単ではありませんが、私たちは方法があります.まず,あるいはゲートの出力は我々が望んでいるものと近似していることを認識すべきであるが,右下角の結果は異なる:O R 0 10 0 11 1であり,非ゲートにとって左上角の出力が異なるほか,他の結果も所望と同様である:N A N D 0 11 1 0
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logic;

/**
 *
 * @author Administrator
 */
public abstract class LogicGates {
    /**
     *       
     * @param a
     * @param b
     * @return 
     */
    public static byte AND(byte a,byte b){
        if(a==1 && b==1){
            return 1;
        }
        return 0;
    }
    /**
     *       
     * @param a
     * @param b
     * @return 
     */
    public static byte OR(byte a,byte b){
        if(a==1 || b==1){
            return 1;
        }
        return 0;
    }
        /**
     *       
     * @param a
     * @param b
     * @return 
     */
    public static byte XOR(byte a,byte b){
        if(a==b){
            return 0;
        }
        return 1;
    }
    /**
     *     
     * @param b
     * @return 
     */
    public static byte NOT(byte b){
        if(b==1){
            return 0;
        }
        return 1;
    }
    
        /**
     *      
     * @param b
     * @return 
     */
    public static byte NAND(byte a,byte b){
        if(b==1 && a==1){
            return 0;
        }
        return 1;
    }
     /**
     *      
     * @param b
     * @return 
     */
    public static byte BUFFER(byte b){
        return b;
    }
    
    
     /**
     *      
     * @param b
     * @return 
     */
    public static byte NOR(byte a,byte b){
        if(b==0 && a==0){
            return 1;
        }
        return 0;
    }
    

    
    public static void main(String[] args){
        byte a=1;
     byte b=   LogicGates.AND((byte)1, (byte)0);
    }
}

 
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logic;

/**
 *
 * @author Administrator
 */
public abstract class Utils {
    
        
    /**
     * 
     *     0 1
     * @param a
     * @param b 
     */
    public static void validate(byte a,byte b){
        if((a!=0 && a!=1)|| (b!=0 && b!=1)){
           throw new RuntimeException("    "); 
        }
    }
    
   
    
        /**
     * 
     *     0 1
     * @param a
     * @param b 
     */
    public static void validate(byte b){
        if( b!=0 && b!=1){
           throw new RuntimeException("    "); 
        }
    }
    /**
     *   
     */
    public static void print(byte[] b){
        for(int i=0;i<b.length;i++){
            System.out.print(b[i]);
        }
        System.out.println();
    }
}

 
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logic;

/**
 *
 * @author Administrator
 */
public abstract class Adder {
    /**
     *     
     * @return 
     */
    public static byte[] HalfAdder(byte a,byte b){
        Utils.validate(a,b);
        return new byte[]{LogicGates.AND(a, b),LogicGates.XOR(a, b)};
    }
    /**
     *    
     * @return 
     */
    public static byte[] FullAdder(byte a,byte b,byte ci){
        Utils.validate(a,b);
        Utils.validate(ci);
        byte fs=LogicGates.XOR(a, b);
        byte sco=LogicGates.AND(fs, ci);
        return new byte[]{LogicGates.OR(sco, LogicGates.AND(a, b)),LogicGates.XOR(fs, ci)};
    }
    /**
     *      
     * @param a
     * @param b
     * @return 
     */
    public static byte[] EightAdder(byte[] a,byte[] b){
        if(a==null || a.length!=8){
             throw new RuntimeException("    "); 
        }
        if(b==null || b.length!=8){
            throw new RuntimeException("    "); 
        }
        byte[] resu=new byte[8];
        byte[] temp=null;
        byte ci=0;
        for(int i=7;i>=0;i--){
            Utils.validate(a[i],b[i]);
            temp=FullAdder(a[i],b[i],ci);
            ci=temp[0];
            resu[i]=temp[1];
        }
        return resu;
    }
    
    
    
    public static void main(String [] args ){
       Utils.print( Adder.EightAdder(new byte[]{0,0,0,0,1,1,0,1}, new byte[]{0,0,0,0,1,0,0,1}));
    }
}