8051
AVR
EZLab
PIC
80C196KC
DSP
ARM
VHDL
마이크로마우스
로봇축구
Battle 로봇
로봇대회
휴먼로봇
Embeded Linux
HW/SW 강좌
RTOS
 
 
 

VHDL(VHSIC Hardware Description Language)......

1) 배경                                              (ALTERA사용설명서)   

VHDL은 80년대초 미 국방성(DoD; Department of Depense)의 요구에 따라 연구되기 시작하여 1987년 12월에 IEEE 1076 표준안으로 발표되어 1992년에 표준화 되었다. 미 국방성에서 하드웨어 기술 언어를 개발하고 표준화 해야 할 필요성을 느끼기 시작한 것은 무기 체제에 채용되는 전자장비의 개선과 유지보수 하는데 과도한 경비의 지출이 요구되었기 때문이다. 최신 무기체제의 개발은 보통 2-30년이 소요되며 개발도중 발전된 기술을 채용하기 위해서는 그 이상의 시간이 걸리는 것이 보통이었다. 결과적으로 새기술을 채용하고 유지하는데 드는 비용은 처음에 예상했던 것보다 상상외로 과도한것이 되어 버린다. 새기술을 비록 DoD에서 소유 하더라도 기존의 무기체제에 적용하기 위해서는 많은 어려움을 격게 되는것이 사실이었다. 만일 DoD에서 새롭게 개발된 기술을 기존의 무기체계에 도입하기로 결정 했다면 몇가지 고려할 사항이 필요해 진다. 기존의 무기에 새기술이 이용된 부품을 채택하려면 원래의 장비 제작자는 새부품에 맞도록 공정을 새로 구성해야 하며, 기존 부품의 수명 기간동안 예비 부품들을 유지하는데 필요한 경비의 부담을 안게 된다. 이러한 이중의 경비 부담은 부품들 사이에 하드웨어적인 표준이 이루어 지고 있지 않기 때문에 발생하는 것이다. 따라서 DoD는 하드웨어의 기술하는데 필요한 언어를 표준화 함으로서 서로다른 전자장치들을 서로 결합하는데 특별한 해석없이 이루어지도록 해야할 필요가 있었던 것이다.

오늘날 DoD에서 채택한 VHDL은 매우 범용적인 형식을 취하고 있는데, 하드웨어의 기술에 표준을 두도록 함으로써 특별한 설계 툴에 구애받지 않으며 최종 상품을 제작하는데 특정 제작자를 선정해야하는 제한이 필요 없도록 한 것이다.

VHDL의 표준화는 DoD의 고속 집적회로(VHSIC; Very High Speed Integrated Circuit) 프로그램의 산물이다. 이 프로그램 수행자들은 상당히 복잡한 전자회로에 대해서도 고도의 추상화를 통하여 개발을 수행할 수 있는 새로운 기법이 필요했던 것이다. 이러한 고도의 추상화의 필요성은 예전에 하나의 전체 시스템으로 여겨지던 것이 오늘날에는 단일의 집적회로 칩정도로 간주되어 버렸기 때문이다. 오늘날 새로운 시스템의 설계는 과거의 설계기법으로 적정한 기간내에 수행할 수 없을 정도로 매우 복잡하다. 이와 같이 시스템이 매우 복잡해지자 VHDL의 능력에 대한 설계자들로부터의 요구가 있다. 먼저 개념적인 시뮬레이션 단계에서부터 세부적인 타이밍적인 시뮬레이션이 이루어질 수 있는 매우 융통성있는 언어가 필요하다. 또한 이러한 언어는 고도의 추상화 레벨에서 그보다 낮은 설계 레벨로의 전환이 이루어지며 어떠한 디자인 레벨에서도 시뮬레이션이 수행될 수 있어야 할 것이다. VHDL은 이러한 탑-다운(Top-Down) 방식의 설계에 매우 적절한 언어이다.

VHDL은 매우 넓은 범위의 설계수준(Design Level)을 지원한다. 그 예로서 다음과 같은 승가산기(MAC; Multiply Accumulator)알고리즘을 생각해 보자. MAC은 DSP 프로세서에 널리 이용되는것으로 영상처리를 비롯한 디지탈 신호처리에 폭넓게 이용된다.

FOR i IN 1 TO 1024 LOOP

result := result + a(i)*b(i);

END LOOP

c <= result;

VHDL은 위와 같이 +, -, *, /와 같은 수학 연산자(mathmatical operator)를 이용한 매우 추상화된 수준과 배열 형태의 기술(array of modeling)을 지원하므로서 설계자로 하여금 복잡한 디지탈 회로를 구체적으로 설계하기 전에 새 아이디어를 매우 신속하게 디지털 회로 특성에 따라 모의실험(simulation)을 해낼 수 있도록 해준다.

탑-다운 설계 (Top-Down Design)

