전공지식정리/디지털시스템설계

VHDL2.순차문

TimeSave 2020. 12. 8. 23:21

1. 순차문 & 병렬문 

1.1 순차문 : 부프로그램이나 프로세스문의 수행을 위한 알고리즘 서술.
    -> 순서대로 동작
    -> 함수, 프로시저,프로세스문 내부알고리즘

순차문의 종류
-> 대기문, 보고문, 주장문,  지연 메커니즘, 배정문, 프로시저 호출문
if, case, loop, next, exit, return, null


 1.2 병렬문 : 회로의 동작이나 구조 서술

병렬문의 종류    -> 프로세스, 블록사이 연결상태
    -> 아키텍쳐 내부 부분
    -> 각 병렬문은 독립,비동기적 동작.(하드웨어 동작 표현)
    -> 프로세스문, 블록문, 병렬 프로시저 호출문, 병렬 주장문, 병렬 신호 배정문, 콤포넌트 실체화 문, 생성문, 

-----------------------------------------------------------------------
1.3 순차문 상세
 
1.3.1 대기문( wait statement)
; 프로세스문, 프로시저 동작을 정지시키는 역할.

- 사용불가 
-> 함수, 함수에서 호출된 프로시저 내부
-> 감지절을 가진 프로세스문 내부
-> 호출된 부프로그램 내부
-> 보호형(guard) 본체에서 선언

wait ~ on, until, for 의 형태
1.3.1.1 감지절(sensitivity clause)
; 감지대상 신호의 변화가 없으면 계속 대기
- on 예약어 사용
- 감지리스트 이용
 -> 감지리스트 속의 신호 변화를 감지 후 다음명령 진행. 
 
1.3. 1.2 조건절(condition clause)
; 조건이 false 일 경우 계속 대기.
- True일 시, 다음 문장 수행
- until 예약어 사용
- 조건절이 없으면 until True의 생략으로 가정.

 1.3.1.3 타임 아웃절(timeout clause)
; 대기 상태에 있는 최대 시간을 규정.(time expression)  
- for 예약어 사용

 1.3.1.4 복합절
  wait(sensitivity_clause and condition_clause) OR timeout_clause
  - 감지절과 조건절이 동시에 오면 AND관계
  - 타임아웃 절이 오면 다른 절과 OR관계로 동작.
 1.5 wait;
 <=> 무한대기 
 
  ex) 
a) wait on A, B; 
b) wait until en = '1'; 
c) wait for 10 ns; 
d) wait on A, B until en = '1'; 
e) wait on A, B for 10 ns; 
f) wait until en = '1' for 10 ns; 
g) wait on A, B until en = '1' for 10 ns; 
h) wait ; 
i) wait for 0 ns;
j)
      constant HALF_PERIOD_100M : time := 5 ns ; 
      -- 중략 
      clk_gen : process 
      begin  
                  while (true) loop 
                               clk <= '0' ; wait for HALF_PERIOD_100M ; 
                               clk <= '1' ; wait for HALF_PERIOD_100M ; 
                  end loop; 
        end process;

1.3.2 보고문(report statement)
; 메세지 출력 기능 (expression 부분에 문자열)
- severity level(심각수준) 값 동시에 출력 가능
- severity level 종류 : NOTE, WARNING, ERROR, FAILURE

ex)
                 report " Interrupt is detected " 
                 -- A report statement with default severity NOTE. 
                   
                 report " ROM Read data is not Correct" 
                 severity error;

                 report " The ROM file End " 
                 severity Note;
1.3. 3 주장문(assertion statement)

; 특정 조건이 참임을 주장하는 용도
- 조건이 참이 아니면 에러 보고.
-> 보고문의 유무 파악 -> 있으면 출력
                                 -> 없으면 'Assertion violation." 이란 default 출력  - severity 항이 없을 때 default level : ERROR
  -> failure 경우, 주장문 내용 출력 후 시뮬레이션 중단.

         -- synthesis translate_off 
         ready_check_process: 
         process(ready, nCS) 
         begin 

                  assert not (ready = '1' and nCS = '1') 
  report " Unstable ouput of SR-FF due to nCS and ready at logic 1." 
                  severity Error; 

          end process ready_check_process; 
              -- synthesis translate_on
       

