시작할 마음이 생겼습니까? 이제 본격적으로 VHDL로 들어가겠습니다.

VHDL의 역사적인 배경을 잠깐 살펴보겠습니다.  그냥 한 번 가볍게 일어 주세요.

□ VHDL의 출현 배경 및 변화 과정

미국 정부의 VHSIC Program의 주요 목적은 설계, 공정 및 제조 기술 분야에 있어서 미국의 기술 수준을 향상시키는 데 있었다. 또한 미국 정부는 이 Program의 일부로써 VHDL의 개발 노력을 지원하고 있었다.  그  지원 목적은 VHDL의 개발로 좀더 빠른 생산과 회사들간의 연락 기능 강화 및 개발 과정을 능률적으로 처리함으로써 비용 절감 효과를 제공하는 것이었다. 이러한 목적들을 효과적으로 달성할 수 있는 방법을 논의하기 위하여 메사추세츠의 Woods Hole에서 개최된 학술 대회를 시발점으로 1981년부터 VHDL이 개발되기 시작하였다.

Technology independent(기술 독립적)하며 표준 하드웨어 기술 언어의 개발을 목표로 한 Woods Hole 학술 대회에서 정부의 공식적인 제안 요구서를 위한 초안이 제출되었으며, 이것은 전자 공학 분야에 종사하는 전문가들에 의해서 검토되는 과정을 거쳐 1983년 초에 수정, 확정되었다.

1980년대 중반 이후부터 VHDL이 문서용이 아닌 Simulation용으로 검증되어져야 한다는 여론이 강해지면서 몇몇 VHDL Simulator가 등장하였으나 업체간에 표준화가 이루어지지 않은 관계로 호환성에 문제가 있었다. 이러한 문제를 해결하고 늘어가는 VHDL관련 CAD Tool 회사간의 표준 및 호환성을 위하여 IEEE에서 1987년에 IEEE-1076이라는 표준을 만들어 공포하였다.

이 시점에서  Synthesis(회로합성)는 아직 등장하지 않았으며  VHDL은 Simulation용으로 사용되었다.  1990년대에 들어서면서 VHDL 관련 Software 회사가 많이 등장하고 simulation뿐만 아니라 Synthesis의 기능을 갖춘 CAD Tool이 등장하면서 진정한 VHDL의 표준화가 요구되었고 1991년 IEEE-1164이 발표되면서 업체에서 공통으로 사용할 수 있는 VHDL이 탄생하였다.

1. VHDL 이란 ?

VHDL ( VHSIC ( Very High Speed Integrated Circuits) Hardware Description Language) 은 상위의 동작 레벨에서부터 하위의 게이트 레벨까지 하드웨어를 기술하고 설계하도록 하는 CAD업계 및 IEEE 표준언어이며 미국 정부가 지원을 공인한 하드웨어 설계 언어이다.

VHDL의 등장은 갈수록 복잡해지고 고집적화 되는 회로에 비례하여 어려워지는 하드웨어 설계환경에 새로운 장을 여는 계기가 되었다.  컴퓨터 기술의 발달과 함께 VHDL을 이용한 설계 기법의 발달은 비단 이 분야에 전공하는 사람뿐만 아니라 초보자에게도 보다 쉽게 회로를 설계할 수 있는 기회를 제공하고 있다.

현재 VHDL은 세계적으로 사용되고 있으며 산업체, 대학, 연구소 등에서 그 관심이 급격히 증가하고 있다.

2. ASIC 이란

많은 사람들이 알고 있는 말 중에 하나인 ASIC이란  Application Specific IC의 약자로 우리말로 옮기게 되면 특정용도 주문형 반도체이다.  이 ASIC이란 광범위하게는 특정용도 목적으로 사용되는 모든  반도체를 가리키기도 하지만 좁게는 특히 Gate Array를 가리키는 말이다.  우리가 흔히  ASIC이라 부르며 알고 있는 상식은 Gate Array, Embedded Array, Standard Cell (또는 Cell Based IC)세 종류를 가리키는 말로 알고 있다.

ASIC  - Programmable IC Type : PLA, SPLD, CPLD, FPGA