탑-다운 설계방식은 고도의 추상화된 수준에서 세부적인 디지탈 회로로 세분해 나가는것을 말한다. 높은 추상화 수준(high level of abstraction)에서의 모의실험은 개발 초기단계에서 이루어질 것이며, 이때 기능적인 면(function)에서 검증이 이루어 질 것이다. VHDL이 지원하는 넓은 범위의 모델링 스타일은 어떤 아이디어의 구현 가능성을 검증하는 단계에서도 이용될 수 있음을 보여준다. 위에서 예로든 승가산기를 예로서 탑-다운 방식의 설계과정에 대하여 살펴 보기로 한다. 맨처음 단계로 승가산기를 추상적으로 기술하여 그 기능의 적합성을 판별해 보도록 한다. 앞서 지적했듯이 승가산기(MAC; Multiply Accumulator)는 콘볼버(convolver), 퓨리어 변환(DFT), 행렬 곱셈등에 이용되는 매우 기본적이면서 응용분야가 매우 넓은 기능이라 할 수 있다. 승가산기는 가장 높은 수준에서 다음과 같이 기술될 수 있을 것이다.

c <= multiply_accum(a,b);

이때 승가산기의 기능이 응용분야에 적절하다고 판단되면, 다음의 낮은 단계로 설계해 내려간다. 이 단계에서는 아이디어의 단계에서 구현의 단계로 전환됨을 의미한다. 승가산기 기능의 데이타 플로우 기술(dataflow description)은 그림 1-2와 같다. 데이타 흐름의 형식(dataflow format)이 결정되면 다음 단계로 게이트 수준의 설계가 이어질 것이다. 게이트 수준으로의 전환 단계에서는 자동 혹은 수동의 신디시스(synthesis)가 이루어지며 그 결과로 얻어지는 게이트 수준의 회로는 실제 제작을 위한 것으로 때때로 제작기술 지향적인(Technology specific) 것이 될수도 있다. 게이트 수준의 회로는 그림 1-3과 같다.

2) VHDL의 장점

VHDL의 가장 큰 장점은 위에서와 같은 모든 수준에서의 기술이 가능하다는 점일 것이다. 이러한 장점은 곧 단일 언어를 사용한다는 것 뿐만 아니라 어떠한 설계단계에서도 단일의 모의실험기(simulator)를 사용하므로서 설계오류검증은 물론 수정등 관리적인 측면에서 매우 효율적이 될 것이다. 기존의 디지탈 회로 설계과정을 보면, C 언어와 같은 고급 언어로 알고리즘의 검증과 기능 수준에서의 모의 실험을 할 수 있었다. 그리고 고도로 숙련된 설계자일 경우에 게이트 수준으로의 설계단계 전환이 가능할 것이며 이미 이때부터 하드웨어의 기술및 표현방법은 물론 모의실험이 달라지게 되며 때때로 특정 기술에 의존하는 설계 방식이 되어 버린다. 낮은 수준에서 발견되는 기능적인 오류의 수정은 그보다 상위 수준에서 관리하기는 매우 어렵게 되며, 때때로 제작기술의 전환은 불가능 하거나 많은 인력과 시간이 소요되는 작업이 되어 버린다.

3) 용어의 정의와 표현

혼란을 피하고 능률적인 내용의 전개를 위하여 전반적으로 사용되는 용어들과 표현 방법에 대하여 집고 넘어 가기로 한다.

ㆍ기능적 모델(Behavioral Model) - 고도로 추상적으로 기술한 시뮬레이션용 모델이다. 이러한 모델의 경우 디지탈 회로의 구현에 대한 세부적 내용은 없다. 보통 수학적인 연산자들이 그대로 사용된다.

ㆍ데이타 플로우 모델(Dataflow Model) - 디지탈 회로의 자동 신디시스(automatic synthesis) 툴을 겨냥한 시뮬레이션용 모델이다. 보통 기본적인 프로시져 구조(procedure constructs)나, 함수적인 연산자(functional operator)들로 기술된다.

ㆍ구조적 모델(Structural Model) - 구성 장치들 사이의 네트 리스트(netlist)적인 표현이다.

ㆍ혼합 수준 모델(Mixed-Level Model) - 위에서 열거한 세가지 모델을 혼용하여 기술한 경우이다.

ㆍ병행 처리(Cuncurrent) - 기술된 구문들이 서로 병행처리(operate in parallel) 되거나 관계 신호의 변화에 반응(initiate by the signal value changes)하여 처리되는 것을 말한다.

ㆍ순차 처리(Sequential) - 구문들이 서술된 순서에 따라 처리되는 것을 말한다. 이 경우 대부분의 프로그램밍 언어들과 같은 이치이나 특히 VHDL과 같은 하드웨어의 기술에서는 순차처리의 실행순서는 매우 중요하다.

ㆍ구동기(Drivers) - VHDL의 신호들은 구동기에 결합되어 있으며 이에 의하여 제어된다. 새로운 신호들은 모두 구동기를 통하여 전파된다.

ㆍ사건(Events) - 사건은 연결된 신호선의 값의 변화일때 발생한다.