-----------------------------------------------------------------------------
1.3.4 신호 배정문

; 기존 신호의 값에 새로운 신호값 인가, 
   인가하던 신호 값을 풀어 줌 or 값 변경

신호배정문 BNF,
- 신호 배정 연산자 '<=' 이용
 -> 프로세스 내부에서 사용시 순차문
 -> 프로세스 외부에서 사용시 병렬문
- 1076-2008부터 추가된 사항. 
-> 조건신호배정문(conditional signal), 선택신호배정문(selected signal)

a) S <= A xor B; 
b) C <= A and B after 10 ns; 
c) out_pin <= in_pin after 10 ns; 
d) Output_pin1 <= inertial Input_pin after 10 ns; 
e) Output_pin2 <= reject 10 ns inertial Input_pin after 10 ns; 
f) Output_pin <= transport Input_pin after 10 ns; 
g) test_pattern <= '0', '1' after 10 ns, '0' after 20 ns, '1' after 30 ns, '0' after 40 ns; 
h) mem1(0) <= "00001000"; 
i) mem2(0)(7) <= '0';

1.3.4.1 지연 메커니즘(delay mechanism)
; delta delay, inertial delay(관성지원), transport delay(전달 지연)

ex) 예시

1.3.4.1.1 delta delay(델타지연)
; 신호배정문에서 after를 이용한 지연이 정의 되지 않은 상황.
- 신호지연이 0ns => delta 지연만 발생(실제 시간 지연 X)
- 델타지연으로 이벤트 순서를 정함
  -> 이벤트 순서의 차이를 모델링
  -> 델타 지연 개수에 무관하게 시간지연 0ns
ex) B <= not A; C <= not B; Y <= not C; [프로세스문 내부]

1.3.4.1.2 inertial delay(관성 지연)
; after는 사용했으나 transport 는 사용하지 않았을 때.
- 기본적인 지연 매커니즘

1.3.4.1.3 transport delay(전달지연)
; after + transport 예약어 사용.
- 무한대의 주파수 응답을 가진 전송선로 모델링 용
 => 모든 펄스를 출력으로 전달(아무리 짧은 주기 펄스도)

ex) Y <= transport A after 10 ns;

1.3.4.2 unaffected 예약어

; target 신호에 null을 배정한 것과 같은 의미
-> target 신호가 이전 값을 유지
-> target 신호에 변화가 생기지 않음.

ex) 
         result <= detect after 5 ns when strb = ‘0’ else 
         unaffected ;
 
-> strb = ‘0’ 이 아닌 경우 result는 이전 값을 유지 
-> 등가 코드(등가 로직)
                 process(strb, detect) 
                 begin 
                           if strb = ‘0’ then 
                                      result <= detect after 5 ns ; 
                           else null; 
                           end if ; 
                  end process;

1.3.4.3 waveform element(파형요소)

파형인가 방법 
 - 특정 시간에 특정한 구동값 인가 : value_expression 이용.
- null을 이용하여 인가되던 기존 신호를 특정 시간에 중지
  -> guarded signal(경호된 신호)에서만 가능
  -> null문장의 배정 X, null 파형의 배정 O
   => 기존에 인가되던 신호의 배정이 중지.

ex)
          Y <= '0', '1' after 10 ns, '0' after 25 ns;

1.3.4.4 조건신호 배정문/ 선택신호 배정문
1.3.4.5 변수배정문
기존 변수 값에 새로운 변수 값 인가함.

변수 배정문
- 변수 배정 연산자 :=
   -> 프로세스문 내부, 부프로그램 내부

단순 변수 배정 BNF
; 기존 언어의 변수와 같은 의미. RHS식 계산 결과가 LHS에 즉시 할당.
  => 즉시할당 : 지연시간, 델타지연 없음, 

단순 변수 배정
ex)
a) S := A xor B; 
b) C := A and B; 
c) mem1(0) := "00001000"; 
d) mem2(0)(7) := '0';
e) 
 architecture behavioral of variable_test is 
                  signal s : std_logic; 
