Exemple #1
0
 public UnitàOperativa()
 {
     _sr        = ShiftRegister.GetInstance();
     _alu       = ALU.GetInstance();
     _busC      = BusC.GetInstance();
     _busB      = BusB.GetInstance();
     _registers = Registro.GetInstance();
     _systemBus = BusDiSistema.GetInstance();
 }
        public static ShiftRegister GetInstance()
        {
            if (_sr != null)
            {
                return(_sr);
            }
            lock (Object)
            {
                if (_sr == null)
                {
                    _sr = new ShiftRegister();
                }
            }

            return(_sr);
        }
Exemple #3
0
        public void execute_op()
        {
            _sr = ShiftRegister.GetInstance();
            // f0 e f1 stabiliscono l'operazione che l'ALU deve eseguire
            var f0 = Operation[0];
            var f1 = Operation[1];
            // enA e enB abilitano rispettivamente i due ingressi A e B dell'ALU
            var enA = Operation[2];
            var enB = Operation[3];
            // invA inverte l'operando A se  abilitato
            var invA = Operation[4];
            // inc effettua un incremento unitario se abilitato
            var inc = Operation[5];

            string tResult;

            var tOperandA = enA == '1' ? OperandA : "00000000000000000000000000000000";

            var tOperandAInv = invA == '1' ? Utility.ToBin(~Convert.ToInt32(tOperandA, 2), 32) : tOperandA;

            var tOperandB = enB == '1' ? OperandB : "00000000000000000000000000000000";

            var tInc = inc.ToString();

            var tUSum = Convert.ToUInt32(tOperandAInv, 2) + Convert.ToUInt32(tOperandB, 2) +
                        Convert.ToUInt32(tInc, 2);

            char[] chars = { f0, f1 };
            var    fn    = new string(chars);

            switch (fn)
            {
            case "00":     //AND
                tResult = Utility.ToBin(Convert.ToInt32(tOperandAInv, 2) & Convert.ToInt32(tOperandB, 2), 32);
                break;

            case "01":     //OR
                tResult = Utility.ToBin(Convert.ToInt32(tOperandAInv, 2) | Convert.ToInt32(tOperandB, 2), 32);
                break;

            case "10":
                tResult = Utility.ToBin(~Convert.ToInt32(tOperandB, 2), 32);
                break;

            case "11":     //SOMMA ALGEBRICA
            {
                var tSum = Convert.ToString(tUSum, 2);
                tResult = tSum;
                break;
            }

            default:
                tResult = "00000000000000000000000000000000";
                break;
            }


            Risultato = Utility.ToBin(Convert.ToInt32(tResult, 2), 32);

            _sr.Dato = Risultato;                                    //scrittura risultato nel registro a scorrimento

            NFlag = Risultato[0] == '1';                             //aggiornamento negative flag
            ZFlag = Risultato == "00000000000000000000000000000000"; //aggiornamento zero flag

            DebugInfo();
        }