ㆍ처리(Transaction) - 신호선에 값이 주어질때마다 처리가 이루어진다고 한다. 이때 값은 변화되었거나 또는 같은 값일 수 있다. 즉, 사건이 될 수 있거나 아닐 수도 있다.

ㆍ감응 리스트(Sensitivity List) - 사건에 따라 반응하게될 신호선들의 묶음이다.

 

VHDL강좌 및 요점 정리

◈ VHDL이란 : Very high speed integrated circuit Hardware Description Language의 약자로서 상위의 동작 레벨에서부터 하위의 게이트 레벨까지 하드 웨어를 기술하고 설계 하도록 하는 CAD 업계 및 IEEE 표준언어이며 미국 정부가 지원을 공인한 하드웨어 설 계 언어.

◈ VHDL의 특징

- VHDL은 IEEE에 의해 공인되어 하드웨어 개발과 문서화에 표준언어로 사용된다.

- 광범위한 기술 능력으로 시스템 레벨에서 게이트 레벨까지 하드웨어 회로 표현이 가능 하다.

◈ VHDL 규칙과 표현

1. VHDL의 규칙

- VHDL은 다른 언어와는 달리 대소문자의 구분을 요구하지 않는다.

- 파일명은 반드시 공백을 가지지 않는 문자열이어야 한다.

- VHDL에서 문장간의 구별은 여느 프로그램 언어와 같이 세미콜론( ; )으로 표시한다. - 주석은 "--"로 표시하며 이는 VHDL의 수행에는 영향을 미치지 않으므로 프로그램에 대한 설명 등의 문서화를 위해서 사용할 수 있다.

- 주석 부호가 있는 부분부터 그 줄 끝까 지 주석문으로 간주한다.

2. VHDL의 기본 구성과 표현

VHDL의 기본 구성으로써 여러 가지 종류의 Design Unit이 있다. 그중 가장 기본이 되는 최소한의 단위로써 Entity Declaration과 Architecture Body가 있다.

ㆍ객체(Object)와 자료형(Data Type) 및 연산자(Operator)

ㆍ동작적 표현(Behavioral Description)과 구조적 표현(Structural Description)

ㆍ순차 처리문과 병행 처리문

Entity 선언과 Architecture Body 선언

1. Entity 선언부는 사용자가 설계하고자 하는 시스템의 외적 연결을 담당하는 부분이다. 회로의 내부적인 구조나 연결 등을 고려할 필요가 없으며 여기서 정의한 것을 통해 다 음의 Architecture Body에서 내부적 동작을 여러 가지 방법으로 표현할 수 있다. 다시말 해외부와의 통신을 위한 입출력 선을 정의하는 것을 Entity 선언이라고 한다. 간단히 2 입력 and 게이트 회로를 가지고 예를 들어 보겠다.

예) entity mylogic_2and is

port( in_a, in_b : in std_logic;

out_y : out std_logic );

end mylogic_2and;

여기서 entity의 이름을 설정하는 것에 유의하도록 하자. VHDL은 2and_mylogic이나 mylogic 2and와 같이 앞에 숫자를 먼저 표기할 수 없으며, 공백이 있어서는 안된다. 외 부와의 통신을 위한 입력 선으로 in_a와 in_b가 출력 선으로 out_y가 선언되었다. 예에 나타낸 port와 std_logic에 대해서는 뒤에서 설명하겠다.

2. Architecture Body는 사용자가 설계하고자 하는 시스템 내부의 동작을 세부적으로 정 의 하는 부분이다.

예) architecture sample of mylogic_2and is

begin

out_y <= in_a and in_b;

end sample;

여기서 sample이란 architecture의 이름이다. 이것은 정해진 것이 아니라 임의대로 바꾸어 도 된다. architecture의 시작과 끝은 begin과 end이다. entity declaration에서도 begin을 사용하지만 드문 일이다. 예에서처럼 2 입력 and 게이트 회로에 대한 내부 동작은 표현이 간단하다. 이정도의 간단한 표현이라면 초보자들도 두려움을 가지기 힘들 것이다.

객체(Object)와 자료형(Data Type) 및 연산자(Operator)

1. 객체(Object)란 VHDL에서 값을 가질 수 있는 것을 말한다. 객체를 선언함에 있어 객체 가 어떠한 형태, 즉 자료형을 사용할 것인가를 결정해야 한다.

① 객체의 종류

ⅰ) Signal

VHDL 합성시에 Wire로 구현이 되며, 각 Component의 연결에 사용되는 외적 변 수이다. Signal 형태의 객체에 값을 대입하기 위해서는 예에서와 같이 '<='를 사 용한다.

외부 연결 신호의 선언에는 Signal로 선언하는 방법과 Port로 선언하는 방법이 있 다. Port와 Signal 선언에서의 또다른 차이는 입출력의 구분, 즉 Mode에 대한 정 의 여부이다.

◈ Port로 선언하는 방법

선언위치는 Entity 내부이다. Entity에 대한 설명은 앞장을 참고 하기 바란다.

예) port ( a, b : in std_logic;

c : out std_logic );

