덧셈과 곱셈으로 구현한 나눗셈 방법단국대학교 융합반도체공학과2학년배진성1. 설계 목적- 시프트(Shift) 방식에 대해 알아본다.- 2진수로 표현된 두 값을 곱하는 방법에 대해 알아본다.- 쉬프트를 이용한 나눗셈 방법을 익혀 곱셈 방법을 이용한 또 다른 나눗셈 방법을 도출한다.2. 설계 관련 이론1) 시프트(Shift) 방식2진수에서 “시프트(Shift)”란, 특정 2진수를 정한 bit 수만큼 원하는 방향으로 옮기는 것이다. 예를 들어, “1001”이란 4bit로 이루어진 2진수를 오른쪽 방향으로 2bit만큼 이동시키자고 한다. 그럼 시프트 과정 및 결과는 아래와 같다.위의 결과와 같이, 1bit 이동시키면 각 인덱스에 있던 2진수 값들이 하나씩 오른쪽으로, 2bit 이동 시에는 인덱스를 두 개씩 이동함을 볼 수 있다. 그러나 시프트 시에 가장 오른쪽에 있는 비트를 버릴지 여부에 따라 두 가지 결과가 나온다.시프트 결과의 왼쪽은 가장 오른쪽 비트(MSB)를 버리지 않고 가장 왼쪽 비트(LSB)로 옮긴 결과, 오른쪽은 MSB 값을 버린 결과이다. 이런 왼쪽 결과는 흔히 “쉬프팅(Shifting)”이라 불리며, 오른쪽 결과는 흔히 “로테이팅(Rotating)”이라 불린다.두 결과 중 무엇을 산출할지는 시프트를 어떻게 사용할지에 따라 설계자가 선택하면 된다.시프트 방향을 반대인 “왼쪽”으로 설정해서 시프트 할 수도 있다. 이 시프트 방식은 “LSB 방향 시프트”라 불린다. 위 예시에서 시프트 방향만 ‘LSB’로 변형해 다시 시프트했다. 과정 미치 결과는 아래와 같다.2) 두 Binary values 간 곱셈원핫 셀 형태의 두 값을 서로 곱하는 방식은 다음과 같다. ‘A’ 값에 ‘B’ 값의 인덱스별 각 2진수 값을 A의 bit수만큼 반복해서 늘린다. 그리고 그 값들을 1bit씩 LSB 방향으로 시프트해서 이동시킨 다음, 값 ‘A’와 함께 더해주면 된다.예시로 두 원핫 셀 형태 값 “0101”과 “1001”을 가지고 계산했다. 그 과정 및 결과는 아래와 같다.위 결과를 검토하고자, 두 값 ‘0101’과 ‘1001’을 10진수 형태 ‘5’와 ‘9’로 변형하여 계산했다. 두 값을 계산한 10진수 값은 “45”이다. 원핫 셀 형태의 결과값 “0101101”이 ‘45’인지 10진수로 변환해 확인해보자. 과정 및 결과는 아래와 같다.물론 위에서 보여준 방식은 두 값을 “unsigned values”로 간주하고 계산한 결과이다.두 값을 “signed values”로 간주하고 계산은 어떻게 할까? MSB 비트가 ‘1’인 값을 2보수 형태로 바꾸어 다른 값과 서로 곱해주면 된다. 위에서 든 예시를 가지고 다시 해보겠다. 먼저 MSB 비트가 ‘1’인 값은 “1001”이기에 이를 2보수 형태로 바꾸겠다. 바꾼 값은 “1001 -> 0110 + 1 = 0111(7, 10진수)”이다.‘0111’을 가지고 ‘0101’과 곱해보겠다. 과정 및 결과는 아래와 같다.곱해서 나온 결과 “0100011(10진수 형태, “35”)”를 2보수 형태로 바꿔주면 부호를 고려한 최종 결과가 나온다. 해당 결과값의 2보수 형태는 “1011100 + 1 = 1011101”이며, 10진수로 바꾼 값이 “-64 + 29 = -35”이므로 부호를 고려한 최종 결과까지 올바르게 나왔음을 알 수 있다.3) 쉬프트를 이용한 Binary values 간 나눗셈원핫 셀 형태의 두 값을 가지고 하나의 값(제차라 한다.)을 다른 하나의 값(피제차라 한다.)으로 나눠주는 방법은 다른 피제차를 MSB 방향으로 1bit씩 시프트(시프팅 방식이다.)하면서 제차보다 커질 때까지 그 시프트를 계속 진행한다.그러나 커진 피제차과 제차의 차이가 해당 나눗셈에서 나올 수 있는 최대 나머지보다 클 수 있다.그 때는 그 차이값을 MSB 방향으로 1bit씩 시프트(시프팅 방식이다.)하고 이를 피제차와 빼줌으로써 그 차이 값이적절한 나머지 값이 될 때까지 반복 진행한다.관련 예시는 아래에 있다.0010-----0110 | 11110110-----10010110-----0011-> 몫 : 0010 (10진수 : 2), 나머지 : 0011 (10진수 : 3)위와 같이, 몫을 “0001”로 두고, 제수값이 피제수 값보다 두 번 연속 클 때부터 MSB 방향으로 1bit씩 시프트한다. 그러다 제수값이 피제수 값보다 작을 때의 그 몫이 해당 나눗셈에서의 몫인 것이다.위 나눗셈에서는 제수값이 피제수값보다 컸기에 몫의 값이 “0010 (10진수 : 2)”였다.그리고 나머지를 구하기 위해서는 위 나눗셈에서 한 과정과 같이 변경되는 피제수값과 기존 제수값을 계속 빼주면 된다.그러나 위 나눗셈은 4bit로 이루어진 값들 간의 나눗셈이었기에 과정이 간단하게 나왔다.그러나 제수와 피제수 값들이 8bit, 16bit 이상으로 넘어갈수록 쉽지않은 원핫 셀 형태 값들 간 뺄셈을 계속해야 하기에위 과정을 직접 진행하기에도 꺼려진다. 또한 그 과정을 회로도와 베릴로그 등 하드웨어 코딩으로 표현할 시, 표현 자체가 더욱 복잡해진다. 그러기에 원핫 셀 형태의 값들 간 나눗셈을 입문자들이 이해하기에도 충분히 벅찰 수 있다.그래서 입문자들도 이해하기 쉬운 또 다른 사칙연산인 “곱셈”을 위 나눗셈 과정에 적용했다.그렇게 베릴로그로 표현도 더욱 이해하기 쉽게, 회로도도 보다 복잡하지 않게 표현함으로써 입문자들이 더욱 쉽게 이해할 수 있도록 하고자 위 프로젝트를 수행했다.3. 설계 과정- “Verilog” 로 표현한 코딩 내용 (’testbench’ 포함)(Testbench 코딩)4. 결과** 네모칸은 설정해야 하는 값이다. 위 테스트벤치에서 두 가지 이상의 경우를 들어 정확한 값이 적혀 나오지 않았다.** 초록선 그래프의 점근선은 Divide에서 설정 가능한 최댓값에 대한 나눗셈을 실행 시, 가능한 10진수 형태의 최대 b값이다.5. 결론대학교에서 디지털논리회에 입문했던 시절, 제일 이해하기 힘들었던 개념 중 하나가 원핫 셀 형태의 제차와 피제차간 나눗셈이었다.사칙 연산 중 다른 세 개의 연산은 회로도를 도화할 때는 전가산기와 반가산기의 반복된 직렬로 버겁기 했지만, 개념 자체를 이해하는 것은 어렵지 않았다.물론 나눗셈 개념 자체가 어렵지는 않았다.실제 나눗셈에서 수많은 뺄셈을 진행하는 과정에서 캐리 적용해 계산함이 햇갈려 자주 발생한 계산 오류, 산출된 나머지가 피제차에 따른 나머지 범위에 벗어났을 때 적절한 나머지를 찾는 과정에서 많은 어려움을 겪었다.또한 교수님께 베릴로그 코딩과 회로도만을 가지고 배웠다보니, 뭘 시프트하는지, 알아도 그걸 왜 시프트하는지도 모를만큼 나눗셈 과정 자체를 이해하지 못 했었다.물론 나뿐만 아닌 당시 같이 수강했던 학생들에게 접해들은 전반적인 주장이기도 하다.그러나 그 학생들에게 더하기와 곱하기는 다른 개념 대비 이해하기 훨씬 쉬웠다고 들었다.앞으로도 나눗셈 방법을 어렵게 배울 학생들을 위해 나를 비롯한 당시 학생들의 의견을 바탕으로 나눗셈 방법 쉽게 접근 가능하도록 새롭게 구현하고자 이번 프로젝트를 진행했다.이번 프로젝트에서 제안한 나눗셈 방법은 ~~하다.또한 이 방법은 기존 알려진 나눗셈 방법에 비해 일부 연산에 대한 심볼을 이용한 회로도나 베릴로그 내용도 한결 간단하다.이 방법을 익힘에 있어 효과를 가시적으로 보여주고자, 기존 나눗셈 방식에 대한 회로도, 베릴로그 내용과 이 프로젝트에서 구현한 것들과 함께 비교해봤다. 두 비교 내용은 다음 페이지에 있다.두 위에서 비교한 회로도와 베릴로그 코딩을 보면 바로 체감이 올 거다.기존 나눗셈 방법은 제차 및 피제차의 비트수가 늘어날수록 연결해야 하는 회로의 수가 계속 늘어나 그림이 더욱 복잡해지는 반면, 이 프로젝트에서 구현한 나눗셈 방법은 비트수와 상관없이 위 회로도의 크기가 더 변하지 않게 된다.물론 심볼을 전부 제거하고 재도화할 시, 프로젝트에서 구현한 방법에 대한 회로도도 복잡해질 수 있다.그러나 이번 프로젝트의 취지는 원핫 셀 형태의 제차와 피제차를 나누는 방법을 배우는 입문자들이 어렵게 배우게 되더라도 이를 쉽게 이해할 수 있도록 하는 것이었다. 그렇기에 심볼을 제거한 회로도는 큰 의미가 없다고 봤다.또한 베릴로그의 경우에도 기존 나눗셈 방법은 전가산기를 알아야만 이해할 수 있는 방법인 반면, 이 프로젝트에서 구현한 방법은 시프트 개념만 알면 바로 이해할 수 있다. (위, 아래 방법다 나눗셈을 제외한 세 가지 연산을 알아야 하기에 이에 의미부여는 하지 않았다.)게다가 전가산기는 하나의 논리회로이기에 개념을 이해하는데 시간이 걸리는 반면, 시프트는 원핫 셀 형태의 비트에 대해 특정 위치만큼 좌,우로 옮기는 것을 의미하기에 따로 개념 이해하는데 시간을 들일 필요가 없다.그리고 베릴로그에서는 두 개념을 이해하는데 소요될 시간 차이가 더욱 벌어진다.따라서 어떠한 방법으로 배워도, 이 프로젝트에서 구현한 나눗셈 방법이 더 효율적임을 보였다. 그리고 이 방법은 입문자 시절, 나와 같은 입문자였던 학생들이 무엇을 어려워하고 쉬워하는지 충분히 인지하고 구현한 방법이다.그래서 향후의 논리회로 입문자들도 이 프로젝트 내용을 읽고 이런 연산의 이해에 있어 어려움을 안 겪었음 한다.6. 참고문헌1) “디지털 논리와 마이크로 프로세서 설계”, 북스힐, Enoch O. Hwang 지음, 김정범, 김준민 외 2명 옮김
원핫 셀 형태의 다중 비트 값을올바르게 적었는지 검증하기단국대학교 융합반도체공학과2학년배진성1. 설계 목적- “XOR” 과 “XNOR”이 부울 연산의 결과에 대해 의미하는 바가 뭔지 알아본다.- 둘 이상의 다중 비트 데이터를 서로 순차적으로 비교하는 방법을 알아본다.- 순차적 비교를 통해 비교 데이터들 간 동일 여부 확인 및 다를 시, 동일하게 만드는 방법을 알아본다.2. 설계 관련 이론2-1) “XOR”와 “XNOR”“XOR”과 “XNOR”은 비트 연산기의 하나이다.또한 “XOR”과 “XNOR”을 거친 두 결과값의 관계는 입력 개수(2~5개)가 홀수 개수일 때와 짝수 개수일 때 다르다.입력 개수 : 3개XOR = (a’b + ab’)c’ + (ab + a’b’)cXNOR = (ab + a’b’)c + (a’b + ab’) c’∴ XNOR = (a’b + ab’)c’ + (ab + a’b’)c진리표 :< XOR >abcF**************************001111< XNOR >abcF**************************001111입력 개수 : 5개,XOR = [{(a’b + ab’)c’ + (ab + a’b’)c}(d + d’)](e + e’)XNOR = [{(a’b + ab’)c’ + (ab + a’b’)c}(d + d’)](e + e’)(∵ a^b^c = a ~^b ~^c)진리표 :e = 0abcdF00**************************10*************0*************11*************10111110e = 1abcdF00**************************10*************0*************11*************10111110∴ 입력 수가 홀수일 때는 “XOR”과 “XNOR”로 정의된 부울 식은 서로 같다.입력 개수 : 2개XOR = a’b + ab’ / XNOR = ab + a’b’진리표:abF000011101110abF001010100111입력 개수 : 4개XOR = {(ab’ + a’b)c’ + (ab + a’b’)c}d’ + {(ab’ + a’b)c’ + (ab + a’b’)c}’d= {(ab’ + a’b)c’ + (ab + a’b’)c}d’ + {(ab + a’b’)c’ + (ab’ + a’b)c}d= ab’c’d’ + a’bc’d’ + abcd’ + a’b’cd’ + abc’d + a’b’c’d + ab’cd + a’bcdXNOR = {(ab’ + a’b)c’ + (ab + a’b’)c}d + {ab’ + a’b)c’ + (ab + a’b’)c}d’= ab’c’d + a’bc’d + abcd + a’b’cd + abc’d’ + a’b’c’d’ + ab’cd’ + a’bcd’** 진리표는 아래에 기재함**진리표 :abcdF00**************************10*************0*************11*************10111110abcdF00***************************************0**************************1011100111112-2) 순차적 비교 (”Verilog” 이용)2비트 이상 다중 비트에 있어 동일 비트인 두 데이터가 서로 같은지 비교하는 방법은 여러 가지가 있다.그 중에서도 대표적인 방법으로는 두 가지가 있다.“XOR”이나 “XNOR” 연산자를 사용해서 각 인덱스의 비트 값이 서로 같은지 확인하는 방법과 “연산 간 차”를 통한 결과값을 10진수로 부호화(encode) 시, ‘0’이 나오게끔 하는 방법이다.첫 번째 방법은 위에서 설명한 바와 같이, 다른 값이 있음 ‘1’을 출력하는 ‘XOR’이나, 반대로 같은 값이 있음 ‘1’을 출력하는 ‘XNOR’을 이용하면, 전자는 특정 인덱스에서 출력된 ‘1’을 통해 해당 인덱스가 잘못 기입됨을 알 수 있고, 후자는 특정 인덱스에서 출력된 ‘0’을 통해 해당 인덱스가 잘못 기입됨을 알 수 있다.두 번째 방법은 비교하는 두 데이터가 서로 같으면, 두 데이터를 10진수로 부호화 후 그 차이를 연산할 시, 결과가 10진수 ‘0’이 나오는 것이 당연하다.따라서 두 데이터 간 차를 구하는 연산 이후 나오는 값으로 두 데이터가 같은지, 다른지 알 수 있다. 또한 부호화하지 않은 2진수 결과값을 통해 어디가 잘못 되었는지도 찾을 수 있다.다만 ‘0-1’과 같은 경우는 ‘10’에서 2를 빌려와 계산을 이어간다. 그래서 결과값만으로 해당 부분이 잘못됐는지 빠른 판단이 힘들기에 첫 번째 방법 대비 잘못된 위치 찾기까지 소요 시간이 길다는 단점이 있다.2-3) “Verilog”에서 다른 데이터들을 서로 같게끔 하는 방법“Verilog”에는 특정 데이터를 지닌 두 변수를 가지고 한 변수의 데이터를 다른 변수에 할당(”대입”이라고도 한다)하는 방법이 있다. 그 방법은 아래와 같다.잘못 입력한 부분을 찾고자 하는 이 실험에서도 사용할 수 있다. 순차적 비교를 통해 찾은 잘못 입력된 2진 데이터는 그 반대 값을 해당 인덱스에 위 코드와 같이 할당하면 된다.3. 설계 과정- “Verilog” 로 표현한 코딩 내용 (’testbench’ 포함)4. 결과 (파란색 : ‘1’, 주황색 : ‘0’)5. 결론하나의 논리게이트에 연결 가능한 최대 입력 수가 5개라는 점에서 더 많은 입력에 대한 XOR과 XNOR 결과를 하나의 XOR이나 XNOR에서 표현함에 있어서는 한계가 있다.그래도 짝수 입력수에 대해서는 XOR과 XNOR 결과가 다름과 홀수 입력수에 대해 XOR과 XNOR 결과가 같다라는 결과가 6개 이상 입력수에 대해서도 적용될지 진리표를 통해 알아봤다.모든 범위에서 알아보는 것은 힘들기에 5개 넘는 짝수 6과 홀수 7에 대해서만 알아봤다.먼저 6개 입력에 대한 XOR과 XNOR에 대한 회로도는 아래와 같다.ABCDEFOUT000000***************************************1**************************1*************1*************111010011110다음으로 7개 입력에 대한 XOR과 XNOR에 대한 회로도는 아래와 같다.ABCDEFOUT*************000001**************************1**************************1*************1*************111000011111ABCDEFGOUT00000000*************10*************10*************011*************10*************010*************011*************01110100011110ABCDEFGOUT00000000*************10*************10*************011*************10*************010*************011*************011101000111105개 이상의 입력에 대해서는 게이트 하나당 받을 수 있는 입력 수의 제한이 있기에 2개 이상의 XOR 및 XNOR 게이트를 사용해야 했다.그러나 진리표로 확인했을 때, “짝수 입력에 있어서는 XOR과 XNOR의 결과가 다름과 홀수 입력에 있어서는 XOR과 XNOR 결과가 서로 같다.”라는 사실이 적용되고 있음을 알 수 있었다.추가로 XOR은 입력 값 중 ‘1’이 홀수 개일 때 참이며, 짝수 개일 때에는 거짓으로 판단된다. 그리고 XOR은 입력 값 중 ‘1’의 수가 짝수 일 때 참이다.6. 참고문헌1) “디지털 논리와 마이크로 프로세서 설계”, 북스힐, Enoch O. Hwang 지음, 김정범, 김준민 외 2명 옮김