- Memory IC Type: MICOM, ASIC Memory, FIFO

- Logic Based IC Type: Gate Array, Embedded Array,

Standard Cell, Full-Custom IC.

하지만 ASIC이란 반도체 회사에 제품의뢰를 하는 Gate Array 종류만을 가리키는 것이 아닌 특정 용도나 주문형 IC모두를 다 포함하고 있다.  위에서 보는 바와 같이 ASIC의 두 가지 동류로서의 Full Custom(완전 설계 방식)과 Semi Custom(반주문형 설계 방식)이라는 말은 일본에서 인위적으로 만들어 낸 것이다.

물론 ASIC에 대하여 정확하게 정의된 것이 없는 관계로 어쩌면 Gate Array 종류를 진짜 ASIC으로 부는 것도 옳다고 할 수도 있다. 어쨌거나 일반적으로 반도체 설계를 할 수 있는 방식은 일반인들이 ASIC이라 부르고 있는 Logic Based IC Type형태의 Gate Array와 Standard Cell, 그리고 Programmable IC Type형태의 EPLD, FPGA가 대표적이다.

3. FPGA

FPGA란 Field Programmable Gate Array의 준말로 Array Based와 Row Based 두 가지 방법이 있으며 구조는 Gate Array와 매우 흡사하지만  Program에 의해 내부 회로 배선이 연결되는 형식을 취하고 있다.

FPGA는 Logic Cell 위주의 설계 방식이기 때문에  SPLD Block 내부의 배선이 외부와 직접 연결될 수 있도록 고안되어 있어 일반 Gate Array와 매우 비슷하며 Timing Simulation이 반드시 필요하다.

다른 Programmable Device에 비해 속도가 월등히 뛰어나고 집적도가 좋으며 부품 단가도 훨씬 저렴하지만 이 종류는 단 한번밖에 구울 수 없기 때문이 주로 연구 개발용보다는 제품 생산용으로 많이 사용된다.

FPGA는 대개 2,000-20,000 Gates 급의 회로에 적당하며 JEDEC을 이용하여 굽도록 되어 있는 일반  PLD 종류에 비해  Programming 하는  File이 제품을 만든 회사의 고유  Programming Netlist인 ADL, QDF, XNF 등을 사용하도록 되어있다. Array Based 형식의  FPGA는 SPLD Block들을 2차원 배열 형식으로 늘어뜨린 다음 중간에 Interconnect Channel이 서로 교차하며 연결될 수 있도록 되어 있다. 이  Array Based형식의 FPGA는 그림에서 보는 바와 같이 두가지 종류가 있다.  대체로 MUX와 AND로 이루어진 Combinational Logic과 하나의 Flip-Flop으로 구성되어 있는 형식의 SPLD Block구조가 일반적이며  MUX들을 일렬로 배열한 다음 중간 중간에 Flip-Flip을 끼워 넣는 형식의 Logic Array형 제품도 있다. 일반적인 내부구조는 Xilinx의  CLB, Cypress와 QuickLogic의

Logic Cell 등이 대표적인 이 형식을 취하고 있으며 Logic Array형의 내부 구조는 Altra의 LAB가 이러한 형식을 취하고 있다.

반면 Row Based FPGA의 내부 구조는  MUX 구조형식의  Combinational Logic이 각 행마다 나열되어 있고 중간 중간에  Flip-Flop이 끼워져 있는 형식을 취하고 있다. Array Based FPGA의  SPLD Block은 Logic Array 구조 형식이 가로가 아닌 세로로 된것과 비슷하다.  다만  Array Based FPGA와의 다른 점이라면  Logic Cell끼리 연결할 수 있는  Interconnect가 나열된 Cell의 아래나 위에만 위치하여야 된다는 것이다.  Actel이 이 Row Based FPGA의 대표적인 구조이다. □

-- 어느 인터넷 사이트에서(어딘지는 기억이 나지 않네요.)

많은 용어들이 나오죠. 나중에 용어별로 정리해 올리겠습니다. 그리고 저에게 툴 사용법을 질문하지는 마세요. 그리고 질문은 저에게보다는 모든 사람이 볼 수 있는 곳에 질문하세요.