▶ Signal로 선언하는 방법

Signal의 선언위치는 architecture와 architecture의 시작을 나타내는 begin 사이이다.

예) architecture sample of logic is

signal a, b : std_logic;

signal temp : std_logic_vector(3 downto 0) := "1100"; -- 초기값을 대 입할 때는 기호 ':='를 사용한다.

begin

Signal 사용시 주의할 점은 대입기호 '<='는 그 값이 즉시 대입되는 것이 아니다. Process문 내에서 값이 대입되는 시점은 Process문이 끝나는 End process를 만날 때 비 로써 그 값이 대입됨을 유의해야 한다. 즉 시간이 지남에 따라 변한 값을 가진다.

ⅱ) Variable

Variable은 process나 부프로그램, 즉 function과 procedure에서 사용되며 process 내부에 서만 유효한 내적 변수이다. Variable은 Signal과 같이 Wire로 구현되지 않으며 단지 중 간 연산단계에 주로 이용된다. Variable에 사용되는 대입기호는 ':='이다. 이 기호는 값이 즉시 입력된다. 선언방식은 Signal과 유사하다.

▶ Variable로 선언하는 방법

Variable의 선언위치는 process와 process의 시작을 나타내는 begin 사이이다.

예) process(a, b)

variable temp1, temp2 : std_logic;

begin

또한 Variable은 즉시 값이 대입되지만 process 문을 빠져 나오면 그 값을 상실해 버린 다. 따라서 값을 보존 하기 위해서는 process를 빠져 나오기 전에 그 값을 Signal에 대입 해야 한다.

ⅲ) Constant

Constant는 초기에 선언한 상수의 값을 유지하는데 사용하며, 선언된 초기값을 바꿀 수 없다. 대입기호 역시 Variable과 마찬가지로 ':='를 사용한다.

▶ Constant로 선언하는 방법

Constant의 선언위치는 loop, generate문, 부프로그램 또는 generic에서 선언된다.

예) architecture sample of logic is

constant delay : integer := 5ns;

begin

2. 자료형(Data Type)은 어떤 임의의 상태값이나 결과를 받아들이거나 입력값으로 처리 할 수 있는 형태를 말하며, 기능과 표현상의 분류할 수 있다. VHDL에서 객체는 거의 무한한 종류의 자료형을 사용할 수 있다. 또한 사용자가 직접 만들 수 있다.

배열형 (Array Type)

제한형 (Constraint Type)

TO, DOWNTO

무제한형

(Unconstraint Type)

BIT_VECTOR, STRING, STD_LOGIC_VECTOR

집합형 (Record Type)

RECORD

① 자료형의 종류

자료형의 종류로는 크게 기능과 표현상의 분류로 구분되다. 간단히 요약하면 다음과 같다.

ⅰ) 표현적 분류

◈ Predefinde Data Type (이미 정의된 VHDL)

◈ User-Definde Type (사용자 정의)

ⅱ) 기능적 분류

◈ Scalar Type(숫자형)

숫자형이라는 것은 0, 1, 2, 3 … 등의 숫자로 그 순서를 정의할 수 있는 자료형이 다. 이러한 숫자형은 또다시 세부적으로 나뉜다.

열거형 (Enumeration Type)

BIT, BOOLEAN, HARACTER, STD_LOGIC

정수형 (Integer Type)

INTEGER

실수형 (Floating Type)

REAL

물리형 (Physical Type)

UNIT : TIME, DISTANCE

◈ Composite Type(복합형)

혼합형은 이러한 숫자형을 재 조합하여 필요한 만큼만 사용할 수 있도록 선언할 경 우와 여러 가지를 혼합하여 사용하고 싶을 때 사용한다. 혼합형은 배열형과 집합형 으로 나뉜다.

배열형 (Array Type)

제한형 (Constraint Type)

TO, DOWNTO

무제한형(Unconstraint Type)

BIT_VECTOR, STRING, STD_LOGIC_VECTOR

집합형 (Record Type)

RECORD

◈ Access Type(연결형)

연결형은 일반 Computer 언어에서의 Linked List를 사용할 수 있도록 만들어진 Point 형식과 유사하다. 연결형을 사용할 때 정확한 표현이 아니면 전혀 다른 결과 를 출력하기 때문에 언어를 시작하는 초보자라면 되도록 사용을 피하는 것이 좋다. 또한 연결형은 시뮬레이션을 위한 용도 외에 하드웨어적으로 구현하는 것으로는 아 직까지 그 지원이 미흡하다.

연결형 (Access Type)

ACCESS, NEW


◈ File Type

File Type은 File 입출력에 관련된 Data Type으로써 외부와의 입출력이나 특정 File의 변수를 선택하여 사용한다. 또한 이 자료형은 VHDL의 회로 표현에 대한 검 증 단계, 즉 Simulation Debugging에서 많이 사용되며 특별한 회로동작의 입출력 을 제외하면 거의 사용하지 않는다. 그래서 Synthetic Code가 아니란 것을 유의하 자. 파일형은 연결형과 같이 초보자에게는 어려운 점이 있으니 유의하기 바란다.

