while(1) work();
반응형
본 게시글은 KUEE 정보공개 프로젝트에 포함된 글입니다.
https://blog.youhogeon.com/65

본 자료의 저작권은 모두 저에게 있으며
학업에 참고 자료로만 사용하시길 바랍니다.
부득이하게 인용해야 하는 경우 반드시 출처(KUEE 정보공개 프로젝트)와 링크를 남겨주시길 바랍니다.

3.pdf
1.25MB
src.zip
0.00MB

LAB 03 VLSI 설계 및 실험보고서 # 22bit Carry Select Adder 1. 개요 Full adder는 a, b, c_in을 입력으로 받은 뒤 이 세 값을 더해 sum(합)과 c_out(자리올림)으로 출력하는 회로이다. 1bit full adder의 회로는 왼쪽 사진과 같으며 진리표는 아래 표와 같다. 이러한 1bit full adder를 여러개 이으면 우측 사진과 같이 ripple carry adder를 만들 수 있다. 본 실험에서는 gate level로 구현한 1bit full adder를 22개 사용해 22bit full adder를 구현한다. a b c_in sum c_out 0 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1 2. Timing Diagram 구현한 22bit ripple carry adder의 동작을 테스트하기 위해 테스트벤치 코드를 이용해 파형을 확인하였다. 사전에 만들어진(주어진) 총 100개의 vector data를 이용해 정상 동작 여부를 확인한 결과 모든 vector data에 대해 mat_sum과 sum_rca 파형이 일치하였다. 따라서 정확한 출력이 나옴을 확인할 수 있었다. 다만 입출력단에 연결된 flipflop들에 의해 sum_rca의 경우 클럭 반주기만큼 늦게 출력이 나왔다. 3. Synthesize result 합성 후, 22bit full adder의 block diagram은 첫 번째 사진과 같았다. 첫 번째 사진에서 RCA22 모듈을 확대해 나타낸 것이 가운데 사진이며, 마지막 사진은 1bit full adder의 회로이다. 이 때 회로의 critical path는 붉은색 선으로 표시하였다. 전체적으로 보면 a_q_reg의 LSB로부터 RCA22모듈을 지나 sum_reg의 MSB로 나오는 path가 critical path임을 확인할 수 있었다. 또한 RCA22모듈 내에서는 22개의 full adder를 지나는 path가 critical path임이 확인되었는데, 이는 뒤의 full adder가 앞의 1bit full adder로부터 c_out 신호를 입력(c_in)으로 받아야 정상적으로 연산이 수행될 수 있기 때문이다. 각각의 full adder를 확대해보면 c_in으로 들어와서 c_out으로 나가는 path가 critical path에 포함됨을 알 수 있었다. 4. Timing Report 클럭 주기를 10ns로 설정하였을 때 timing report는 위와 같았다. 이 때 slack state가 MET 이므로 클럭 주기를 점차 낮추어가며 회로가 동작할 수 있는 가장 빠른 클럭을 찾아보았다. 각 클럭에 대한 slack값과 state는 아래와 같았다. 클럭 주기(ns) Data required time(ns) Slack State 10 9.51 0.01 MET 8 7.51 0.77 MET 7 6.51 0.05 MET 6 5.52 0.00 MET 5 4.52 -0.64 VIOLATED 5.6 5.12 -0.01 VIOLATED 5.8 5.32 0.00 MET 5.7 5.22 0.00 MET 따라서 본 회로가 동작할 수 있는 가장 낮은 클럭 주기는 5.7ns이고, 약 175.4Mhz의 클럭에서 가장 빠르게 작동할 수 있다는 것을 알 수 있었다. 이 때의 timing report는 아래와 같았다. [3. Synthesize result]에서 분석한 바와 같이 입력의 LSB 부근에서 출력의 MSB로의 path가 critical path임을 확인할 수 있다. 5. Area Report 클럭 주기를 10ns로 설정하였을 때 area report는 좌측 사진과 같았다. 또한 [4. Timing Report]에서 찾은 가장 짧은 클럭 주기인 5.7ns에서의 area report는 우측 사진과 같았다. 회로의 동작 속도를 높이기 위해서는 트렌지스터의 너비(W)를 늘려 더 많은 전류가 흐르도록 해야하기 때문에 클럭 주기를 낮추자 total cell area가 증가(약 9.80%)하였음을 알 수 있었다. [4. Timing Report]에서와 마찬가지로 클럭 주기를 클럭 주기를 점차 낮추어가며 area report를 확인한 결과는 아래 표와 같았다. 여기에서도 마찬가지로 클럭 주기를 낮출수록 total cell area가 점차 증가함을 확인할 수 있었다. 클럭 주기(ns) Total cell area(µm²) 10 20055.884766 8 20818.595703 7 21254.951172 6 21847.472656 5.7 22021.656250 6. Power Report 클럭 주기를 10ns로 설정하였을 때 power report는 좌측 사진과 같았다. 또한 [4. Timing Report]에서 찾은 가장 짧은 클럭 주기인 5.7ns에서의 power report는 우측 사진과 같았다. 회로에 더 많은 전류가 흘러야 회로의 동작 속도가 증가하기 때문에 클럭 주기가 낮아지면 더 많은 전력을 소모(약 88.2%)하는 것을 알 수 있었다. [4. Timing Report]에서와 마찬가지로 클럭 주기를 클럭 주기를 점차 낮추어가며 report report를 확인한 결과는 아래 표와 같았다. 여기에서도 마찬가지로 클럭 주기를 낮출수록 Total Dynamic Power가 점차 증가함을 확인할 수 있었다. 클럭 주기(ns) Total Dynamic Power(mW) 10 2.4961 8 3.0719 7 3.5093 6 4.4040 5.7 4.6980 # 22bit Square Root Carry Select Adder 1. 개요 Ripple Carry Adder에서 뒤의 Full Adder들이 앞의 Full Adder의 연산을 기다림으로 인해 carry propagation delay가 발생한다. 이를 없애기 위해 carry가 0인 경우와 1인 경우를 각각 계산해둔 다음 앞의 full adder의 연산이 끝나면 carry값을 이용해 적절한 계산 결과를 채택하는 로직으로 adder를 구현할 수 있다. 이러한 회로를 Carry Select Adder라고 부른다. 22bit adder를 ripple carry adder로 구현하면 총 22번의 carry propagation delay가 발생하는데 비해, 2bit adder와 다섯 쌍의(열 개의) 4bit adder를 이용한 carry select adder로 구현하게 되면 7번(2bit adder에서 두 번, 각각의 MUX에서 한 번)의 carry propagation delay만 발생한다. 이러한 carry select adder에서 각각의 adder의 bit수를 다르게 하면 MUX를 통해 발생하는 carry propagation delay를 최소화 시킬 수 있는데, 이러한 adder를 Square Root Carry Select Adder라고 부른다. Square root carry select adder에서 뒤의 adder는 앞의 adder에 비해 하나의 bit을 더 연산해야하는데, 이는 앞의 MUX에서 발생하는 carry propagation delay 동안 수행되어 사실상 carry propagation delay가 상쇄되는 효과를 가진다. 2. Timing Diagram 구현한 22bit square root carry select adder의 동작을 테스트하기 위해 테스트벤치 코드를 이용해 파형을 확인하였다. 사전에 만들어진(주어진) 총 100개의 vector data를 이용해 정상 동작 여부를 확인한 결과 모든 vector data에 대해 mat_sum과 sum_sca 파형이 일치하였다. 따라서 정확한 출력이 나옴을 확인할 수 있었다. 다만 입출력단에 연결된 flipflop들에 의해 sum_sca의 경우 클럭 반주기만큼 늦게 출력이 나왔다. 3. Synthesize result 합성 후, 22bit square root carry select adder의 block diagram은 첫 번째 사진과 같았 다. 첫 번째 사진에서 SCA22 모듈을 확대해 나타낸 것이 가운데 사진이며, 마지막 사진은 6bit 2 to 1 MUX의 회로이다. 이 때 회로의 critical path는 붉은색 선으로 표시하였다. 전체적으로 보면 a_q_reg의 LSB로부터 SCA22모듈을 지나 sum_reg의 MSB로 나오는 path가 critical path임을 확인할 수 있었다. 또한 SCA22모듈 내에서는 초기 2개의 full adder와 다섯 개의 MUX를 지나는 path가 critical path임이 확인되었다. 각각의 MUX를 확대해보면 select bit(이전 MUX에 의해 선택된 carry값)으로 들어와서 출력으로 나가는 path가 critical path에 포함됨을 알 수 있었다. 4. Timing Report 클럭 주기를 10ns로 설정하였을 때 timing report는 위와 같았다. 이 때 slack state가 MET 이므로 클럭 주기를 점차 낮추어가며 회로가 동작할 수 있는 가장 빠른 클럭을 찾아보았다. 각 클럭에 대한 slack값과 state는 아래와 같았다. 클럭 주기(ns) Data required time(ns) Slack State 10 9.51 4.45 MET 8 7.51 2.45 MET 7 6.51 1.45 MET 6 5.51 0.45 MET 5 4.51 0.00 MET 4 3.52 0.00 MET 3 2.48 -0.18 VIOLATED 3.5 2.98 0.00 MET 3.3 2.78 0.00 MET 3.2 2.68 -0.06 VIOLATED 따라서 본 회로가 동작할 수 있는 가장 낮은 클럭 주기는 3.3ns이고, 약 303.0Mhz의 클럭에서 가장 빠르게 작동할 수 있다는 것을 알 수 있었다. 이 때의 timing report는 아래와 같았다. [3. Synthesize result]에서 분석한 바와 같이 입력의 LSB 부근에서 마지막 MUX에서의 출력으로의 path가 critical path임을 확인할 수 있다. 5. Area Report 클럭 주기를 10ns로 설정하였을 때 area report는 좌측 사진과 같았다. 또한 [4. Timing Report]에서 찾은 가장 짧은 클럭 주기인 3.3ns에서의 area report는 우측 사진과 같았다. 회로의 동작 속도를 높이기 위해서는 트렌지스터의 너비(W)를 늘려 더 많은 전류가 흐르도록 해야하기 때문에 클럭 주기를 낮추자 total cell area가 증가(약 11.5%)하였음을 알 수 있었다. 6. Power Report 클럭 주기를 10ns로 설정하였을 때 power report는 좌측 사진과 같았다. 또한 [4. Timing Report]에서 찾은 가장 짧은 클럭 주기인 3.3ns에서의 power report는 우측 사진과 같았다. 회로에 더 많은 전류가 흘러야 회로의 동작 속도가 증가하기 때문에 클럭 주기가 낮아지면 더 많은 전력을 소모(약 225%)하는 것을 알 수 있었다. # 결론 Ripple carry adder는 carry propagation delay로 인해 회로의 동작 속도가 square root carry select adder에 비해 느리다. 하지만 회로의 면적이나 사용전력면에서는 full adder의 개수가 적고 MUX가 존재하지 않는 ripple carry adder가 유리하다. 또한 각 회로의 클럭 주기를 낮출수록(클럭을 높일수록) 트렌지스터의 너비(W)를 늘려 더 많은 전류가 흐르도록 해야하기 때문에 회로의 면적은 커졌고 사용전력도 늘어남을 확인할 수 있었다.

반응형
profile

while(1) work();

@유호건

❤️댓글은 언제나 힘이 됩니다❤️ 궁금한 점이나 잘못된 내용이 있다면 댓글로 남겨주세요.

검색 태그