Combinational Logic
현재 입력에 의해서만 출력이 결정되는 회로를 Combinational logic (조합 회로)라고 합니다. 여기에는 덧셈, 곱셈과 같은 산술 연산에서부터 여러 데이터 중 하나를 선택하는 멀티플렉서, 이외에도 비교기, 디코더, 인코더, 디멀티플렉서와 같이 디지털 시스템에서 매우 많이 쓰이는 회로들이 포함됩니다.
디지털 시스템은 크게 보면 계산하고 저장하고 계산하고 저장하고의 반복입니다. 그래서 디지털 시스템은 조합 회로와 저장 소자가 전부라고 해도 과언이 아니죠. 보통 처음 디지털 시스템을 배울 때는 계산하는 회로, 즉 조합 회로를 먼저 배우고 그다음에 플립 플랍이나 SRAM 같은 저장 소자를 배웁니다.
그런데 아쉽지만, 모든 종류의 조합 회로를 배우기는 어렵습니다. 세상에는 정말 수많은 종류의 회로들이 있는데 그 모든 회로들을 정리할 수는 없거든요. 또한 배운 회로가 정답이라는 보장도 없습니다. 예를 들어 timing critical path에 있는 adder는 더 많은 게이트를 사용해 timing에 최적화된 로직을 사용하고, 그렇지 않은 경우 area를 줄인 로직을 사용합니다. 때문에 책이나 인터넷 등에서 배운 회로와는 많이 다를 수 있습니다. 상황에 따라 다른 회로가 사용되기 때문이죠. 물론 RTL 엔지니어가 게이트 레벨 회로를 직접 설계하지는 않고요, logic synthesis 툴이 해주니까 크게 걱정하지 않으셔도 됩니다.
사실 Verilog 같은 HDL 언어를 사용해서 RTL 레벨에서 설계한다면 게이트 레벨의 회로를 몰라도 구현이 가능합니다. adder 회로를 배우든 말든 verilog 코드에서는 그냥 코드에 a+b라고 적어주면 됩니다. 이런 코드를 실제 회로로 구현하는 건 logic synthesis 툴이 해줄 일이죠.
그럼에도 내가 설계하는 회로가 게이트 레벨에서 대충 어떻게 만들어지겠다는 감은 중요합니다. 똑같은 기능을 구현하더라도 게이트 레벨의 회로가 어떻게 구성되는지를 아는 것과 모르는 것은 결과물의 차이를 보이거든요. 예를 들어 절댓값을 구하는 로직을 구현한다고 했을 때, 어떤 사람은 입력이 0보다 작은지를 비교한 뒤 0보다 작으면 입력에 -1을 곱해서 절댓값으로 만들 수 있습니다. 그러나 게이트 레벨 회로의 이해도가 높고 기초가 튼튼한 사람은 입력값의 sign bit과 magnitude을 xor 한 뒤 sign bit을 더해서 절댓값으로 만들 수도 있죠.
조합 회로에 대한 설명은 워낙 많이 있기 때문에 따로 그림을 그려가며 설명드리지는 않겠습니다. (사실 귀찮습니다 ^^) 책 참고하시면 좋을 것 같고요, 아래 사이트 참고하셔도 좋을 것 같아요. 단시간에 완성한다기보다는 설계를 해가면서 꾸준하게 공부하고 고민해야 할 주제인 것 같습니다.
https://www.chipverify.com/digital-fundamentals/combinational-logic
Leave a comment