파일형 (File Type)

FILE

② 선언 방법

자료형을 선언할 때는 Type ~ is라는 예약어를 사용한다. 여기서는 Std_logic_1164 Package에 선언된 내용을 예로 들었다.

ⅰ) 열거형 :: 문자열을 하나의 Data로 묶어서 선언하는 것이다.

예) Type bit is ('0', '1');

Type boolean is (true, false);

ⅱ) 정수형 :: 정수형의 범위는 아래와 같이 구격화되어 있다.

예) Type integer is range -2147483647 to 2147483647;

Type byte is range -127 to 127;

ⅲ) 실수형 :: 실수형의 범위 역시 아래와 같이 -1.0E38에서 1.0E38까지 규격화되어 있다. 실수형의 최대값과 최소값은 High와 Low라는 Attribute를 사용해서 나타낼 수도 있 다.

예) Type real is range -1.0E38 to +1.0E38;

ⅳ) 물리형 :: 물리형은 시간, 거리 전류 등의 물리적인 단위를 나타낸다. 사용자가 범위를 정의하지 않으면 기본 단위의 고정 범위는 정수형의 범위과 같은 -2147483647에서 2147483647까지 이다.

예) Type time is range -1.0E38 to +1.0E38;

unit ps;

ns = 1000ps;

us = 1000ns;

ms = 1000us;

sec = 1000ms;

min = 60sec;

end unit;

ⅴ) 집합형 :: 집합형은 다른 종류의 숫자형이나 배열형을 하나로 만들어 사용할 수 있는 것이다. 각각의 Field로 나뉘어져서 별개의 Data Type을 선언할 수 있다. Record Type 으로 선언된 객체의 요소 값을 참조하기 위해서 객체와 요소사이에 '.'을 사용한다.

예) Type information is

record value : bit;

context : integer;

end record;

variable kk : information;

kk.value := '1';

kk.context := 9;

ⅵ) 배열형 :: 같은 종류의 숫자형을 한군데 묶어서 사용할 수 있다. 선언 방법에 따라 두 가지로 나뉜다.

◈ 제한형 :: 이미 선언된 Type을 정해진 범위에서 열거하게 만든 것으로 일종의 BUS Type으로 만든 것이다. 여기서 to와 downto는 내림차순과 오름차순으로 정의하는 것이 다.

예) Type byte is array( 7 downto 0 ) of bit;

variable a : byte;

a := "01110000";

◈ 무제한형 :: 제한형과는 다르게 선언된 Type을 또 하나의 변형된 새로운 Type으로 다시 만드는 열거형이다.

예) Type bit_vector( natural range <> ) of bit;

Type string is array ( positive range <> ) of character;

ⅶ) 연결형 :: 연결형은 동작적 모델링이나 하드웨어/소프트웨어 혼합형을 모델링 할 때 동적 메모리 할당(Dynamic Memory Allocation)을 필요로 하는 경우에 유용하고, 자료구 조(Data Structure)의 크기를 미리 결정할 수 없는 경우에 사용한다. 예를 들어 큐(Que)나 스택(Stack) 구조에서 연결 리스트(Linked List)를 만들기 위해 사용한다. 연결형에는 3가 지로 구분할 수 있으나 2가지의 형식만 알고 넘어가자.

◈ 불완전 선언 :: Type 선언시 아무런 표현도 하지 않고 선언자만을 표시

예) Type CELL;

◈ 일반 선언 :: Type 선언시 아무런 표현도 하지 않고 선언자만을 표시

예) Type LINK is access CELL;

ⅷ) 파일형 :: 파일형은 VHDL 규격 패키지의 TEXTIO 부분에 선언되어 있기 때문에 활 용만 하면 된다. 이것 또한 형식만 알고 넘어가자.

예) Type TEXT is file of STRING;

file INPUT : TEXT is in "std_input";

file OUTPUT : TEXT is out "std_output";

우선순위

높다

낮다

논리 연산자(Local Operator)

or, and, nor, nand,

xor,xnor

관계연산자(Relational Operator)

=, /=, >, <, >=, <=

덧셈연산자(Adding Operator)

+, -, &

단항연산자(Unary Operator)

+, -

곱셈(Multiplying)

*, /, mod, rem

기타 연산자

**, abs, not

3. 연산자(Operator)는 아래 표에 간단히 요약했다. 연산자를 연속으로 사용할 경우 우선 순위에 따라 연산 순서가 결정된다. 괄호 안의 연산자는 우선한다. 특히 논리 연산자는 두 피연산자의 자료형이 같아야 하며 연산자의 우선 순위가 가장 낮으나 not는 논리 연 산자이지만 다른 연산자보다 우선 순위가 높다. and나 or 연산자는 결합법칙이 성립되나, 여러 논리연산자를 함께 사용할 경우나 nand 혹은 nor을 연속해서 사용할 경우 결합법 칙이 성립되지 않으므로 괄호를 사용하고 결합순서에 주의해야 한다.

