5. 순차문과병렬문 한동일dasan.sejong.ac.kr/~dihan/vhdl/vhdl05_full.pdf · ·...
TRANSCRIPT
VHDL 프로그래밍VHDL 프로그래밍
5. 순차문과 병렬문
한 동 일
학습 목표학습 목표
순차문들의 종류와 활용 방법에 대해서 배운다.
병렬문들의 종류와 활용 방법에 대해서 배운다 병렬문들의 종류와 활용 방법에 대해서 배운다.
순차문으로도 사용이 가능하고 병렬문으로도 사용이 가능한 신호 배정문의 정의 및 사용법을 배용이 가능한 신호 배정문의 정의 및 사용법을 배운다.
프로세스문과 부프로그램 내부에서 사용되는 변수 배정문의 정의 및 사용법을 배운다수 배정문의 정의 및 사용법을 배운다.
if 문, case 문, loop 문 등 주요 순차문들을 활용할 수 있다할 수 있다.
프로세스문, 콤포넌트 실체화문 등 주요 병렬문들
2/93
프로세스문, 콤포넌트 실체화문 등 주요 병렬문들을 활용할 수 있다.
순차문과 병렬문순차문과 병렬문
VHDL을 이용한 하드웨어 설계 과정 VHDL을 이용한 하드웨어 설계 과정 아키텍처 문장부의 서술
모두 병렬문으로 구성
대부분 프로세스문의 서술
프로세스문의 서술 프로세스문 내부는 순차문으로 서술
프로시저나 함수와 같은 부프로그램 서술 부프로그램 내부는 순차문으로 서술
나머지 부분은 문법을 이용한 기계적인 서술이 가능 각종 형, 속성, 인터페이스, 가명, 콤포넌트 선언 등등
식별 의 선정 엔 텍 신 변수 식별어의 선정 – 엔티티, 아키텍처, 신호, 변수 등등
콤포넌트 실체화, 부프로그램 호출, 생성문 등등
패키지 라이브러리의 사용 등등
3/93
패키지, 라이브러리의 사용 등등
.
순차문과 병렬문순차문과 병렬문
순차문 순차문 부프로그램이나 프로세스문의 수행을 위한 알고리즘을
서술하는 용도 함수나 프로시저의 내부 알고리즘 서술
프로세스문의 내부 알고리즘 서술
서술된 순서대로 동작 소프트웨어 언어와 동작 방식이 유사
병렬문 회로의 동작이나 구조를 서술하는 용도
프로세스나 블록 사이의 연결 상태 서술
아키텍처 내부에서 서술
각각의 병렬문들은 독립적으로 비동기적으로 동작
4/93
하드웨어의 동작을 표현
.
순차문(sequential statement)순차문(sequential statement)
순차문의 종류 순차문의 종류
sequence_of_statements ::=
{ sequential_statement }
ti l t t tsequential_statement ::=
wait_statement | report_statement
| ti t t t | i l i t t t t| assertion_statement | signal_assignment_statement
| variable_assignment_statement | if_statement
| d ll t t t | t t t| procedure_call_statement | case_statement
| loop_statement | next_statement
| it t t t | t t t t| exit_statement | return_statement
| null_statement
5/93
순차문(sequential statement)순차문(sequential statement)
대기문( it t t t)의 BNF 정의 대기문(wait statement)의 BNF 정의wait_statement ::=
[ label : ] wait [ sensitivity_clause ] [ condition_clause ] [ timeout_clause ] ;
sensitivity clause ::= on sensitivity listsensitivity_clause :: on sensitivity_list
sensitivity_list ::= signal_name { , signal_name }
condition clause ::= until conditioncondition_clause :: until condition
condition ::= expression
timeout clause ::= for time expression
프로세스문이나 프로시저의 동작을 주어진 조건에 따라정지시키는 역할을 수행
timeout_clause :: for time_expression
정지시키는 역할을 수행 함수 및 함수에서 호출된 프로시저 내부에서는 사용 불가
감지절을 가진 프로세스문 내부에서 사용 불가
6/93
감지절을 가진 프로세스문 내부에서 사용 불가
보호형 본체에서 선언되거나 호출된 부프로그램 내부에서도 사용 불가
대기문(wait statement)대기문(wait statement)
대기문( it t t t)의 예 대기문(wait statement)의 예
) it A Ba) wait on A, B;
b) wait until en = '1';
) it f 10c) wait for 10 ns;
d) wait on A, B until en = '1';
) it A B f 10e) wait on A, B for 10 ns;
f) wait until en = '1' for 10 ns;
) it A B til '1' f 10g) wait on A, B until en = '1' for 10 ns;
h) wait ;
i) it f 0i) wait for 0 ns;
7/93
대기문(wait statement)대기문(wait statement)
감지절( iti it l ) 감지절(sensitivity clause) on 예약어 사용
감지 리스트(sensitivity list) 이용 감지 리스트에 존재하는 신호의 변화를 감지한 후 다음 명령 진행
감지 리스트 신호의 변화가 없는 경우에는 계속 대기
조건절(condition clause) until 예약어 사용until 예약어 사용
조건절이 TRUE가 되면 다음 문장 수행 조건절이 FALSE인 경우에는 계속 대기 조건절이 FALSE인 경우에는 계속 대기
조건절이 없으면 until TRUE가 생략되어 있는 것으로 가정
8/93.
대기문(wait statement)대기문(wait statement)
타임아웃절(ti t l ) 타임아웃절(timeout clause) for 예약어 사용
대기 상태에 있는 최대 시간을 규정 타임아웃 시간을 결정하기 위해 time expression 값 이용
time expression 값이 음수이면 에러
기타기타 복합절 :
wait (sensitivity clause AND condition clause) OR timeout clausewait (sensitivity_clause AND condition_clause) OR timeout_clause 감지절과 조건절이 동시에 오면 서로 AND 관계
타임아웃절이 오면 다른 절과 OR 관계로 동작 타임아웃절이 오면 다른 절과 OR 관계로 동작
wait ;
9/93
무한 대기
.
대기문(wait statement)대기문(wait statement)
대기문의 예 대기문의 예
constant HALF PERIOD 100M : time := 5 ns ;constant HALF_PERIOD_100M : time : 5 ns ;
-- 중략
clk gen : processclk_gen : process
begin
while (true) loopwhile (true) loop
clk <= '0' ; wait for HALF_PERIOD_100M ;
clk <= '1' ; wait for HALF PERIOD 100M ;clk < 1 ; wait for HALF_PERIOD_100M ;
end loop;
end process;end process;
10/93
순차문(sequential statement)순차문(sequential statement)
보고문( t t t t)의 BNF 정의 보고문(report statement)의 BNF 정의
report_statement ::=
[ label : ] report expression
[ severity expression ] ;
메시지를 출력하는 역할을 수행expression 부분에 문자열이 와야 함 expression 부분에 문자열이 와야 함
심각 수준(severity level) 값을 동시에 출력 가능severity 항이 없을 때 보고문의 기본 심각 수준 : NOTE severity 항이 없을 때 보고문의 기본 심각 수준 : NOTE
심각 수준(severity level)의 종류NOTE NOTE
WARNING
ERROR
11/93
RROR
FAILURE
보고문
보고문( t t t t)의 예
보고문
보고문(report statement)의 예
report " Interrupt is detected "report Interrupt is detected
-- A report statement with default severity NOTE.
report " ROM Read data is not Correct"
severity error;severity error;
report " The ROM file End "report The ROM file End
severity Note;
12/93
순차문(sequential statement)순차문(sequential statement)
주장문( ti t t t)의 BNF 정의 주장문(assertion statement)의 BNF 정의assertion_statement ::= [ label : ] assertion ;
assertion ::= assert condition
[ report expression ]
[ severity expression ]
특정 조건이 참임을 주장하는 용도 조건 부분이 참이 아니면(주장 위반이 발생) 에러를 보고 조건 부분이 참이 아니면(주장 위반이 발생) 에러를 보고
주장 위반이 발생 시 보고문의 유무 파악
보고문이 있으면 보고문을 출력
보고문이 없으면 “Assertion violation.”이란 기본 문자열 출력
severity 항이 없을 때 주장문의 기본 심각 수준 : ERROR
심각 수준 값이 f il 일 경우 주장문 내용 출력 후 시뮬레이션 중단
13/93
심각 수준 값이 failure일 경우 주장문 내용 출력 후 시뮬레이션 중단
.
주장문주장문
주장문( ti t t t)의 예 주장문(assertion statement)의 예
-- 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
14/93
순차문(sequential statement)순차문(sequential statement)
신호 배정문의 BNF 정의 신호 배정문의 BNF 정의signal_assignment_statement ::=
[ label : ] simple_signal_assignment
| [ label : ] conditional_signal_assignment
기존의 신호 값에 새로운 신호 값을 인가하거나 인가하
| [ label : ] selected_signal_assignment
기존의 신호 값에 새로운 신호 값을 인가하거나 인가하던 신호 값을 풀어주거나 신호 값을 변경하는 용도
신호 배정 연산자 “<=“를 이용 신호 배정 연산자 <= 를 이용 프로세스문 내부에서 사용되면 순차문을 구성
프로세스문 외부에서 사용되면 병렬문을 구성 프로세스문 외부에서 사용되면 병렬문을 구성
조건 신호 배정문, 선택 신호 배정문은 1076-2008 버전부터 추가된 사양
15/93
부터 추가된 사양
신호 배정문신호 배정문
단순 신호 배정을 위한 BNF 정의 단순 신호 배정을 위한 BNF 정의
simple signal assignment ::=simple_signal_assignment ::
target <= [ delay_mechanism ] waveform ;
target ::=
name | aggregate
delay_mechanism ::=
transport | [ reject time_expression ] inertial
waveform ::=
waveform_element { , waveform_element } | unaffected
waveform_element ::= value_expression [ after time_expression ]
| null [ after time_expression ]
16/93
신호 배정문신호 배정문
단순 신호 배정의 예 단순 신호 배정의 예
S <= A xor B;;
C <= A and B after 10 ns;
out_pin <= in_pin after 10 ns;
Output_pin1 <= inertial Input_pin after 10 ns;
Output_pin2 <= reject 10 ns inertial Input_pin after 10 ns;
i iOutput_pin <= transport Input_pin after 10 ns;
test_pattern <= '0', '1' after 10 ns, '0' after 20 ns, '1' after 30 ns, '0' after 40 ns;
mem1(0) <= "00001000";mem1(0) <= 00001000 ;
mem2(0)(7) <= '0';
17/93
신호 배정문신호 배정문
지연 메커니즘(d l h i ) 지연 메커니즘(delay mechanism) 델타 지연(delta delay)
관성 지연(inertial delay)
전달 지연(transport delay) 전달 지연(transport delay)
지연 메커니즘의 BNF 정의 지연 메커니즘의 BNF 정의
simple signal assignment ::=p _ g _ g
target <= [ delay_mechanism ] waveform ;
d l h idelay_mechanism ::=
transport
| [ j i ] i i l
18/93
| [ reject time_expression ] inertial
.
지연 메커니즘지연 메커니즘
지연 메커니즘의 예 지연 메커니즘의 예
S <= A xor B; -- 델타 지연 1S < A xor B; -- 델타 지연 1
C <= A and B; -- 델타 지연 2
C1 <= A and B after 10 ns; -- 관성 지연 1C1 < A and B after 10 ns; -- 관성 지연 1
Output_pin1 <= inertial Input_pin after 10 ns; -- 관성 지연 2
Output pin2 <= reject 10 ns inertial Input pin after 10 ns; -- 관성 지연 3Output_pin2 < reject 10 ns inertial Input_pin after 10 ns; -- 관성 지연 3
Output_pin3 <= transport Input_pin after 10 ns; -- 전달 지연
19/93
지연 메커니즘지연 메커니즘
델타 지연(d lt d l ) 델타 지연(delta delay) 신호 배정문에서 after 예약어를 이용한 지연이 정의되
지 않은 경우
신호 지연이 0 ns 인 경우
델타 지연만 발생하고 실제적인 시간 지연이 발생하지는않음않음
델타 지연으로 이벤트들의 순서를 정함이벤트들의 순서의 차이를 델타 지연으로 모델링 이벤트들의 순서의 차이를 델타 지연으로 모델링
델타 지연의 개수에 무관하게 시간 지연은 0 ns
20/93.
지연 메커니즘지연 메커니즘
델타 지연(d lt d l )의 예 (프로세스문 내부) 델타 지연(delta delay)의 예 (프로세스문 내부)
B A C B Y CB <= not A; C <= not B; Y <= not C;
A B C Y
A
B
C
Y
21/93
10 ns 10+1 10+2 10+3=10 ns
지연 메커니즘지연 메커니즘
관성 지연(i ti l d l ) 관성 지연(inertial delay) 신호 배정문에서 after 예약어를 이용하되 transport 예
약어를 이용하지 않은 경우
지연이 있을 경우의 기본 지연 메커니즘
스위치 회로의 특성을 모델링하기 위한 용도스위칭 시간보다 짧은 주기의 펄스는 무시 스위칭 시간보다 짧은 주기의 펄스는 무시
reject 예약어를 이용하여 펄스 제거 범위(pulse j ti ti ) 설정 가능rejection time) 설정 가능
reject 예약어 다음에 오는 시간 표시가 펄스 제거 범위
펄스 제거 범위 시간보다 짧은 펄스는 제거됨 펄스 제거 범위 시간보다 짧은 펄스는 제거됨
reject 예약어가 없는 경우는 첫번째 after 예약어 다음에 오는 시간 표시가 펄스 제거 범위가 됨
22/93.
지연 메커니즘지연 메커니즘
관성 지연(i ti l d l )의 예 관성 지연(inertial delay)의 예
Y j 4 A f 10Y <= reject 4 ns A after 10 ns;
delay = 10 ns
reject limit 4 nsA Y
reject limit = 4 ns
5 8 10 25 28 30 45 48
A
Y
20 40
23/93
지연 메커니즘지연 메커니즘
전달 지연(t t d l ) 전달 지연(transport delay) 신호 배정문에서 after 예약어와 transport 예약어를 동
시에 사용하는 경우
순수한 전달 지연을 의미
무한대의 주파수 응답을 가지는 전송 선로를 모델링하기 위한 용도링하기 위한 용도 아무리 짧은 주기의 펄스라도 출력으로 전달
24/93.
지연 메커니즘지연 메커니즘
전달 지연(t t d l )의 예 전달 지연(transport delay)의 예
Y A f 10Y <= transport A after 10 ns;
delay = 10 nsA Y
5 8 10 25 28 30 45 48
A
Y
15 18 20 35 38 40 55 58
25/93
지연 메커니즘지연 메커니즘
지연 메커니즘을 이용한 신호 배정 예
Output pin <= Input pin ; -- Assignments using delta delay, a)
지연 메커니즘을 이용한 신호 배정 예
p _p p _p ; g g y, )
-- The following three assignments are equivalent to each other:
O t t i < I t i ft 10 b)Output_pin <= Input_pin after 10 ns; -- b)
Output_pin <= inertial Input_pin after 10 ns; -- c)
O t t i < j t 10 i ti l I t i ft 10 d)Output_pin <= reject 10 ns inertial Input_pin after 10 ns; -- d)
-- Assignments with a pulse rejection limit less than the time expression:
O t t i < j t 5 i ti l I t i ft 10 )Output_pin <= reject 5 ns inertial Input_pin after 10 ns; -- e)
-- Assignments using transport delay:
Output_pin <= transport Input_pin after 10 ns; -- f)
-- Their equivalent assignments:
26/93
Output_pin <= reject 0 ns inertial Input_pin after 10 ns; -- g)
신호 배정문신호 배정문
ff t d 예약어를 이용한 신호 배정문 unaffected 예약어를 이용한 신호 배정문
target <= [ delay_mechanism ] unaffected;
target 신호에 null 문장(null statement)를 배정한 것과같은 의미같은 의미 target 신호가 이전 값을 유지
target 신호에 변화가 생기지 않음
27/93
신호 배정문신호 배정문
ff t d 예약어의 사용 예 unaffected 예약어의 사용 예
result <= detect after 5 ns when strb = ‘0’ else
strb = ‘0’ 이 아닌 경우 result는 이전 값을 유지
unaffected ;
strb 0 이 아닌 경우 result는 이전 값을 유지
위의 코드와 등가 로직
process(strb, detect)
begin
if strb = ‘0’ then
result <= detect after 5 ns ;
else null;
end if ;
28/93
end process;
신호 배정문신호 배정문
파형 요소( f l t)의 BNF 정의 파형 요소(waveform element)의 BNF 정의
waveform element ::= value expression [ after time expression ]
목표 신호에 파형을 인가하는 방법
_ _ p [ _ p ]
| null [ after time_expression ]
목표 신호에 파형을 인가하는 방법 특정 시간에 특정한 구동값을 인가
value_expression 이용
null 요소를 이용하여 목표 신호에 인가되던 기존의 신호를 특정 시간에 중지 null 이용
경호된 신호(guarded signal)에 대해서만 사용 가능
null 문장의 배정이 아님, null 파형의 배정에 의해서 기존에 인가되던신호의 배정이 중지됨
29/93
신호의 배정이 중지됨
.
신호 배정문신호 배정문
파형 요소( f l t)의 배정 예 파형 요소(waveform element)의 배정 예
Y '0' '1' f 10 '0' f 25Y <= '0', '1' after 10 ns, '0' after 25 ns;
Y
10 25
30/93
순차문(sequential statement)
조건 신호 배정문 ( diti l i l i t)
순차문(sequential statement)
조건 신호 배정문 (conditional signal assignment)target <= delay_mechanism
waveform1 when condition1 else
waveform2 when condition2 else
···
waveformN-1 when conditionN-1 else
waveformN when conditionN;waveformN when conditionN;
target <= delay_mechanism
waveform1 when condition1 else
waveform2 when condition2 else
···
waveformN-1 when conditionN-1 else
waveformN;
31/93
waveformN;
조건 신호 배정문조건 신호 배정문
조건 신호 배정문의 등가 코드 조건 신호 배정문의 등가 코드
if condition1 then
target <= delay_mechanism waveform1;
elsif condition2 then
target <= delay_mechanism waveform2;
···
elsif conditionN-1 then
target <= delay_mechanism waveformN-1;
elsif conditionN then
target <= delay_mechanism waveformN;
end if;
32/93
조건 신호 배정문조건 신호 배정문
조건 신호 배정문의 등가 코드 조건 신호 배정문의 등가 코드
if condition1 then
target <= delay_mechanism waveform1;
elsif condition2 then
target <= delay_mechanism waveform2;
···
elsif conditionN-1 then
target <= delay_mechanism waveformN-1;
else
target <= delay_mechanism waveformN;
end if;
33/93
조건 신호 배정문조건 신호 배정문
실제 예 왼쪽과 등가인 코드 실제 예
h l “00” l if l “00” h
왼쪽과 등가인 코드
y <= a when sel = “00” else
b when sel = “01” else
h l “10” l
if sel = “00” then y <= a;
elsif sel = “01” then y <= b;
l if l “10” hc when sel = “10” else
d when sel = “11” ;
elsif sel = “10” then y <= c;
elsif sel = “11” then y <= d;
d ifend if;
if l “00” h
y <= a when sel = “00” else
b h l “01” l
if sel = “00” then y <= a;
elsif sel = “01” then y <= b;
l if l “10” hb when sel = “01” else
c when sel = “10” else
d
elsif sel = “10” then y <= c;
else y <= d;
d if
34/93
d ; end if;
순차문(sequential statement)순차문(sequential statement)
선택 신호 배정문( l t d i l i t) 선택 신호 배정문(selected signal assignment) select 다음에 ? 가 올 경우 case 다음에 ? 가 오는 등가
의 case 문으로 변환 가능
with expression select
target <= delay_mechanism waveform1 when choice_list1,
waveform2 when choice_list2,
···
waveformN-1 when choice_listN-1,
waveformN when choice_listN;
35/93
선택 신호 배정문선택 신호 배정문
선택 신호 배정문의 등가 코드 선택 신호 배정문의 등가 코드case expression is
when choice_list1 =>
target <= delay_mechanism waveform1;
when choice_list2 =>
target <= delay_mechanism waveform2;
···
when choice_listN-1 =>
target <= delay_mechanism waveformN-1;
when choice_listN =>
target <= delay_mechanism waveformN;
end case;
36/93
선택 신호 배정문선택 신호 배정문
실제 예 왼쪽과 등가인 코드 실제 예 select 다
왼쪽과 등가인 코드
with sel select
"00"
case sel is
when "00" => q <= a;q <= a when "00",
b when "01",
"10"
q ;
when "01" => q <= b ;
when "10" => q <= c ;c when "10",
d when others;
q ;
when others => q <= d ;
end case;;
조건 신호 배정문과 선택 신호 배정문은 병렬문으로만사용되다 2008년 버전부터 순차문으로도 사용할 수 있
37/93
게 됨
순차문(sequential statement)순차문(sequential statement)
변수 배정문의 BNF 정의 변수 배정문의 BNF 정의variable_assignment_statement ::=
[ label : ] simple_variable_assignment
| [ label : ] conditional_variable_assignment
기존의 변수 값에 새로운 변수 값을 인가하는 용도
| [ label : ] selected_variable_assignment
기존의 변수 값에 새로운 변수 값을 인가하는 용도
변수 배정 연산자 “:=“를 이용프로세스문 내부에서 사용 프로세스문 내부에서 사용
부프로그램 내부에서 사용
조건 변수 배정문 선택 변수 배정문은 1076-2008 버전 조건 변수 배정문, 선택 변수 배정문은 1076 2008 버전부터 추가된 사양
38/93
변수 배정문변수 배정문
단순 변수 배정을 위한 BNF 정의 단순 변수 배정을 위한 BNF 정의simple_variable_assignment ::=
target := expression;
target ::=target ::=
name | aggregate
기존의 소프트웨어 언어에서 사용되는 변수와 같은 의미
변수 배정문의 RHS 식의 계산 결과가 LHS에 즉시 할당 지연 시간, 델타 지연이 없음
시간 지연 없이 계산값이 즉시 할당됨
39/93
변수 배정문변수 배정문
단순 변수 배정의 예 단순 변수 배정의 예
S := A xor B;S : A xor B;
C := A and B;
mem1(0) := "00001000";( )
mem2(0)(7) := '0';
40/93
변수 배정문변수 배정문
단순 변수 배정의 사용 예 단순 변수 배정의 사용 예
architecture behavioral of variable test is_
signal s : std_logic;
begin
process (a, s)
variable v : std_logic;
begin
s <= not a;
t < tsout <= not s;
v := not a;
vout <= not v;
end process;
41/93
end behavioral;
순차문(sequential statement)순차문(sequential statement)
프로시저 호출문의 BNF 정의 프로시저 호출문의 BNF 정의
procedure call statement ::= [ label : ] procedure call ;procedure_call_statement :: [ label : ] procedure_call ;
procedure_call ::= procedure_name [ ( actual_parameter_part ) ]
프로시저 호출에 의해서 프로시저 본체가 수행됨
호출 이전에 프로시저 본체가 먼저 정의되어 있어야 함 호출 이전에 프로시저 본체가 먼저 정의되어 있어야 함
프로시저 호출문의 위치 프로세스문 내부에 존재 시 : 순차 프로시저 호출문
프로세스문 외부에 존재 시 : 병렬 프로시저 호출문
프로시저 프로시저 이름 : 호출 시 사용될 프로시저 본체를 결정하는 용도
실 매개변수: 프로시저 내부에서 사용되는 실제 매개변수 정보 제공
42/93
실 매개변수: 프로시저 내부에서 사용되는 실제 매개변수 정보 제공
.
프로시저 호출문프로시저 호출문
프로시저 호출문의 예
architecture sim of procedure test is
프로시저 호출문의 예
p _
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 ;
43/93
;
순차문(sequential statement)순차문(sequential statement)
if 문의 BNF 정의 if 문의 BNF 정의if_statement ::=
[ if_label : ]
if condition then
sequence_of_statements
{ elsif condition then
sequence_of_statements }
[ else
sequence_of_statements ]
end if [ if_label ] ;
elsif 문은 0 ~ 임의의 개수 만큼 반복 가능
else 문은 안 올수도 있고 나머지 조건에 대한 실행문으
44/93
else 문은 안 올수도 있고 나머지 조건에 대한 실행문으로 마지막에 한 번 올 수 있음
If 문If 문
if 문의 예
if (ADDR >= "1110000") then
if 문의 예
if (ADDR > 1110000 ) then
ECHO(" ERROR : Illegal read address!");
end if;end if;
count_check :
if (one = '1' and count = 7) then
count := 7; one := '0';
elsif (count = 0) then
count := 15; one := '1';
else
count := count - 1;
45/93
end if count_check;
순차문(sequential statement)순차문(sequential statement)
문의 BNF 정의 case 문의 BNF 정의case_statement ::=
[ case_label : ]
case [ ? ] expression is
case_statement_alternative
{ case_statement_alternative }
end case [ ? ] [ case_label ] ;
case statement alternative ::=
i 이산형 문자형을 원소로 하는 1차원 배열형
case_statement_alternative ::=
when choices => sequence_of_statements
expression: 이산형, 문자형을 원소로 하는 1차원 배열형
? 기호 존재 : 정합 case 문 (1076-2008 버전부터 추가)
46/93
된 사양) – bit, std_ulogic 형의 1차원 배열형
case 문case 문
문의 예 case 문의 예
case bit_value is
when "0000" => result := '0';
when "0001" => result := '1';
when "0010" => result := '2';
-- 중략
h "1010" > lt 'A'when "1010" => result := 'A';
when "1011" => result := 'B';
when "1100" => result := 'C';when 1100 > result : C ;
when "1101" => result := 'D';
when "1110" => result := 'E';;
when "1111" => result := 'F';
when others => result := 'X';
47/93
end case ;
순차문(sequential statement)순차문(sequential statement)
l 문의 BNF 정의 loop 문의 BNF 정의
loop statement ::=p_
[ loop_label : ]
[ iteration scheme ] loop[ _ ] p
sequence_of_statements
end loop [ loop label ] ;p [ p_ ] ;
iteration_scheme ::=
di iwhile condition
| for loop_parameter_specification
ifi i id ifi di
반복적으로 수행되어야 할 문장들을 구현
parameter_specification ::= identifier in discrete_range
48/93
반복적으로 수행되어야 할 문장들을 구현
loop 문loop 문
it ti h iteration scheme while, for 를 이용한 반복
없을 경우에는 무한 루프 loop 문 내의 next, exit, return을 통해서 종료
while을 이용하는 경우 condition이 TRUE일 경우 내부 문장 수행 condition이 TRUE일 경우 내부 문장 수행
false일 경우 내부 문장의 수행 없이 loop문이 완료
for를 이용하는 경우 for를 이용하는 경우 루프 변수의 이산값이 미완료일 경우 내부 문장 수행
루프 변수는 이산형이어야 함
loop문의 내부 문장에 의해서 루프 변수값이 변경되어도 안됨
루프 변수의 이산값이 null인 경우 loop 문은 종료
49/93
루프 변수의 이산값이 null인 경우 loop 문은 종료
외부에서 별도의 선언 없이 loop문 내에서 루프 변수 사용.
loop 문loop 문
l 문의 예 loop 문의 예
while (true) loop( ) p
vdclk <= '1' ; wait for 10 ns ;
vdclk <= '0' ; wait for 10 ns ;; ;
end loop;
f i i 'RANGE l f i i 0 t 63 lfor i in rpt'RANGE loop -- for i in 0 to 63 loop
case zbus(i) is
h '1' (i) '1' ft 2when '1' => rpt(i) <= '1' after 2 ns;
when 'H' => rpt(i) <= '1' after 2 ns;
h th (i) '0' ft 2when others => rpt(i) <= '0' after 2 ns;
end case;
d l
50/93
end loop;
순차문(sequential statement)순차문(sequential statement)
t 문의 BNF 정의 next 문의 BNF 정의
next statement ::=
반복 실행되는 l 문에서 현재 단계의 실행을 완료
_
[ label : ] next [ loop_label ] [ when condition ] ;
반복 실행되는 loop문에서 현재 단계의 실행을 완료
when condition이 사용될 경우 true일 경우 next 다음의 문장들은 무시되고 현재 단계 수행 종료
false일 경우 next 다음의 문장들을 계속 수행
h diti 이 없을 경우 when condition이 없을 경우 next 문을 만나면 다음의 문장들은 무시되고 현재 단계 수행 종료
l l b l loop_label loop_label이 존재할 경우 현재 단계 종료 후 loop_label로 이동
loop label이 없을 경우 가장 안쪽 loop의 시작으로 이동
51/93
loop_label이 없을 경우 가장 안쪽 loop의 시작으로 이동
.
next 문next 문
t 문의 예 next 문의 예outer_loop :
for i in 3 downto 0 loop
inner_loop :
for j in 7 downto 0 loop
next inner_loop when i > j;
mem2 (i) (j) := '0';
end loop;
i > j 조건이 참이 되면 아래의 메모리 초기화를 생략하
end loop;
i > j 조건이 참이 되면 아래의 메모리 초기화를 생략하고 다음의 inner_loop로 실행을 옮김
52/93
순차문(sequential statement)순차문(sequential statement)
it 문의 BNF 정의 exit 문의 BNF 정의
exit statement ::=
반복 실행되는 l 문에서 현재의 l 문을 종료시킴
_
[ label : ] exit [ loop_label ] [ when condition ] ;
반복 실행되는 loop문에서 현재의 loop문을 종료시킴
when condition이 사용될 경우 true일 경우 해당 loop문의 수행을 종료
false일 경우 exit 다음의 문장들을 계속 수행
h diti 이 없을 경우 when condition이 없을 경우 exit 문을 만나면 해당 loop문의 수행을 종료
l l b l loop_label loop_label이 존재할 경우 해당 loop가 종료
loop label이 없을 경우 가장 안쪽 loop가 종료
53/93
loop_label이 없을 경우 가장 안쪽 loop가 종료
.
exit 문exit 문
it 문의 예 exit 문의 예outer_loop :
for i in 3 downto 0 loop
inner_loop :
for j in 7 downto 0 loop
mem2 (i) (j) := '0';
exit outer_loop when i = 1 and j = 0;
end loop;
i = 1 and j = 0 조건이 참이 되면 전체 loop(outer loop)
end loop;
i 1 and j 0 조건이 참이 되면 전체 loop(outer_loop)를 종료하고 그 다음 문장 실행
54/93
순차문(sequential statement)순차문(sequential statement)
t 문의 BNF 정의 return 문의 BNF 정의
return statement ::=_
[ label : ] return [ expression ] ;
현재의 실행을 종료시키는 용도
함수나 프로시저 내부에서만 사용 가능 함수나 프로시저 내부에서만 사용 가능 return문을 만나면 해당 함수나 프로시저를 호출한 문장으로 복귀
expression expression 프로시저에서는 expression 부분이 올 수 없음
함수에서는 반드시 expression 부분이 와야 함
함수의 return 형과 일치해야 함
55/93.
return 문return 문
t 문의 예 return 문의 예
function DATA MAX( data a data b : in std logic vector )function DATA_MAX( data_a, data_b : in std_logic_vector )
return std_logic_vector is
beginbegin
if ( data_a > data_b ) then
return data a;return data_a;
else
return data b;return data_b;
end if;
end DATA MAX;end DATA_MAX;
56/93
순차문(sequential statement)순차문(sequential statement)
ll 문의 BNF 정의 null 문의 BNF 정의
null statement ::=_
[ label : ] null ;
아무런 동작도 수행하지 않는 경우를 나타냄
null literal과의 차이를 구분할 것 null literal과의 차이를 구분할 것 문장과 리터럴의 차이
보통 case문에서 others 예약어와 같이 사용 보통 case문에서 others 예약어와 같이 사용 when others => null;
57/93
null 문null 문
ll 문의 예 null 문의 예
case bit value iscase b t_va ue s
when "0000" => result := '0';
-- 중략중략
when "1111" => result := 'F';
when others => null;
ll 리터럴의 예
when others null;
end case ;
null 리터럴의 예
new NODE'(15 ns null)new NODE (15 ns, null)
new NODE'(Delay => 5 ns, \Next\=> Stack)
58/93
병렬문(concurrent statement)병렬문(concurrent statement)
병렬문의 종류 병렬문의 종류
concurrent statement ::=_
process_statement
| block statement| _
| concurrent_procedure_call_statement
| concurrent assertion statement| _ _
| concurrent_signal_assignment_statement
| component instantiation statement| p _ _
| generate_statement
59/93
병렬문(concurrent statement)병렬문(concurrent statement)
프로세스문( t t t)의 BNF 정의 프로세스문(process statement)의 BNF 정의
process statement ::=p _
[ process_label : ]
[ postponed ] process [ ( sensitivity list ) ] [ is ][ p p ] p [ ( y_ ) ] [ ]
process_declarative_part
beging
process_statement_part
end [ postponed ] process [ process label ] ;[ p p ] p [ p _ ] ;
process_statement_part ::=
{ i l }{ sequential_statement }
process_declarative_part ::=
{ d l i i }
60/93
{ process_declarative_item }
프로세스문프로세스문
프로세스문의 BNF 정의 계속 프로세스문의 BNF 정의 – 계속
process declarative item ::=process_declarative_item ::
subprogram_declaration | subprogram_body | package_body
| package declaration | subprogram instantiation declaration| package_declaration | subprogram_instantiation_declaration
| package instantiation_declaration | type_declaration
| subtype declaration | constant declaration | variable declaration| subtype_declaration | constant_declaration | variable_declaration
| file_declaration | alias_declaration
| attribute declaration | attribute specification| attribute_declaration | attribute_specification
| use_clause | group_template_declaration
| group declaration
신호 선언 불가
| group_declaration
61/93
신호 선언 불가
프로세스문프로세스문
순차적으로 서술할 수 있는 독립구조의 모듈화 순차적으로 서술할 수 있는 독립구조의 모듈화 알고리즘을 표현할 수 있는 도구
프로세스문 자체는 병렬문
프로세스문 내부는 순차문 프로세스문 내부는 순차문
프로세스문의 동작일종의 무한 루프 일종의 무한 루프
감지 리스트 신호의 변화에 의해서 순차문 수행
감지 리스트 시작 부분의 process 예약어 다음에 위치 혹은 시작 부분의 process 예약어 다음에 위치, 혹은
프로세스 내 마지막 순차문으로 서술되는 wait 문에 위치
62/93
치
.
프로세스문프로세스문
프로세스문의 예 왼쪽과 등가인 코드 프로세스문의 예 process 예약어 다음에
왼쪽과 등가인 코드 wait on 다음에p
sensitivity list 위치
가급적 아래의 코드를
sensitivity list 위치
두 서술 기법 중 택일 가급적 아래의 코드를사용할 것
process ( A, B)
process
begin
두 서술 기법 중 택일
process ( A, B)
begin
if A > B then
g
if A > B then
Y <= '0' ; if A B then
Y <= '0' ;
else
;
else
Y <= '1' ; else
Y <= '1' ;
end if;
;
end if;
wait on A, B;
63/93
end if;
end process;
, ;
end process;
프로세스문프로세스문
델타 지연(d lt d l ) 델타 지연(delta delay) 감지 리스트 신호의 변화 무 : 시뮬레이션 타임 진행
감지 리스트 신호의 변화 발생 : 델타 지연으로 모델링
델타 지연 델타 지연 순차문들이 순차적으로 진행
순차문들의 논리적인 실행 순서의 차이를 델타 지연으로 모델링
실제적인 시간 지연은 없음
신호 배정문 : 델타 지연 발생
변수 배정문 : 델타 지연도 발생되지 않음 소프트웨어적인 값의 배정을 의미
64/93.
프로세스문프로세스문
프로세스문의 델타 지연 프로세스문의 델타 지연 20 ns : b 신호의 변화 delta cycle : process (a b c) 40 ns : b 신호의 변화
60 ns : a 신호의 변화
delta_cycle : process (a,b,c)
variable x,y,z : std_logic;
begin 60 ns : a 신호의 변화
80 ns : c 신호의 변화
begin
x := a;
y := x;y : x;
b <= y;
c <= b;시간 b c d c < b;
d <= c;
z := y;
시 b c d
20 ns ‘1’ ‘0’ ‘0’
20 ns + ‘1’ ‘1’ ‘0’ z : y;
end process;
20 ns + 1 1 0
20 ns + 2 ‘1’ ‘1’ ‘1’
65/93
프로세스문프로세스문
프로세스문의 델타 지연 프로세스문의 델타 지연
del
ta
elta
elta
elta
시간 a b c d
60 ns ‘1’ ‘0’ ‘0’ ‘0’
de de de
60 ns + ‘1’ ‘1’ ‘0’ ‘0’
60 ns + 2 ‘1’ ‘1’ ‘1’ ‘0’
del
ta
del
ta
del
ta
del
ta 60 ns + 3 ‘1’ ‘1’ ‘1’ ‘1’
20
ns
40 60 80 100 120 140
66/93
프로세스문프로세스문
지연된 프로세스( t d ) 지연된 프로세스(postponed process) postponed 예약어가 사용되는 프로세스
다음 사이클이 델타 지연이 아닐 경우만 실행 재개
현재 단계에서의 최종 델타 지연값만 가짐 현재 단계에서의 최종 델타 지연값만 가짐
델타 지연을 일으키는 문장은 사용 불가 after 예약어가 없는 경우 사용 불가 after 예약어가 없는 경우 사용 불가
논리 합성의 의도는 없음
비지연 프로세스 비지연 프로세스 일반적인 프로세스
모든 단계에서의 델타 지연값을 가짐
67/93.
프로세스문프로세스문
지연된 프로세스( t d ) 지연된 프로세스(postponed process) 최종 델타값만을 가짐
elta
de
시간 a b c d
60 ns ‘1’ ‘0’ ‘0’ ‘0’
del
ta
del
ta
del
ta 60 ns + ‘1’ ‘1’ ‘0’ ‘0’
60 ns + 2 ‘1’ ‘1’ ‘1’ ‘0’
elta
elta
del
ta
del
ta
60 ns + 3 ‘1’ ‘1’ ‘1’ ‘1’
20
d
ns
40
d
60
d
80
d
100 120 140
68/93
20 40 60 80 100 120 140
프로세스문프로세스문
지연된 프로세스의 예 지연된 프로세스의 예
postponed process (A, B)p p p ( , )
begin
if ( A = B) then( )
Z <= '1' after 2 ns;
else
Z <= '0' after 2 ns;
end if;;
end postponed process;
69/93
병렬문(concurrent statement)병렬문(concurrent statement)
블록문(bl k t t t)의 BNF 정의 블록문(block statement)의 BNF 정의
block statement ::=_
block_label :
block [ ( guard condition ) ] [ is ][ ( g _ ) ] [ ]
block_header
block declarative part_ _p
begin
block statement part_ _p
end block [ block_label ] ;
반복되는 구조의 모듈화에 주로 사용
70/93
블록문(block statement)블록문(block statement)
블록문(bl k t t t)의 BNF 정의 계속 블록문(block statement)의 BNF 정의 - 계속
block statement part ::=block_statement_part ::=
{ concurrent_statement }
block_header ::=
[ generic_clause ]
[ generic_map_aspect ; ]
[ port_clause ]
[ port_map_aspect ; ]
block declarative part ::=block_declarative_part ::=
{ block_declarative_item }
71/93
블록문(block statement)블록문(block statement)
블록문(bl k t t t)의 BNF 정의 계속 블록문(block statement)의 BNF 정의 - 계속
block declarative item ::=block_declarative_item ::=
subprogram_declaration | subprogram_body | package_body
| subprogram instantiation declaration | package declaration| subprogram_instantiation_declaration | package_declaration
| package_instantiation_declaration | shared_variable_declaration
| type declaration | subtype declaration | constant declaration| type_declaration | subtype_declaration | constant_declaration
| signal_declaration | file_declaration | alias_declaration
| component declaration | attribute declaration| component_declaration | attribute_declaration
| attribute_specification | configuration_specification
| disconnection specification | use clause| disconnection_specification | use_clause
| group_template_declaration | group_declaration
72/93
블록문(block statement)블록문(block statement)
bl k h d block header 블록의 외부 인터페이스를 표현
포트와 제네릭 선언 사용 가능
block declarative part block declarative part 프로세스 선언부와 비슷한 형식
아키텍처 선언부와 일치 아키텍처 선언부와 일치 신호, 공유 변수(shared variable) 선언 가능
콤포넌트 선언 가능 콤포넌트 선언 가능
block declarative part 병렬문으로 구성
73/93.
블록문(block statement)블록문(block statement)
블록문의 예 블록문의 예
fifoWrCntrl: block
signal flushFifoSync: std_logic;
begin
flush_gen: process (synclk, reset_syn_n)
begin
-- 중략
end process;
write_address_gen: process (synclk, reset_syn_n)
begin
-- 중략
end process;
74/93
end block;
블록문(block statement)블록문(block statement)
경호 조건( d diti ) 경호 조건(guard condition) boolean형의 guard 신호가 암시적으로 선언됨
guard 신호를 이용하여 block 내의 동작 제어
경호 조건 값이 guard 신호값을 정의 경호 조건 값이 guard 신호값을 정의
guarded 예약어를 사용하는 신호에 적용
d d 예약어를 사용하는 신호 guarded 예약어를 사용하는 신호 guard 신호가 암시적으로 선언됨
guard 신호에 경호 조건이 암시적으로 배정됨
프로세스문의 감지 리스트에 guard 신호가 선언된 것처 프로세스문의 감지 리스트에 guard 신호가 선언된 것처럼 동작
75/93.
블록문(block statement)블록문(block statement)
경호 조건을 이용하는 블록문의 예 경호 조건을 이용하는 블록문의 예
entity latch is
port(d, en : in bit; q : out bit);
end latch;
architecture behave of latch is
begin
latch_blk : block (en = '0') is
signal s : bit;
begin
s <= guarded d;
q <= s;
end block latch_blk;
76/93
end behave;
블록문(block statement)블록문(block statement)
앞장의 l t h blk 블록문과 등가인 코드 앞장의 latch_blk 블록문과 등가인 코드latch_blk : block (en = '0') is
signal s : bit;
-- signal guard : boolean;
begin -- guard <= (en = '0');
process (d, guard)
latch_blk : block (en = '0') is
signal s : bit;
begin
if guard then
begin
s <= guarded d;
s <= d;
end if;
q <= s;
end block latch_blk;
end process;
q <= s;
77/93
end block latch_blk;
병렬문(concurrent statement)병렬문(concurrent statement)
병렬 프로시저 호출문의 BNF 정의 병렬 프로시저 호출문의 BNF 정의
concurrent_procedure_call_statement ::=
내부에 순차 프로시저 호출문을 가진 프로세스와 동일
[ label : ] [ postponed ] procedure_call ;
내부에 순차 프로시저 호출문을 가진 프로세스와 동일
병렬 프로시저 호출문의 예
CheckTiming (tPLH, tPHL, Clk, D, Q); -- 병렬 프로시저 호출문
process (Clk, D, Q ) – 등가의 순차 프로시저 호출문
beginbegin
CheckTiming (tPLH, tPHL, Clk, D, Q);-- tPLH, tPHL is constant.
end process;
78/93
end process;
병렬문(concurrent statement)병렬문(concurrent statement)
병렬 주장문의 BNF 정의 병렬 주장문의 BNF 정의
concurrent assertion statement ::=concurrent_assertion_statement ::
[ label : ] [ postponed ] assertion ;
assertion ::=
assert condition
[ report expression ]
[ severity expression ]
내부에 순차 주장문을 가진 프로세스와 동일
79/93
병렬문(concurrent statement)병렬문(concurrent statement)
병렬 신호 배정문의 BNF 정의 병렬 신호 배정문의 BNF 정의
concurrent signal assignment statement ::=concurrent_signal_assignment_statement ::
[ label : ] [ postponed ] concurrent_simple_signal_assignment
| [ label : ] [ postponed ] concurrent_conditional_signal_assignment
| [ label : ] [ postponed ] concurrent_selected_signal_assignment
concurrent simple signal assignment ::=concurrent_simple_signal_assignment ::
target <= [ guarded ] [ delay_mechanism ] waveform ;
concurrent_conditional_signal_assignment ::=_ _ g _ g
target <= [ guarded ] [ delay_mechanism ] conditional_waveforms ;
concurrent_selected_signal_assignment ::=
with expression select [ ? ]
target <= [ guarded ] [ delay_mechanism ] selected_waveforms ;
80/93
내부에 순차 신호 배정문을 가진 프로세스와 동일
병렬 신호 배정문병렬 신호 배정문
병렬신호배정문의 예 왼쪽과 등가인 코드 병렬신호배정문의 예 왼쪽과 등가인 코드
X <= A and B;process ( A, B)
begin
Y <= A and B;X <= A and B;
end process;
process ( A, B)
begin
Y <= A and B;
end process;
81/93
병렬문(concurrent statement)병렬문(concurrent statement)
콤포넌트 실체화문의 BNF 정의 콤포넌트 실체화문의 BNF 정의
component_instantiation_statement ::=
instantiation_label :
instantiated_unit
[ generic_map_aspect ]
[ port_map_aspect ] ;
instantiated unit ::=instantiated_unit ::
[ component ] component_name
| entity entity name [ ( architecture identifier ) ]| entity entity_name [ ( architecture_identifier ) ]
| configuration configuration_name
82/93
콤포넌트 실체화문콤포넌트 실체화문
콤포넌트 실체화문의 BNF 정의 계속 콤포넌트 실체화문의 BNF 정의 - 계속
generic_map_aspect ::=
generic map ( generic_association_list )
port_map_aspect ::=
port map ( port association list )port map ( port_association_list )
association_list ::=
association_element { , association_element }
association element ::=association_element ::
[ formal_part => ] actual_part
83/93
콤포넌트 실체화문콤포넌트 실체화문
콤포넌트의 입출력 신호들과 다른 내부 신호들의 콤포넌트의 입출력 신호들과 다른 내부 신호들의연결 관계를 정의 먼저 아키텍처 선언부에서 사용할 콤포넌트를 선언
아키텍처 문장부에서 콤포넌트 실체화문을 사용 아키텍처 문장부에서 콤포넌트 실체화문을 사용
콤포넌트의 입출력 신호와 설계 엔티티 내의 입출력 신호 내부 신호들과의 연결 관계를 정의호, 내부 신호들과의 연결 관계를 정의 generic map aspect : 제네릭 신호들의 연결 관계 정의
port map aspect : 포트 신호들의 연결 관계 정의p p p
84/93.
콤포넌트 실체화문콤포넌트 실체화문
콤포넌트 실체화문의 예 콤포넌트 실체화문의 예
U0: FullAdder1
port map (X=>DA(0), Y=>DB(0), Cin=>Ci, Cout=>t(1), Sout=>S(0));
C0: cpu_model
generic map ("code rom.txt")ge e c p ( code_ o . )
port map (
reset n => reset n, ncs => host nCS, nd stb => host nD STB,ese _ ese _ , cs os _ CS, d_s b os _ _S ,
cpu_addr => host_addr(10 downto 1), rnw => host_RnW,
cpu data => host data(15 downto 0), ready => host Ready,cpu_d os _d ( 5 dow o 0), e dy os _ e dy,
ndma_req => ndma_req, ndma_ack => nDMA_ACK,
nirq => nIRQ);
85/93
q Q);
콤포넌트 실체화문콤포넌트 실체화문콤포넌트의 연결 콤포넌트의 연결 콤포넌트의 형식 매개변수를 실 매개변수에 연결
형식 매개변수 : formal parameter 콤포넌트 선언에 사용되는 매개변수
함수나 프로시저의 경우 해당 부프로그램 선언에 사용되는 매개변수
실 매개변수 : actual parameter 콤포넌트에 연결되는 매개변수
콤포넌트의 연결 방식 위치 연결(positional association)
콤포넌트 선언에 사용된 형식 매개변수 위치에 실 매개변수를 대응
이름 연결(named association) 선언된 위치에 무관하게 형식 매개변수에 대응되는 실 매개변수를 연결
86/93 두 방법을 모두 적용시킨 방법을 추천
.
콤포넌트 실체화문콤포넌트 실체화문
콤포넌트의 연결 예 콤포넌트의 연결 예
component half_adder
port ( a, b: in std_logic;
s, c : out std_logic);
end component;
-- 중략
U0 : half_adder port map (a=>A, b=>B, s=>open, c=>open); -- recommended
U1 : half_adder port map (s=>open, a=>A, b=>B, c=>open); -- OK
U2 : half_adder port map (A, B, open, open); -- OK
U3 : half_adder port map (B, A, open, open); -- possibly malfunction
U4 : half_adder port map (A, open, B, open); -- error
87/93
병렬문(concurrent statement)병렬문(concurrent statement)
생성문의 BNF 정의 생성문의 BNF 정의
generate_statement ::=
for_generate_statement
| if_generate_statement
| case_generate_statement
for_generate_statement ::=
generate label :generate_label :
for generate_parameter_specification generate
generate statement bodygenerate_statement_body
end generate [ generate_label ] ;
88/93
생성문생성문
생성문의 BNF 정의 계속 생성문의 BNF 정의 - 계속
if_generate_statement ::=
generate_label :
if [ alternative_label : ] condition generate
generate_statement_body
{ elsif [ alternative_label : ] condition generate
generate_statement_body }
[ else [ alternative_label : ] generate
generate_statement_body ]
end generate [ generate_label ] ;
89/93
생성문생성문
생성문의 BNF 정의 계속 생성문의 BNF 정의 - 계속
case_generate_statement ::=
generate_label :
case expression generate
case_generate_alternative
{ case_generate_alternative }
end generate [ generate_label ] ;
case_generate_alternative ::=
when [ alternative label : ] choices =>when [ alternative_label : ] choices
generate_statement_body
90/93
생성문생성문
생성문의 BNF 정의 계속 생성문의 BNF 정의 – 계속
t t t t b dgenerate_statement_body ::=
[ block_declarative_part
b i ]begin ]
{ concurrent_statement }
[ d [ lt ti l b l ] ][ end [ alternative_label ] ; ]
label ::= identifier
반복 구조와 조건적인 분기 구조를 이용한 정교화( )(elaboration) 매커니즘
이를 이용한 효율적인 회로 서술 도모
91/93
생성문생성문
생성문의 예 생성문의 예
Gen: blockGen: block
begin
L1: CELL port map (Top Bottom A(0) B(0));L1: CELL port map (Top, Bottom, A(0), B(0));
L2: for I in 1 to 3 generate
L3: for J in 1 to 3 generateL3: for J in 1 to 3 generate
L4: if I+J>4 generate
L5: CELL port map (A(I 1) B(J 1) A(I) B(J));L5: CELL port map (A(I-1),B(J-1),A(I),B(J));
end generate;
end generate;end generate;
end generate;
end block Gen;
92/93
end block Gen;
생성문생성문
반복 구조의 생성문 표현 예 반복 구조의 생성문 표현 예
반복 구조의 예-- 반복 구조의 예
U0: FullAdder1 port map (X=>A(0), Y=>B(0), Cin=>Ci, Cout=>t(1), Sout=>S(0));
U1: FullAdder1 port map (X=>A(1) Y=>B(1) Cin=>t(1) Cout=>t(2) Sout=>S(1));U1: FullAdder1 port map (X >A(1), Y >B(1), Cin >t(1), Cout >t(2), Sout >S(1));
U2: FullAdder1 port map (X=>A(2), Y=>B(2), Cin=>t(2), Cout=>t(3), Sout=>S(2));
U3: FullAdder1 port map (X=>A(3), Y=>B(3), Cin=>t(3), Cout=>Co, Sout=>S(3));
-- 반복 구조의 생성문 표현 예
gen0 : for i in 0 to 3 generate
U0: FullAdder1 port map
(X A(i) Y B(i) Ci (i) C (i 1) S S(i))(X=>A(i), Y=>B(i), Cin=>t(i), Cout=>t(i+1), Sout=>S(i));
end generate ;
t(0) <= Ci; Co <= t(4);
93/93
t(0) <= Ci; Co <= t(4);