Signal 과 Variable

국일호

goodkook@csvlsi.kyunghee.ac.kr
http://www.csvlsi.kyunghee.ac.kr


VHDL의 객체들로는 SIGNAL, VARIABLE, Constant,그리고 Loop 변수가 있다. SIGNAL, VARIABLE, CONSTANT는 선언형 객체인데 비해 Loop 변수는 VHDL의 FOR-LOOP와 같은 반복구문 내에서 선언하지 않고 사용한다. LOOP 변수에 대해서는 VHDL구문을 다룰 때 설명 하기로 한다. SIGNAL과 VARIABLE에 대하여 살펴보자. 이들 두 가지 객체를 단적으로 말하면 SIGNAL은 병렬구문(concurrent statement)에서 사용되며 VARIABLE은 순차구문(sequential statement)에서 사용되는 객체이다. 앞서 언급했듯이 VHDL을 포함한 HDL들은 병렬구문을 기본으로 하며 순차구문을 지원한다.

  1. VHDL의 병렬구문과 순차구문

    VHDL을 포함한 대부분 HDL은 병렬구문(concurrent statement)기본으로 하며 순차구문(sequential statement)을 지원한다. 이는 디지털 회로를 나눌 때 순차회로와 조합회로를 의미하는 것이 아님을 기억해 두어야 한다. HDL의 구문상 구분이다. 하드웨어를 기술(description hardware)하는 것은 모두 병렬구문이다. 이는 하드웨어의 표현에 있어서 연결선(wire)을 이용하여 AND, OR 게이트와 같은 회로 구성품(digital primitives)의 연결을 나타내는 것이기 때문이다. 이러한 병렬구문 내에 순차구문을 포함하게 되는데 이를 위하여 VHDL에서는 특별히 PROCESS 블록을 사용한다. 시뮬레이션시 각 구문이 실행될 때 1개의 PROCESS블럭은 병렬구문 1개와 동일하다. VHDL의 ARCHITECTURE BEGIN ~ END(ARCHITECTURE Body)의 모든 구문은 기본적으로 병렬구문이며 이 곳에 특별히 PROCESS BEGIN-END가 순차구문을 포함하게 된다. 그림1은 ARCHITECTURE내의 병렬구문과 PROCESS 블록의 병렬관계를 표시한 것이다.

    PROCESS 블록내의 순차구문이 1개의 병렬구문과 등가임을 보여주는 예는 다음과 같다.

    에 대하여,

    와 같이 PROCESS 블록 내에 표현된 My_signal에 대한 할당문은 병렬구문의,

    과 동일하다. 그러나 별렬구문으로서

    와 같은 할당은 3 과 1번째 비트에 디지털값 '0'과 '1'을 동시에 주고있는 에러이다. 말하자면 버스의 충돌인 치명적인 에러인 셈이다. 그러나 순차블럭 PROCESS BEGIN~END에서는 구문의 최종적인 값이 1개의 병렬구문으로 취급되기 때문에 문제되지 않는다.

  1. VHDL의 순차구문과 병렬구문의 실행

    프로그래밍 언어와 같이 순차구문만을 처리하는 경우 그 실행은 구문이 놓인 순서에 의한다. 그러나 HDL과 같이 병렬구문을 처리하는 경우 구문의 실행을 위해서는 시뮬레이션 클럭(simulation clock)과 이벤트 큐(event queue)와 같은 특별한 장치가 필요하다. 모든 실행은 구문의 순서가 아닌 시뮬레이션 클럭을 기준으로 진행되는 것 이다. 값의 할당, 신호의 변화 등은 모두 이벤트 큐에 저장되며 시뮬레이션 클럭의 진행은 큐에 저장된 모든 이벤트의 처리가 이루어진 후에 다음 처리로 시뮬레이션 클럭을 진행한다. 이때 진행되는 시뮬레이션 기본 클럭의 간격을 델타 시간(delta clock)이라 한다. 병렬구문과 순차구문을 모두 지원하는 경우 구문의 영역구분, 객체의 선언, 할당 등에 대한 방법이 따로 존재하게 된다.

    순차구문과 병렬구문이 실행되는 과정을 예를 들어보기로 하자. 다음과 같은 두 병렬구문,

    그리고 순차구문,

    에 대하여 실행 과정은 그림 2와 같다. 병렬구문에서는 현재 시뮬레이션 클럭에서 연산이 이루어 진후 다음의 델타에서 할당이 이루어진다(delayed assignment). 이에 반해 순차구문에서는 구문 순서에 따라 즉각적인 할당이 이루어 진다(instaneous assignment).

  1. SIGNAL과 VARIABLE

    SIGNAL은 병렬구문에서 사용될 객체의 선언이다. 따라서 SIGNAL은 ARCHITECTURE BEGIN~END에서 전역적(global)이다. 할당 연산자는 "<=" 이며 앞서 설명한 것과 같이 지연 할당(delta delayed concurrent assignment)이 이루어지고 'event와 같은 속성을 사용할 수 있다.
    VARIABLE은 순차구문 블록에서 사용될 객체의 선언이며 PROCESS BEGIN~END내에서 지역적(local)이다. 할당연산자는 ":=" 이며 구문의 순서에 의거하여 즉시 할당(instaneous sequential assignment)이 이루어진다.

    SIGNAL과 VARIABLE의 시뮬레이션 그리고 합성을 예를 들어 보도록 하겠다.

    [예제 1] SIGNAL로 선언된 객체가 순차구문 블록에서 할당된 경우의 예이다. IF (clk'event AND clk='1') THEN ~ END IF; 에 의해서 3단의 플립-플롭(Flip-Flop)이 된다. 시뮬레이션과 합성 결과는 그림 3과 같다.

    [예제 2] PROCESS BEGIN~END; 순차 블록내의 할당의 경우이지만 IF (clk'event AND clk='1') THEN ~ END IF; 안에서 할당이 아니면 플립-플롭이 아니다. 순차구문이 곧 순차 디지털 회로가 아닌 것 이다. 합성과 시뮬레이션 결과는 그림 4와 같다. 순차 구문 블록에서도 SIGNAL의 할당문 순서는 관계없이 각각의 할당문에서 플립-플롭이 형성된다.

    [예제 3] VARIABLE의 경우 순차구문 할당은 구문의 순서가 중요한 의미를 갖는다. 이 예제에서 var0와 var1은 순서에 의하여 등가 신호로서 플립 플롭이 형성되지 않는다. 합성과 시뮬레이션 결과는 그림 5와 같다. [예제 3]의 결과와 비교해 보자. "din"과 "dout"사이에 플립 플롭이 형성된 것을 볼수있다.

    [예제 4] 위의 [예제 3]과 비교해 보자. 순서가 다른경우 var0는 플립 플롭을 형성한다. 시뮬레이션과 합성의 결과는 그림 6과 같다. [예제 2]의 결과와 비교해 보면 결국 같은 회로이다.

     

    [예제 5] VARIABLE을 순차구문 블록내에 지역적인 객체이다. 따라서 전역적인 객체인 SIGNAL로의 인터페이스가 필요하다. 이 예의 시뮬레이션과 합성의 결과는 [예제 3]의 것과 동일하다.

    [예제 6] 순차적인 할당문은 마지막 항당이 이루어진 최종결과를 참조한다. 이 예제의 합성 결과를 보면 알 수 있듯이 HDL 합성기는 최적화 과정을 수행한다. 시뮬레이션과 합성의 결과는 그림 7과 같다. 구문을 잘 살펴보면 출력 "dout"의 0번 과 2번 비트가 항상 '0'이므로 플립 플롭이 만들어지지 않는다.

    그림 7. [예제 6]의 합성과 시뮬레이션 결과

     

    [예제 7] 순차구문 블록에서 SIGNAL도 순차적인 성격을 갖는다. [예제6]과 같은 합성결과를 얻게된다.