동작적 표현(Behavioral Description)과 구조적 표현(Structural Desciption)

VHDL의 표현 방법은 설계의 의도와 용도에 따라 방법을 선택하거나 혼합해서 사용할 수 있다.

1. 동작적 표현은 자료흐름적 표현과 Process문에 의한 표현으로 나뉘어 진다.

① 자료흐름적 표현(Data Flow Description)

부울 대수식, RTL 혹은 연산자를 사용하여 입력과 출력사이의 관계를 나타내는 것을 말한다. 자료흐름적 표현은 주로 병행 처리문에서 사용되며, 문장의 순서에 무관하게 동 시에 수행된다.

예) architecture data_flow of compare_logic is

begin

equal <= not( a(1) xor b(1) ) and not( a(0) xor b(0) );

end data_flow;

② Process문에 의한 표현

자료흐름적 표현 방법보다 추상화된 개념이다. 회로의 기능적 표현을 기능적 혹은 알고 리즘적으로 기술하는 것이다. Process문은 하드웨어 시스템을 모듈별로 기술하는데 편리 하다. 시스템은 하드웨어 모듈로 구성되어 있고, 각 모듈은 병행처리를 하면서 서로간의 통신을 통해 관계를 유지한다. Architecture내에 여러 개의 Process문이 있을 수 있으며 각 Process문은 병행처리를 하지만, Process문 내부는 순차처리를 한다. 또한 Process문 은 감지신호의 변화를 통해 동작하며 이를 통해 서로 통신을 한다.

예) architecture sample of compare_logic is

begin

process(a, b) -- ( )안의 a, b를 감지신호라 한다.

begin

if a = b then

equal <= '1';

else

equal <= '0';

end if;

end process;

end sample;

2. 구조적 표현은 동작적 표현보다 하드웨어 구조에 가장 가까운 표현이라 할 수 있다. 하 드웨어 회로상에서 IC소자들을 서로 선으로 연결하여 시스템을 구성하듯이 이미 설계 된 Component를 이용하여, 그 Component들을 서로 연결하여 System을 기술하려는 방 식이다. 구조적 표현에는 Generate문과 Generic문이 있다.

① Component문

이미 설계한 Entity를 부품으로 간주하여 구조적으로 설계하는 문이다. 이를 사용하기 위해서는 Component를 선언해야 한다. 또한 Port map()이란 예약어를 사용하여 Component를 사례화 시켜야 한다.

예) entity nand_component is

port( in1, in2, in3, in4 : in std_logic;

out1, out2 : out std_logic );

end nand_component;

architecture sample of compare_logic is

component nand2 -- component nand2를 선언

port( a, b : in std_logic;

y : out std_logic );

end component;

begin

u1 : nand2 port map( in1, in2, out1);

-- nand2를 사례화, 위치결합 방식

u2 : nand2 port map( a=>in3, b=>in4, y=>out2 );

-- 이름결합 방식

end sample;

예의 port map에서 위치결합과 이름결합 방식이 있다. 위치결합은 component와 결합할 때, port signal이 나열된 위치순서대로 연결되며, 이름결합은 port signal이 나열된 위치와 상관없이 각각의 '형식이름' => '실제이름'으로 연결된다. 이름결합은 직접 이름으로 연 결되기 때문에 결합의 순서에 무관하다. 또한 component를 사용하기 위해서는 사용할 c omponent가 작업 디렉토리에 등록이 되어 있어야 한다.

② Generate문

Generate문은 Component를 반복적으로 사용하기 위해서 사용한다. Generate문은 단순 반 복생성을 위한 for-generate문과 주어진 조건에 따라 반복처리하는 if-generate문이 있다. 예를 들기 위해 긴 entity 이름을 사용했다. 사용자는 굳이 그럴 필요는 없다.

◈ for-generate문

예) entity nand_component_for_generate is

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

y : out std_logic_vector( 3 downto 0 ) );

end nand_component_generate;

architecture sample of nand_component_generate is

component nand2

port ( a, b : in std_logic;

y : out std_logic );

end component;

begin

g1 : for i in 3 downto 0 generate

ux : nand2 port map ( a(i), b(i), y(i) );

end generate g1;

end sample;

◈ if-generate문

예) entity xor_component_if_generate is

port ( a : in std_logic_vector( 4 downto 0 );

prity_check : out std_logic );

end nand_component_generate;

architecture sample of nand_component_generate is

signal y : std_logic_vector( 3 downto 0 );

component xor2

port ( a, b : in std_logic;

c : out std_logic );

end component;

begin

g1 : for i in 3 downto 0 generate

-- g1, g2, g3, u4, ux는 레이블이다.

g2 : if i =3 generate

u4 : xor2 port map ( a(i+1), a(i), y(i) );

end generate g2;

g3 : if i < 3 generate

ux : xor2 port map ( y(i+1), a(i), y(i) );

end generate g3;

end generate g1;

parity_check <= y(0);

end sample;


③ Generic문