그리고 저는 VHDL만 알고 있습니다. 혹시 verilog을 아시는 분은 verilog로 소스를 좀 올려주시면 감사하겠습니다. verilog 역시 하드웨어 표준 언어입니다.

제일 먼저 살펴보아야 할 것은 VHDL의 구조입니다. VHDL이 어떤 구조로 되어 있는지 밑에 있는 그림을 보면서 이해합시다.

영어로 되어 있으니 조금 복잡해 보이죠. 그러나 한정된 형식을 가지고 있으므로 그렇게 어렵지는 않습니다. 조금 하다보면 자연스럽게 이해가 될 것입니다. 처음부터 모든 것을 다 이해하려고 하지 마세요.

Configuration

Package

Package Body

Entity

Architecture

간단하게 표현하면 위의 5가지로 구성되어 있습니다.

지금 간단하게만 설명하고 될 수 있는 데로 예제를 중심으로 설명하는 방식을 사용하겠습니다.

library ieee;

use ieee.std_logic_1164.all;

entity mux21 is

port ( a, b    : in std_logic_vector(3 downto 0);

s    : in std_logic;

y    : out std_logic_vector(3 downto 0));

end mux21;

architecture rtl of mux21 is

begin

process(a, b, s)

begin

if ( s = '0') then

y <= a;

else

y <= b;

end if;

end process;

end rtl;

지난 시간 설명한 Mux21의 예제다.

여기서 진하게 마크된 것은 Reserved word(예약어)이다. 이는 VHDL 구문을 사용하면서 반듯이 지켜야 할 사항이다.

library ieee;

use ieee.std_logic_1164.all;

여기가 Package 부분이다. VHDL에서는 사용할 라이브러리는 LIBRARY 키워드를 이용하여 지정해 주는데 다음과 같다.

LIBRARY ieee;

실제로 이 라이브러리가 존재하는 디렉토리는 시뮬레이션 또는 합성툴의 환경 변수로 지정되어 있게 된다. Compass Tool의 경우 Manager 윈도우를 띄우면 라이브러리 패스 (library path)를 지정하는 것을 볼 수 있을 것이다. MaxPlus 에도 User Library를 지정하는 메뉴가 있고 V-System/VHDL 에도 역시 라이브러리 패스를 지정하는 메뉴가 있습니다. 대개 라이브러리 이름과 디렉토리 패스를 연결시키도록 되어 있는데, 라이브러리 명(library name)과 패스(directory path)를 매핑(mapping) 시킨다고 한다.

USE ieee.std_logic_1164.ALL;

이는 ieee라는 라이브러리에서 std_logic_1164 라는 이름의 패키지(package)를 가져다가 그 안에 있는 함수(function)들을 모두 사용한다는 뜻으로 ALL 이라고 한 것이다. ALL은 VHDL 의 키워드이다. 물론 ALL 대신 패키지 내에서 사용할 함수를 지정할 수도 있다.

사용툴의 Library 디렉토리에 가면 ieee.vhd 라는 파일이 있다. 이것을 직접 확인해 보는 것도 좋은 방법이다. 각각의 툴마다 조금씩 차이가 나는 것을 알  수  있을 것이다.

entity mux21 is

port ( a, b    : in std_logic_vector(3 downto 0);

s    : in std_logic;

y    : out std_logic_vector(3 downto 0));

end mux21;

시스템을 구성하는 부분품으로서 이들 사이의 상호 연결을 위한 통로 역할(interface)을 하는 것이 ENTITY이다. 말하자면 내부 설계에 대한 입출력 등을 기술하는 “포장”인 셈이다. 시스템의 입장에서 보면 내부 설계에 대한 것은 가려져 있고 다만 ENTITY에 기술된 입출력 포트만을 보게되는데 이런 의미에서 ENTITY를 “암흑상자”(Black Box)라고 하기도 한다.

