8 bit Caculator 를 만들면서 alu에서 계산된 16 bit 값을 CLCD 나 7-Segment 에 표시할 때
4 bit 씩 나눠서 넣어주게 되면 10 진수로 출력할 때 10의 자리가 넘어가면 문제가 생기게 된다.

ex) 14 + 2 = 16 -> 16'b0000_0000_0001_0000 // 4개로 나누어서 
                                  천    백    십    일       4자리를 표현하려 했으나,

16이 되면 원래 원하는 0001_0110 이 아닌 0001_0000 이 나오게 된다.
당연히 Binary 를 BCD로 바꿔줘야하는데 급한 마음에 깜박했었다.

그래서 Binary to BCD Converter module를 만들었다.
기본적인 원리는 다음과 같다. shift 와 add3 를 이용

1. binary number를 왼쪽으로 1 bit 씩 shift 시킨다.
2. 왼쪽으로 shift 되었을 때 값이 5 이상일 면 add3 를 해준다.
3. 1번을 반복한다.
4. binary 가 8 bit 로 이루어져 있다면 8번 shift 해야한다.

 



verilog 결합연산자를 이용하여 shift를 구현하려고 했는데 문법오류인지 논리오류인지 컴파일 되지 않아서
data flow (?) 형식으로 설계를 하기로 하였다.


이것은 8 bit binary 를 BCD code로 바꾸는 것을 나타낸다. C? 들은 add3 모듈이다.

나는 2자리 숫자를 입력받아 계산을 하면 최대 4자리 숫자까지 표현을 해야하기 때문에 결과값을 16 bit로 선언하였기 때문에 16 bit 를 한번에 BCD code로 변환하는 것을 만들기로 했다.

위와같이 정리를 해보니 다음과 같았다.


8 bit는 add3 모듈이 7개면 되는데, 16 bit는 31개가 나왔다.
8 bit 2개로 나눠서 1000, 100, 10, 1 나누면 되지 않을까도 생각해봤는데 1000, 100 과 10 , 1 에서 십자리 까지만 나오면 괜찮은데 혹여나 백자리 숫자가 존재해서 꼬여버릴까봐 아예 처음부터 16 bit로 입력받아 BCD를 출력하게 하였다.

 



합성은 잘 되었고, ModelSim으로 시뮬레이션을 해보았다.


16 bit binary로  0010_0110_0111_1000 를 (십진수로 9848) 넣어서 통과시키니

1000 자리 9, 100자리 8, 10자리 4, 1자리 8이 나왔다. 

한번에 성공해서 다행이다.
한개라도 실수했으면 찾는데도 시간 꽤 걸려서 아예 프로젝트 자체를 포기했을지도 모른다.
Posted by 노라스
,