Generic(일반화)이란 Entity 내에 기술하며 Generic의 매개변수를 Entity에 전달함으로써, 회로의 개수나 입출력의 크기가 매개변수에 의해 결정되게 하는 것을 말한다. Generic의 매개변수로 사용되는 객체는 상수이며, 모드는 in으로 되어 있기 때문에 반드시 명시할 필 요가 없다. 또한 이 매개변수는 사용용도에 따라 두 가지로 나뉜다. 반복생성의 개수를 위 한 매개상수와 입출력의 크기를 위한 매개상수이다.

Generic의 사용은 사용할 Component의 Entity에 먼저 선언을 하고 다음 Component를 사 용하는 Logic System에서 이를 이용한다.

◈ 반복생성의 개수를 위한 매개상수

예) --[ 사용될 Component ] --

entity nand_generic is

generic ( size : integer := 8 );

port ( x, y : in std_logic_vector( size-1 downto 0 );

z : out std_logic_vector ( size-1 downto 0 ) );

end nand_generic;

architecture sample of nand_generic is

begin

z <= x nand y;

end sample;

-- [ Generic으로 선언된 Component를 사용하는 Logic System ] --

entity nand_sys is

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

c : out std_logic_vector( 3 downto 0 ) );

end nand_sys;

architecture sample of nand_sys is

component nand_generic

generic( size : integer );

port ( x,y : in std_logic_vector( size-1 downto 0 );

z : out std_logic_vector( size-1 downto 0 ) );

end component;

begin

ux : nandg generic map(4) port map( a, b, c );

end sample;


◈ 입출력의 크기를 위한 매개상수

예) --[ 사용될 Component ] --

entity nandx_generic is

generic ( size : integer );

port ( x : in std_logic_vector( size-1 downto 0 );

z : out std_logic );

end nandx_generic;

architecture sample of nandx_generic is

begin

process( x )

variable temp : std_logic;

begin

temp := x(0);

for I in 1 to size-1 loop

temp := temp and x(i);

end loop;

z <= not (temp);

end process;

end sample;

-- [ Generic으로 선언된 Component를 사용하는 Logic System ] --

entity nand_sys is

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

b : out std_logic );

end nand_sys;

architecture sample of nand_sys is

component nandx_generic

generic ( size : integer );

port ( x : in std_logic_vector( size-1 downto 0 );

z : out std_logic );

end component;

begin

ux : nandx generic map(4) port map( a, b );

end sample;


순차 처리문과 병행 처리문

1. 순차 처리문은 Process문 내에서 기술되며 wait문, if문, case문for-loop문이 있다. 그러나 각각의 Process문은 병행처리한다고 말한 바있다. 이제 순차 처리문의 종류를 알 아보자.

① Process문

Process문은 다음과 같은 형식으로 사용한다. 레이블은 생략해도 되며, 감지신호 리스트 는 대개 Process내의 입력신호들로 구성되며, 이 감지신호의 변화가 생길 때 process문 이 수행된다. 또한 하나의 Entity내에 여러 개의 Architecture가 있을 수 있는 것처럼 Process문 또한 하나의 Architecture 내에 여러 개의 Process문을 사용할 수 있다.

[레이블 :] process [(감지신호 리스트)]

begin

순차처리문;

end process [레이블];

② If문

고급언어와 같이 조건이 참이면 수행되는 if (조건) then 형식이 있다. if문은 또한 사용방 법에 따라 다음과 같이 3가지의 동작을 할 수 있다.

◈ 일반적 if문

if문은 멀티 플랙서(Multiplexer, 이하 MUX로 표기)를 이용하여 등가적으로 표현할 수 있으며, if문의 하드웨어 구현에 대한 이해에 도움을 준다.

예) if ( sel = '1' ) then

y <= a;

else

y <= b;

end if;

◈ 다중 if문

다중 if문의 경우에도 같은 방식의 MUX 논리를 적용할 수 있다. 다중 if문은 여러 개의 조건을 갖는 경우이다.

예) if ( sel0 = '1' ) then

y <= a;

elsif ( sel1 = '1' ) then

y <= b;

else

y <= c;

end if;

◈ 기억소자가 내포된 if문

이것은 else문이 없는 if문이다. 여기서는 if문에서는 조건이 거짓일 경우 수행되어야 하는 else문이 없으므로, else에 해당되는 출력은 과거의 출력 값을 그대로 유지하게 된다. 따라 서 출력은 조건이 거짓일 때는 과거의 출력 값을 지녀야 하므로 VHDL 합성시에 기억소자 가 내포된다. 이러한 기억소자가 내포된 if문의 예가 Latch와 Flip/Flop이다. Latch와 Flip/Flop의 차이는 if의 조건이 Level Trigger에 의해 출력이 변화되면 Latch이고, if의 조 건이 신호의 상승 혹은 하강에 의해,즉 Rising Edge나 Falling Edge Trigger에 의해 출력 이 변화되면 Flip/Flop이다. VHDL에서 이들을 표현하기 위해 event라는 예약어를 사용 한다.

