VHDL 마스터하기: FPGA 및 ASIC 설계를 위한 종합 입문서
튜토리얼 - VHDL 소개
VHDL은 끔찍한 약어입니다. VHSIC Hardware Description Language를 의미합니다. 약어 안에 또 다른 약어가 있는 셈이죠! VHSIC는 Very High Speed Integrated Circuit을 뜻합니다. 따라서 VHDL을 풀면 Very High Speed Integrated Circuit Hardware Description Language가 됩니다. 꽤 긴 이름이네요. VHDL은 교육과 비즈니스에서 FPGA와 ASIC을 설계하는 데 사용되는 두 가지 언어 중 하나입니다. 이 매혹적인 회로들에 익숙하지 않다면 먼저 FPGA와 ASIC 소개를 참고하는 것이 좋습니다. VHDL과 Verilog는 디지털 설계자가 회로를 설명하는 데 사용하는 두 언어이며, C나 Java 같은 전통적인 소프트웨어 언어와는 설계 철학이 다릅니다.
아래 예제에서는 앤드 게이트(And Gate)를 설명하는 VHDL 파일을 생성해 보겠습니다. 복습하자면, 간단한 앤드 게이트는 두 개의 입력과 하나의 출력을 가집니다. 출력은 두 입력이 모두 1일 때만 1이 됩니다. 아래는 VHDL로 설명할 앤드 게이트의 그림입니다.
앤드 게이트
시작해 볼까요! VHDL의 기본 단위는 시그널(signal)이라고 불립니다. 현재로서는 시그널이 0 또는 1이 될 수 있다고 가정하겠습니다(실제로는 다른 가능성도 있지만 나중에 다루겠습니다). 기본적인 VHDL 로직은 다음과 같습니다:
signal and_gate : std_logic; and_gate <= input_1 and input_2;
첫 번째 줄은 std_logic 타입의 and_gate라는 시그널을 정의합니다. Std_logic은 시그널을 정의하는 데 가장 흔히 사용되는 타입이지만, 나중에 배우게 될 다른 타입들도 있습니다. 이 코드는 단일 출력(and_gate)과 두 개의 입력(input_1, input_2)을 가진 앤드 게이트를 생성합니다. "and" 키워드는 VHDL에서 예약어입니다. "<=" 연산자는 대입 연산자(assignment operator)로 불립니다. 위 코드를 말로 풀면 "시그널 and_gate는 input_1과 input_2를 앤드 연산한 값을 얻는다(GETS)"라고 읽을 수 있습니다.
이제 input_1과 input_2가 어디서 오는지 궁금할 수 있습니다. 이름에서 알 수 있듯이 이들은 이 파일의 입력이므로, 도구에 이를 알려줘야 합니다. 파일의 입출력은 엔티티(entity)에서 정의합니다. 엔티티는 파일의 모든 입출력을 정의하는 포트(port)를 포함합니다. 간단한 엔티티를 만들어 보겠습니다:
entity example_and is port ( input_1 : in std_logic; input_2 : in std_logic; and_result : out std_logic ); end example_and;
이것이 기본 엔티티입니다. example_and라는 엔티티와 3개의 시그널(입력 2개, 출력 1개)을 정의하며, 모두 std_logic 타입입니다. 이를 완성하기 위해 필요한 또 다른 VHDL 키워드는 아키텍처(architecture)입니다. 아키텍처는 특정 엔티티의 기능을 설명하는 데 사용됩니다. 논문으로 비유하자면 엔티티는 목차이고 아키텍처는 본문 내용입니다. 이 엔티티를 위한 아키텍처를 만들어 보겠습니다:
architecture rtl of example_and is signal and_gate : std_logic; begin and_gate <= input_1 and input_2; and_result <= and_gate; end rtl;
위 코드는 example_and 엔티티의 rtl이라는 아키텍처를 정의합니다. 아키텍처에서 사용되는 모든 시그널은 "is"와 "begin" 키워드 사이에 정의해야 합니다. 실제 아키텍처 로직은 "begin"과 "end" 키워드 사이에 옵니다. 파일 작성이 거의 끝났습니다. 마지막으로 도구에 사용할 라이브러리를 알려줘야 합니다. 라이브러리는 파일에서 특정 키워드가 어떻게 동작하는지 정의합니다. 지금은 그냥 파일의 맨 위에 다음 두 줄이 필요하다고만 알고 계세요:
library ieee; use ieee.std_logic_1164.all;
축하합니다! 첫 번째 VHDL 파일을 만드셨습니다. 완성된 파일은 다음과 같습니다:
library ieee; use ieee.std_logic_1164.all; entity example_and is port ( input_1 : in std_logic; input_2 : in std_logic; and_result : out std_logic ); end example_and; architecture rtl of example_and is signal and_gate : std_logic; begin and_gate <= input_1 and input_2; and_result <= and_gate; end rtl;
단순한 앤드 게이트 하나를 만들기 위해 꽤 많은 코드를 작성한 것 같지 않나요? 첫째, 앤드 게이트는 멍청하지 않습니다. 둘째, 맞습니다. VHDL은 매우 장황한(verbose) 언어입니다. 소프트웨어에서는 아주 쉽게 할 수 있는 일이 HDL(Verilog나 VHDL)에서는 훨씬 더 오래 걸린다는 사실에 익숙해지세요. 하지만 소프트웨어 개발자에게 콘웨이의 라이프 게임을 표시하는 VGA 모니터용 이미지를 생성해 보라고 하면 그들의 머리가 놀라움에 빙글빙글 돌 겁니다! 참고로 그 비디오는 VHDL과 FPGA로 만들어졌습니다. 여러분도 곧 할 수 있게 될 겁니다!
다음으로 VHDL의 또 다른 기본 키워드인 프로세스(process)에 대해 논의하겠습니다.