C#으로 구현한 ALU 곱셈 연산

C#으로 구현한 ALU 곱셈 연산

Author : Jino Bae / Send Mail

ALU에서 부호 없는 2진수 곱셈기의 방식은 Q레지스터의 각각(처음 부터 끝까지)의 비트수가 0이면 우측 시프트를 수행하고 1일 경우 A레지스터에 M레지스터를 더해주고 우측 시프트를 진행하는 방식이다. 만약 이 문구가 이해가 안 된다면 소스코드를 복사해서 돌려본 다음 계속해서 보고있으면 뭔가 감이 올 것으로 생각된다. 그렇게 Q레지스터의 비트수 만큼 연산이 진행되고 10진수로 변환하면 곱셈값은 완벽하게 일치한다.


다만 이 소스코드는 4비트로 한정되어있고, C#에 익숙하지 못했을때 작성하여(지금 작성해도 비슷하긴 하겠지만) 기능적으로 접근한 것도 아니고 문자열을 이용해서 연산이 수행되는 방식을 흉내만 낸 것이다.




소스코드

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Binary_4BIT
    {
        public int Q_refer;
        private string M;
        private string Q;
        private string A;
        private int C;

        public void Write()
        {
            Console.Write(A +" "+ Q);
        }

        public Binary_4BIT(string BINARY1, string BINARY2)
        {
            this.Q_refer = int.Parse(BINARY2);
            this.M = BINARY1;
            this.Q = BINARY2;
            this.A = "0000";
            this.C = 0;
        }

        public void R_SHIFT()
        {
            if (this.C == 0)
            {
                this.Q = "" + A[3] + Q[0] + Q[1] + Q[2];
                this.A = "" + C + A[0] + A[1] + A[2];
            }
            else if(this.C == 1)
            {
                this.Q = "" + A[3] + Q[0] + Q[1] + Q[2];
                this.A = "" + C + A[0] + A[1] + A[2];
                this.C = 0;
            }
            Console.WriteLine("\tSHIFT");
        }

        public void ADD()
        {
            int[] S = new int[4];
            int c = 0;
            int carry = 0;

            for(int i = 3; i>=0;i--)
            {
                if (c >= 1) carry = 1;
                else carry = 0;
                S[i] = (this.M[i] + this.A[i]) % 48 + carry;
                if(S[i] > 1)
                {
                    c++;
                    S[i] = (this.M[i] + this.A[i] + carry) % 2;
                }
                else if(S[i] == 0 || S[i] == 1)
                {
                    c--;
                    S[i] = (this.M[i] + this.A[i] + carry) % 2;
                }
                if ((this.M[i] + this.A[i]) % 48 > 1) this.C = 1;
            }
            A = "" + S[0] + S[1] + S[2] + S[3];
            Console.Write("\tADD , ");
        }

        public static string TRANStoBINARY(string a)
        {
            int temp1 = int.Parse(a);
            string temp_s = "";
            string temp_sr = "";
            for(; ; )
            {
                if (temp1 % 2 == 1)
                {
                    temp_s += "1";
                    temp1 -= 1;
                }
                else if(temp1 % 2 == 0)
                {
                    temp_s += "0";
                }
                temp1 /= 2;
                if (temp1 == 0) break;
            }
            int count = temp_s.Length-1;
            if(count == 0) temp_s += "000";
            else if(count == 1) temp_s += "00";
            else if(count == 2) temp_s += "0";

            count = 3;
            for(; ; )
            {
                temp_sr += temp_s[count];
                count -= 1;
                if (count < 0) break;
            }
            return temp_sr;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("4비트 이진수 곱셈기,");
            Console.WriteLine("10진수로 입력시 맨끝에 (10) 입력[단, 범위 15이내]");
            Console.WriteLine("예시입력 1011*1100 or 13*7(10) \n");

            string INPUT = Console.ReadLine();
            string[] NUMBER = INPUT.Split('*','(');
            string[] BINARY = new string[2];

            if(INPUT.Contains("(10)"))
            {
                BINARY[0] = Binary_4BIT.TRANStoBINARY(NUMBER[0]);
                BINARY[1] = Binary_4BIT.TRANStoBINARY(NUMBER[1]);
            }
            else
            {
                BINARY[0] = NUMBER[0];
                BINARY[1] = NUMBER[1];
            }

            Console.WriteLine("BINARY(M) = " + BINARY[0]);
            Console.WriteLine("BINARY(Q) = " + BINARY[1]);

            Binary_4BIT MLT = new Binary_4BIT(BINARY[0], BINARY[1]);
            Console.Write("Default = ");
            MLT.Write();

            for (int i = 1;i<=1000;i*=10)
            {
                if ((MLT.Q_refer%(i*10))/i == 1)
                {
                    MLT.ADD();
                    MLT.R_SHIFT();
                }
                else
                {
                    MLT.R_SHIFT();
                }
                Console.Write("  Cycle = ");
                MLT.Write();
            }
            Console.WriteLine("\n");
        }
    }
}




결과값




Jino Bae
WRITTEN BY

Jino Bae

Digital is a purely man-made playground. That's why I like.
im@baejino.com


comments powered by Disqus