예) if clk'event and clk = '1' then -- Rising Edge에서 동작하는 Flip/Flop

q <= d;

end if;

if clk'event and clk = '0' then -- Falling Edge에서 동작하는 Flip/Flop

q <= d;

end if;

if en = '1' then -- Leve Trigger에 의해 동작하는 Latch

q <= d;

end if;

③ Case문

Case문은 수식 값에 따라 문장을 선택한다. Case문의 수식 값은 integer형, 열거형 등과 같 은 자료형이 주로 사용되며, 진리표와 같은 기능표에 대한 설계에 적합하다. Case문은 When의 값과 비교하여 일치하면 그 문장을 수행한다. When의 수식을 여러 값으로 표현 할 때는 '|'(또는)이라는 기호를 사용한다.

예) case sel is

when "00" => y <= d(0);

when "01" => y <= d(1);

when "02" => y <= d(2);

when others => y <= d(3);

end case;





④ Loop문

Loop문은 반복처리 하기 위한 것이다. Loop문은 For-Loop형식과 While-Loop형식 및 단 순 Loop형식이 있다. 형식은 다음과 같다.

◆ [ 레이블 ] : for 루프변수 in 변수범위 loop

순차 처리문; -- 변수 범위만큼 반복

end loop [ 레이블 ];

◆ [ 레이블 ] : while 조건 loop

순차 처리문; -- 조건이 참일 때까지 반복

end loop [ 레이블 ];

◆ [ 레이블 ] : loop

순차 처리문; -- 무한 반복

end loop [ 레이블 ];

◈ For-Loop형식

For-Loop문은 루프변수가 1씩 증가 또는 감소하면서, 최종값에 도달할 때까지 Loop문에 둘러싸인 순차 처리문을 반복처리한다. 루프변수는 어떠한 객체로도 선언되지 않아야 되며, 오직 For-Loop의 루프변수로만 사용되어야 한다.

예) entity and_logic is

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

y : out std_logic_vector( 3 downto 0 ) );

end and_logic;

architecture sample of and_logic is

begin

process( a, b )

begin

for I in 3 downto 0 loop

y(i) <= a(i) and b(i); -- 변수 i에 대해서 4번 반복

end loop;

end process;

end sample;

◈ While-Loop형식

While (조건) Loop문은 조건이 참이면 loop에 둘러싸인 순차 처리문을 반복수행한다. While-Loop문의 조건은 반복횟수가 명확히 결정되지 않으면, 논리합성을 할 수 없으므로 주의해야 한다.단순 Loop문은 무한히 반복하므로 Loop를 빠져 나오기 위해서 exit문이 필 요하며, While문의 경우와 같이 반복횟수가 정해지지 않을 경우에는 VHDL 논리합성이 될 수 없다. 대부분의 VHDL 합성기는 While-Loop문과 단순 Loop문을 지원하지 않는다.

2. 병행 처리문

하드웨어 회로에서는 입력선로에서 출력선로로 신호가 전달되어 처리될 때 순차처리되는 것이 아니라 병행처리된다. 따라서 하드웨어 구조를 기술하는VHDL의 문장은 병행처리에 기반을 두고 있다고 볼 수 있다. Architecture문 내부에 표현되는 모든 VHDL 문장은 Process문의 내부를 제외하고는 모두가 순서에 무관하는 병행 처리문이다. 이러한 병행 처 리문에는 조건적 병행처리문(When~Else)과 선택적 병행 처리문(With~Select)이 있다.

① 조건적 병행 처리문 :: 순차처리문인 if문과 유사하다.

signal_이름 <= 파형1 when (조건1) else

파형2 when (조건2) else

파형n-1 when (조건n-1) else

파형n;

예) entity logic is

port ( a, b, c, d : in std_logic;

y : out std_logic );

end logic;

architecture sample of logic is

begin

y <= '0' when d='0' else

'0' when c='1' else

'0' when ( a='1' ) and ( b='1' ) else

'1';

end sample;



② 선택적 병행 처리문 :: with이하의 수식값에 의해 판단하며, Case문과 유사하다.

with (수식) select

signal_이름 <= 파형1 when (선택값1),

파형2 when (선택값2),

파형n-1 when (선택값n-1) else

파형n when others;

예) entity logic is

port ( x : in std_logic_vector( 1 downto 0 );

y : out std_logic_vector( 3 downto 0 ) );

end logic;

architecture sample of logic is

begin

with x select

y <= "0001" when "00",

"0010" when "01",

"0100" when "10",

"1000" when others;

end sample;

 



  • 상호 : (주) 로보블럭 사업자등록번호:214-86-56219 통신판매업신고19-2544 대표: 신대섭 전화:(02)2679-8556 Fax :(02)2679-8557
    본사 : 경기도 부천시 원미구 약대동 부천 테크노파크 401동 502호     서울사무소 : 서울시 영등포구 문래동 4가 8-1 4층
    Copyright(C) 2004, (주) 로보블럭 시스템즈 All Rights Reserved E-Mail : WebMaster