위의 예제에서 보면 Entity name은 mux21이고 각종 포트에 대한 설명을 한다. 몇몇의 툴에서는 Entity name과 파일의 이름이 일치해야 하는 경우도 있으니 참조하기 바란다(Max Plus Ⅱ의 경우). 입력과 출력에 대한 포트의 설명이다. 포트 name은 Reserved word와 일치해서는 안 된다.(중요)

in, out 이라고 한 것이 입력과 출력의 표시이다. in은 입력을 나타내고 out은 출력을 나타낸다. 그 외에도 buffer 모드와 inout 모드가 있다. 다음에 예제를 통해 설명하겠지만 지금 간단히 설명하면 다음과 같다.  INOUT은 입출력 포트로 사용되므로 소스(source) 또는 목적지(destination)에 모두 쓸 수 있다. 그러나 한 개의 문장에 모두 쓸 수 없다. 입출력 모드가 정해진 경우 할당문(assign statement)에서의 엄격한 규정은 하드웨어를 다루기 때문이다. 하드웨어를 기술할 때 assign 이란 연결관계를 표현한 것(netlist)으로서 프로그래밍 언어에서와 같은 오퍼레이션(move operation)이 아니다. BUFFER는 INOUT과 같은 입출력 포트로서 assign의 소스(source)측 또는 목적지(destination)측에 쓸 수 있다. INOUT 모드와 다른 점은 단일 할당문 내에서 소스와 목적지측 모두 동시에 사용할 수 있다는 것이다. 이는 BUFFER 모드에 이미 F/F을 내포하고 있다는 의미를 갖는다.

1비트의 경우는 std_logic으로 표현하고, 다중 비트의 경우는 std_logic_vector(n downto 0)라고 표현한다.

std_logic_vector(0 to 3)

std_logic_vector(3 downto 0)

위의 두 가지 모두 MSB가 왼쪽에 있는 4비트를 표현한 것이다.

std_logic 이외에도 객체형(Object Types)이 있지만 뒤에 설명하는 것이 좋겠다.

한가지 양해를 구할 것이 있다. 설계를 하다보면 그 정식 용어를 써야 할 때가 많다. 그래서 되도록 원문을 사용하는 것이 좋다고 판단된다. 그래서 영어가 나와도 그대로 받아들이기를 원한다. 현 추세의 하드웨어 설계는 혼자서 하는 것이 아니다.  아직 Configure에 대한 설명은 하지 않았지만 Configure의 역할은 여러 사람의 설계를 조합할 때 사용하는 것이다. Pentium 설계에 투입된 인원이 600명 이상이라고 한다. 그만큼 현 추세는 복잡하고 세분화되어 있다. 뒷부분에서 Configure의 자세한 부분들 다루기로 하겠다. 지금은 예제가 간단하므로 Configure의 설정이 필요하지 않다.

architecture rtl of mux21 is

begin

process(a, b, s)

begin

if ( s = '0') then

y <= a;

else

y <= b;

end if;

end process;

end rtl;

다음은 architecture 부분이다.

아직 버그가 잡혔는지는 모르겠지만, Lodecap에서는 architecture name과 entity name이 같아야 하는 이상한 버그가 있었다. (지금은 해결되었을 것이라 판단된다.) architecture name과 entity name을 다르게 잡아주는 것이 좋다고 생각된다. architecture name과 entity name을 정할 때 그 파일이 어떤 파일인지 자기가 구별할 수 있도록 하는 습관은 좋은 습관이다. 모든 architecture에서는 Concurrent(동시에 수행)하게 동작된다. 모든 하드웨어 설계의 기본의 동작이 Concurrent하게 발생된다. Sequential(순차적으로)하게 표현하기 위해서 Process 문을 사용한다. Process 문안에서의 모든 동작은 순차적으로 발생된다. 하나의 Architecture 안에 다수의 Process 문을 사용할 수 있다. 그리고 적어도 하나 이상의 Entity와 Architecture 문을 구성할 수 있다.

다음에는 많은 예제를 가지고 VHDL의 표현에 대해서 예제를 중심으로 설명하겠습니다.

많은 예제를 가지고 그것을 시뮬레이션 하다보면 자연스럽게 VHDL의 문법을 익힐 수 있을 것입니다.