begin 
                   process (a, s) 
                                    variable v : std_logic; 
                   begin 
                            s <= not a; 
                            sout <= not s; 
                     
                             v := not a; 
                             vout <= not v; 
                    end process; 
end behavioral;

-------------------------------------------------------------------------------------

1.3.5 프로시저 호출문

- 프로시저 호출에 의해, 본체가 수행됨.
 => 호출 이전에 프로시저 본체가 정의되어 있어야 함.
- 위치 : 프로세스문 내부 : 순차 프로시저 호출문
          : 프로세스문 외부 : 병렬 프로시저 호출문
- 프로시저 
  -> 이름 : 호출시 사용될 프로시저 본체 결정
  -> 실 매개변수 : 프로시저 내부에서 사용되는 실 매개변수 정보 제공.
ex) 
             architecture sim of procedure test is  
                                procedure ECHO(STR : string) is 
                                variable DLINE : line; 
                                begin 
                                              write(DLINE, STR, left, 20); 
                                              writeline(output, DLINE); 
                                 end; 
             begin 
               -- 중략 
                                  ECHO(" ERROR : Illegal read operation."); 
              end sim ;


1.3.6 if문

- elsif 는 임의 개수 만큼 반복간능
- else는 안와도 됨.
ex)

1.3.7 case 문

- expression : 이산형, 문자형을 원소로 하는 1차원 배열
- ? 기호 : 정합 case문(1076-2008 부터 추가됨) 
; bit, std_ulogic  1차원 배열 형
ex) 

1.3.8 loop문

; 반복적으로 수행되어야 할 문장
4.9.1 iteration scheme 
  while, for 이용한 반복 ; 없다면 무한루프
            => loop문 내, next, exit, return으로 종료
  4.9.1.1 while 이용하는 경우
     ; condition이 true일 경우 내부 문장 진입(수행)
     => false면 진입 없이 loop 종료

  4.9.1.2 for를 이용하는 경우
     ; loop변수의 이산값이 미완료일 경우 내부문장 진입(수행)
  -> loop 변수는 이산형이여야함
  -> loop 내부 문장으로 loop 변수 값 변경하면 안 됨.
  -> 외부 선언 없이 loop문 에서 loop변수 사용 가능.
  
ex)


1.3.9 next문
; loop문에서 현재 단계의 실행을 완료.

- when condition 있을 때.
   -> true  : next 다음 문장 무시, 현재 단계 종료.
   -> false : next 다음 문장 계속 수행. 
- when condition 없을 때.
   -> true와 같은 동작.
- loop_label (goto랑 비슷?)
  -> 존재할 경우 : 현재 단계 종료 후, loop_label로 이동
  -> 없을 경우    : 가장 안쪽 loop의 시작으로 이동.

- ex)

i > j 조건이 참이 되면 아래의 메모리 초기화를 생략하고 다음의 inner_loop로 실행을 옮김

1.3.10 exit문 ; 현재의 loop문 종료
- when condition 있을 때.
   -> true  : 해당 loop 종료.
   -> false : exit 다음 문장 계속 수행. 
- when condition 없을 때.
   -> true와 같은 동작.
- loop_label (goto랑 비슷?)
  -> 존재할 경우 : 해당 loop 종료
  -> 없을 경우    : 가장 안쪽 loop 종료

- ex)

i = 1 and j = 0 조건이 참이 되면 전체 loop(outer loop) 를 종료하고 그 다음 문장 실행

1.3.11 return 문

; 현재의 실행을 종료
- >해당 함수, 프로시저를 호출한 문장으로 복귀
-> 함수, 프로시저 내부에서만 사용

expression 
- 프로시저는 못 옴, 함수는 옴
- 함수의 return 형과 일치해야 함.

-ex)
function DATA_MAX( data_a, data_b : in std_logic_vector ) 
               return std_logic_vector is 
begin 
                if ( data_a > data_b ) then 
                               return data_a; 
                else 
                               return data_b; 
                end if; 
 end DATA_MAX;

1.3.12 null문

; 아무런 동작도 수행하지 않는 경우를 표현.
-> null literal이 아니다(문장과 리터럴 차이)
-> case 문에서 others와 함께 사용
ex) when others => null;



출처 :  http://dasan.sejong.ac.kr/~dihan/vhdl.htm