실습 9 / 부울식 구현(결합 법칙을 이용한 논리회로 구현) 실습 9 / 부울식 구현(결합 법칙을 이용한 논리회로 구현) 결합법칙을 이용한 4입력 AND 회로 Y=ABCD
컴포넌트 : AND_2 2입력 AND 게이트 (자료흐름적 표현) 그림 (a)의 구조적 표현 : 내부 신호 사용 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY AND_2 IS PORT(A, B : IN std_logic; Y : OUT std_logic); END AND_2; ARCHITECTURE dataflow OF AND_2 IS BEGIN Y <= A and B; END dataflow;
그림(a)의 구조적 표현 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY and_4 IS PORT(A, B, C, D : IN std_logic; Y : OUT std_logic); END and_4; ARCHITECTURE structural OF and_4 IS signal ab, cd : std_logic; component AND_2 port(A, B : in std_logic; Y : out std_logic); end component; BEGIN ANDG1 : AND_2 port map(A, B, ab); ANDG2 : AND_2 port map(C, D, cd); ANDG3 : AND_2 port map(ab, cd, Y); END structural;
그림(a)의 자료흐름적 표현 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY and_4 IS PORT(A, B, C, D : IN std_logic; Y : OUT std_logic); END and_4; ARCHITECTURE dataflow OF and_4 IS BEGIN Y <= '0' WHEN (C = '0' or D = '0') ELSE '0' WHEN (A = '0' or B = '0') ELSE '1'; END dataflow;
그림(b)의 동작적 표현 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY and_4 IS PORT(A, B, C, D : IN std_logic; Y : OUT std_logic); END and_4; ARCHITECTURE behav OF and_4 IS BEGIN PROCESS(A, B, C, D) BEGIN IF (A='1' and B='1' and C='1') and D='1' THEN Y <= '1'; ELSE Y <= '0'; END IF; END PROCESS; END behav;
그림(c)의 자료흐름적 표현 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY and_4 IS PORT(A, B, C, D : IN std_logic; Y : OUT std_logic); END and_4; ARCHITECTURE dataflow OF and_4 IS BEGIN Y <= A and B and C and D; END dataflow;
분배법칙을 이용한 div_logic 논리회로 Y = AB + AC 실습 10 / 부울식 구현(분배법칙을 이용한 논리회로 구현) 분배법칙을 이용한 div_logic 논리회로 Y = AB + AC
그림 (a)의 자료흐름적 표현1 그림 (b)의 자료흐름적 표현 1 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY div_logic IS PORT(A, B, C : IN std_logic; Y : OUT std_logic); END div_logic; ARCHITECTURE dataflow OF div_logic IS BEGIN Y <= '1' WHEN A = '1' and C = '1' ELSE '1' WHEN A = '1' and B = '1' ELSE '0'; END dataflow; Y : OUT std_logic); Y <= '0' WHEN A = '0' ELSE '0' WHEN B= '0' and C = '0' ELSE '1';
그림 (a)의 자료흐름적 표현 2 그림 (b)의 자료흐름적 표현 2 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY div_logic IS PORT(A, B, C : IN std_logic; Y : OUT std_logic); END div_logic; ARCHITECTURE dataflow OF div_logic IS BEGIN Y <= (A and B) or (A and C); END dataflow; Y : OUT std_logic); Y <= A and (B or C);
자료 흐름적 표현 3(내부 신호선 사용) 그림 (a)의 자료흐름적 표현 3 그림 (b)의 자료흐름적 표현 3 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY div_logic IS PORT(A, B, C : IN std_logic; Y : OUT std_logic); END div_logic; ARCHITECTURE dataflow OF div_logic IS SIGNAL aandb, aandc : std_logic; BEGIN aandb <= A and B; aandc <= A and C; Y <= aandb or aandc; END dataflow; Y : OUT std_logic); SIGNAL borc : std_logic; borc <= B or C; Y <= borc and A;
컴포넌트 : AND_2, OR_2 VHDL 코드 2입력 AND 게이트(동작적 표현) LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY and_2 IS PORT(A, B : in std_logic; Y : out std_logic); END and_2; ARCHITECTURE behav OF and_2 IS BEGIN PROCESS(A, B) BEGIN IF A = '1' and B = '1' THEN Y <= '1'; ELSE Y <= '0'; END IF; END PROCESS; END behav; 2입력 OR 게이트(동작적 표현) LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY or_2 IS PORT(A, B : in std_logic; Y : out std_logic); END or_2; ARCHITECTURE behav OF or_2 IS BEGIN PROCESS(A, B) BEGIN IF A = '1' or B = '1' THEN Y <= '1'; ELSE Y <= '0'; END IF; END PROCESS; END behav;
그림(a)의 구조적 표현 그림 (b)의 구조적 표현 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY div_logic IS PORT(A, B, C : IN std_logic; Y : OUT std_logic); END div_logic; ARCHITECTURE structure OF div_logic IS signal ab, ac : std_logic; component AND_2 port(A, B : in std_logic; Y : out std_logic); end component; component OR_2 BEGIN ANDG1 : AND_2 port map(A, B, ab); ANDG2 : AND_2 port map(A, C, ac); ORG : OR_2 port map(ab, ac, Y); END structure; Y : OUT std_logic); signal borc : std_logic; ORG : OR_2 port map(B, C, borc); ANDG : AND_2 port map(borc, A, Y);
Example : X-OR A ab Y B cd 위 회로를 ‘자료 흐름적방법’으로 VHDL 언어로 표현하라. 동작적 방법으로 표현하라.
실습 13 / JK 플립플롭 JK 플립플롭은 출력을 1로 세트하거나 0으로 리세트할 수 있도록 하기 위하여 부가적으로 토글(Toggle) 동작을 제공한다 J K Q(t+1) Q 1 Q´ Q(t+1)=JQ’+K’Q JK 플립플롭
event 속성 논리회로 설계에서 클록 신호를 나타낼 때 클록의 상승 에지(rising edge) 또는 하강 에지(falling edge)에서 동작 즉, 클록 신호의 에지 상태에 따라 동작하는 경우에 event 속성을 사용할 수 있다. ◎ 형식 CLK'EVENT -- CLK 클록에 event가 발생하면 참값 ◦ 사용 예 CLK'EVENT and CLK = '1' -- CLK 클록이 상승 에지(rising edge)인지를 확인 CLK'EVENT and CLK = '0' -- CLK 클록이 하강 에지(falling edge)인지를 확인
동작적 표현 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY jk_ff IS PORT(J, K, CL : IN std_logic; Q : BUFFER std_logic); END jk_ff; ARCHITECTURE behav OF jk_ff IS BEGIN PROCESS(J, K, CL) BEGIN IF (CL'EVENT and CL = '1') THEN IF (J = '1' and K = '0') THEN Q <= '1'; ELSIF (J = '0' and K = '1') THEN Q <= '0'; ELSIF (J = '1' and K = '1') THEN Q <= not(Q); END IF; END IF; END PROCESS; END behav;
실습 14 / T 플립플롭 Q(t+1) = TQ’ + T’Q T Q(t+1) Q 1 Q´ (a) 진리표와 특성 방정식 T Q(t+1) Q 1 Q´ Q(t+1) = TQ’ + T’Q (a) 진리표와 특성 방정식 (b) 논리 기호
동작적 표현 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY t_ff IS PORT(T, CL : IN std_logic; Q : BUFFER std_logic); END t_ff; ARCHITECTURE behav OF t_ff IS BEGIN PROCESS(T, CL) BEGIN IF (CL'EVENT and CL = '1') THEN IF (T = '1') THEN Q <= not(Q); END IF; END IF; END PROCESS; END behav;
실습 17 / 3입력 다수결 회로 설계 3입력 다수결(majority)은 3개의 입력 중 2개 이상의 입력이 1인 경우 출력이 1이 되는 회로이다. A B C F 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 1 (b)심볼 (a)진리표 (c)간략화 및 논리식 (d)논리회로
LIBRARY IEEE; USE IEEE.std_logic_1164.all; ENTITY majority IS 동작적 표현 자료흐름적 표현 LIBRARY IEEE; USE IEEE.std_logic_1164.all; ENTITY majority IS PORT(A, B, C : in std_logic; F : out std_logic); END majority; ARCHITECTURE behav OF majority IS BEGIN PROCESS(A, B, C) variable i : integer; BEGIN i := 0; IF A = '1' THEN i := i+1; ELSE null; END IF; IF B = '1' THEN i := i+1; ELSE null; END IF; IF C = '1' THEN i := i+1; ELSE null; END IF; IF (i = 2) or (i = 3) THEN F <= '1'; ELSE F <= '0'; END IF; END PROCESS; END behav; LIBRARY IEEE; USE IEEE.std_logic_1164.all; F : out std_logic); ARCHITECTURE dataflow OF majority IS F <= (A and B) or (B and C) or (C and A); END dataflow; 동작적 표현에서 더하기 연산자(+)를 사용하여 변수 i를 이용하여 입력들의 1의 개수를 계산하여 1의 개수가 0의 개수 보다 많으면 ‘1’을 출력한다
실습 18 / 비교기 설계 A B E 0 0 0 1 1 0 1 1 1
동작적 표현 자료흐름적 표현 LIBRARY IEEE; USE IEEE.std_logic_1164.all; ENTITY comp IS PORT(A, B : in std_logic; E : out std_logic); END comp; ARCHITECTURE behav OF comp IS BEGIN PROCESS(A, B) BEGIN IF A = B THEN E <= '1'; ELSE E <= '0'; END IF; END PROCESS; END behav; E : out std_logic); ARCHITECTURE dataflow OF comp IS E <= (A and B) or (not(A) and not(B)); END dataflow; 동작적 표현에서 같음 연산자(=)를 사용하여 두 입력 A와 B를 비교하여 출력한다. 비교기는 XOR로도 간단하게 설계할 수 있다.
5.10 동작적 표현 동작적 표현은 다른 표현 방법들 중에서 가장 높은 상위 레벨의 추상적인 표현 5.10 동작적 표현 동작적 표현은 다른 표현 방법들 중에서 가장 높은 상위 레벨의 추상적인 표현 시스템의 하드웨어 구조와는 관계없이 시스템 동작을 알고리즘(algorithm) 레벨로 나타낸 것 동작적 표현은 프로세스문(process statement)을 사용하여 표현. 하드웨어에 대한 지식이 별로 없는 디자인 엔지니어가 회로 설계하거나 회로의 문서화하는 경우에 동작적 표현 방식이 좋고, 빠른 시뮬레이션 결과를 얻는데 사용한다
프로세스문(Process Statement) 프로세스문은 회로 표현을 기능적 또는 알고리즘으로 표현 프로세스문의 BEGIN ~ END 내부에서는 순차문들이 순차적으로 수행. 그러나 프로세스문 자체는 병행문이므로 프로세스문들 사이에는 병행적으로 수행. 프로세스문은 아키텍처의 BEGIN ~ END 사이에 있어야 하며 여러개의 프로세스문을 사용할 수 있다.
프로세스문 형식 ◎ 형식 [프로세스_레이블:] PROCESS [(감지_리스트)] {선언부} BEGIN ◎ 형식 [프로세스_레이블:] PROCESS [(감지_리스트)] {선언부} BEGIN {순차문} -- if문, case문, loop문 등 END PROCESS [프로세스_레이블]; ◦ 사용 예 COMPARE : PROCESS(A, B) variable Tmp : integer; -- 변수 선언 BEGIN Y <= A and B; -- 신호할당문 if A > B then X <= A; else X <= B; -- if문 end if; Tmp := 0; -- 변수할당문 END PROCESS;
프로세스_레이블(process_label)은 선택적으로 사용된다. 여러 개의 프로세스문들이 사용되는 경우에 각 프로세스문을 지정하는데 프로세스_레이블을 사용한다. 보통 하나의 프로세스문이 사용되는 경우에는 프로세스_레이블을 사용하지 않는다. 감지_리스트(sensitivity_list)는 신호들의 리스트로서, 신호들에서 적어도 하나의 신호 변화가 발생하면 프로세스문의 순차문들이 수행된다. 감지_리스트가 없으면 대기문(wait statement)이 필요하며, 감지_리스트가 있으면 대기문을 쓸 수 없다.
사용 예에서 프로세스문을 지정하기 위하여 COMPARE라는 이름의 프로세스_레이블을 사용하였고, PROCESS와 BEGIN 사이의 선언부에 변수 Tmp가 정수형으로 선언되었다. 프로세스문은 PROCESS(A, B)에서 신호 A와 B 중 적어도 하나의 신호 변화가 발생할 때 동작한다. 여기서 A와 B가 감지_리스트이다. 따라서 프로세스문은 자료흐름적 표현보다 효과적이다. 신호 할당문은 신호 할당 연산자 ‘<=’를 사용한다. A와 B 신호의 and 연산 결과가 출력 Y 값이 된다. if문에서는 A와 B 신호의 조건에 따라 X 출력 값이 결정된다. 변수 할당문은 변수할당 연산자 ‘:=’를 사용한다. 예에서는 정수 0이 변수 Tmp 값이 된다.
프로세스문의 선언부에서 허용되는 선언은 다음과 같다. 이들 선언들은 PROCESS와 BEGIN 사이에서 이루어진다. 프로세스문에서 선언부 다음에 오는 BEGIN~END 내의 문장들은 하나씩 차례로 순차적으로 수행되는 순차문의 종류는 다음과 같다. if문, case문, loop문은 프로세스문 내에서만 사용할 수 있다. ◦ 부프로그램 선언 및 몸체(subprogram declaration and body) ◦ 자료형 선언(data type declaration) ◦ 상수 선언(constant declaration) ◦ 변수 선언(variable declaration) ◦ 대기문(Wait statement) ◦ 신호할당문(Signal assignment statement) ◦ 변수할당문(Variable assignment statement) ◦ case문, exit문, if문, loop문, next문, null문 등
프로세스문에서의 신호와 변수의 차이점 신호 대입 프로세스문 내에서 신호 대입은 END PROCESS 후에 결정된다. 신호 대입 프로세스문 내에서 신호 대입은 END PROCESS 후에 결정된다. 프로세스문에서의 신호 대입은 END PROCESS 후에 결정되어 X의 값은 C가 된다. signal Y1, Y2 : std_logic; signal X : std_logic; -- 신호 X 선언 ~ PROCESS(A, B, C, X) BEGIN X <= A; Y1 <= B and X; -- Y1 <= B and C; X <= C; Y2 <= B or X; -- Y2 <= B or C; END PROCESS; END behav;
변수 대입 프로세스문 내에서 변수 대입은 PROCESS 내부, 즉 BEGIN ~ END PROCESS에서 즉시 결정된다. 프로세스문에서의 변수 대입은 PROCESS 내부에서 즉시 결정되므로 변수 X는 처음에는 A로 다음에는 C가 된다. signal Y1, Y2 : std_logic; ~ PROCESS(A, B, C, X) variable X : std_logic; -- 변수 X 선언 BEGIN X := A; Y1 <= B and X; -- Y1 <= B and A; X := C; Y2 <= B or X; -- Y2 <= B or C; END PROCESS; END behav;
변수와 신호의 차이점은 다음과 같다. 항목 변수 신호 용도 임시 저장장소 표현 회로 선(연결) 표현 영역 프로세스문(또는 부프로그램) 내 어디서나 사용 동작 프로세스문(또는 부프로그램)을 벗어나기 전 즉시 동작 END PROCESS 후 에 동작
프로세스문 프로그램 D 래치의 VHDL 표현 D 래치의 VHDL 표현에서는 프로세스문의 감지_리스트가 데이터 입력(D)와 클록 입력(CL)이 된다. 이들 값의 변화가 발생할 때마다 프로세스문은 동작하게 된다. LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY D_LATCH IS PORT(D, CL : IN std_logic; Q : OUT std_logic); END D_LATCH; ARCHITECTURE behav OF D_LATCH IS BEGIN PROCESS(D, CL) BEGIN IF CL = '1' THEN Q <= D; END IF; END PROCESS; END behav;
D 플립플롭의 VHDL 표현 D 플립플롭은 프로세스문의 감지_리스트가 단지 클록 입력(CL)만 필요하다. 왜냐하면 클록 입력값의 변화가 발생할 때만 프로세스문이 동작하면 되기 때문이다. LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY d_ff IS PORT(D, CL : IN std_logic; Q : OUT std_logic); END d_ff; ARCHITECTURE behav OF d_ff IS BEGIN PROCESS(D, CL) BEGIN IF (CL'EVENT and CL = '1') THEN Q <= D; END IF; END PROCESS; END behav;
여러 개의 프로세스문 사용 프로세스문은 동작적 표현으로 논리 시스템내의 논리 기능들을 블록별로 나타내는데 편리하다
논리 시스템은 여러 개의 블록들로 구성되어 있고, 각 블록간에는 서로 연결되어 있다. 시스템 내의 블록 단위를 병행 처리가 이루어지는 개별 프로세스로 생각할 수 있다. 프로세스문 자체는 병행문이므로 블록을 프로세스문을 설계하면 시스템의 블록들의 병행 처리는 자연스럽게 이루어진다. 그리고 프로세스문의 내부는 순차문이어서 순차 처리를 하므로, 복잡한 회로구성 구현이 용이하다. 여러 개의 블록들을 구현하기 위해서 여러 개의 프로세스문을 사용한다. 프로세스문들의 구분은 프로세스_레이블을 사용하여 프로세스 이름을 다르게 표현하면 된다. 보통 한 개의 프로세스문을 사용하는 경우에는 프로세스_레이블을 사용하지 않는다. 그림에서는 9개의 블록들이 있고 각각 p1~p9까지의 프로세스_레이블(프로세스 이름)로 구분하였다.
게이트들로 구성된 간단한 논리 시스템을 설계해보기로 한다 게이트들로 구성된 간단한 논리 시스템을 설계해보기로 한다. 이 때 게이트들 각각을 블록으로 생각하고 이들을 프로세스문으로 설계한다. 각 게이트들을 개별 프로세스로 생각할 수 있다. 즉 프로세스문은 논리 시스템의 각 게이트의 병행 처리를 담당한다. 프로세스문의 내부는 순차문이어서 순차 처리를 하므로, 복잡한 회로구성 구현이 용이하다. 프로세스 p1, p2, p3, p4, 그리고 p5는 프로그램 순서에 무관하게 병행 처리된다. 따라서 프로세스 순서를 바꾸어도 결과는 동일하게 된다.
실습 22 / 논리 게이트 시스템 설계(프로세스문 사용) 실습 22 / 논리 게이트 시스템 설계(프로세스문 사용) 각 게이트들을 개별 프로세스로 생각할 수 있다. 즉 프로세스문은 논리 시스템의 각 게이트의 병행 처리를 담당한다. 프로세스문의 내부는 순차문이어서 순차 처리를 하므로, 복잡한 회로구성 구현이 용이하다. 프로세스문은 병행 처리문이므로 프로세스 p1, p2, p3, p4, p5 등은 프로그램 순서에 무관하게 병행 처리된다. 따라서 프로세스 순서를 바꾸어도 결과는 동일하게 된다. 프로세스문을 이용한 논리 시스템
동작적 표현 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY logic_system IS PORT(A, B, C : IN std_logic; X, Y : OUT std_logic); END logic_system; ARCHITECTURE behav OF logic_system IS signal aorb, bandc, cbar : std_logic; BEGIN p1 : PROCESS(A, B) -- OR 게이트 블록 BEGIN IF A = '1' or B = '1' THEN aorb <= '1'; ELSE aorb <= '0'; END IF; END PROCESS; p2 : PROCESS(B, C) -- AND 게이트 블록 BEGIN IF A = '1' and B = '1' THEN bandc <= '1'; ELSE bandc <= '0'; END IF; p3 : PROCESS -- NOT 게이트 블록 IF C = '0' THEN cbar <= '1'; ELSE cbar <= '0'; END IF; p4 : PROCESS(aorb, cbar) -- NAND 게이트 블록 IF aorb = '1' and cbar = '1' THEN X <= '0'; ELSE X <= '1'; END IF; END PROCESS; p5 : PROCESS(bandc, cbar) -- NOR 게이트 블록 IF bandc = '0' and cbar = '0' THEN Y <= '1'; ELSE Y <= '0'; END IF; END PROCESS; END behav;
순차문(Sequential Statement) 프로세스문에서 선언부 다음에 오는 순차문은 문장이 하나씩 차례로 수행되는 문장들을 말하며 프로세스문 내에 들어가는 순차문의 종류는 다음과 같다. 대기문(Wait Statement) 대기문은 프로세스문의 수행을 잠시 중단하고 대기시킴으로서 활동과 중지 사이의 변화를 제어한다. 대기하고 있다가 신호에 변화가 있거나 조건을 만족할 경우 또는 일정한 시간이 지나면 프로세스문의 수행을 재개한다. 프로세스문에서 감지_리스트(sensitivity list)가 없는 특별한 경우에 대기문을 사용한다. ◦ 대기문(Wait statement) ◦ 신호 할당문(Signal assignment statement) ◦ 변수 할당문(Variable assignment statement) ◦ case문, exit문, if문, loop문, next문, null문 등
대기문의 형식과 사용 예 대기하다가 조건이 만족되면 다음 동작을 수행한다. 사용 예의 첫 번째 문장은 enable 신호의 다음 상승 에지(rising edge)가 될 때까지 프로세스문의 수행을 잠시 중단한다. 마찬가지로 두 번째 문장의 의미는 clock 신호가 다음 상승 에지가 발생하면 프로세스문의 수행을 재개한다. wait until은 신호의 상승 에지 또는 하강 에지(falling edge)를 검출할 때 사용한다. ◎ 형식 wait until 조건; -- 대기하다가 조건이 만족하면 수행 ◦ 사용 예 wait until enable = '1' -- enable이 ‘1’이 되면 수행 wait until clock = '1' -- clock이 ‘1’이 되면 수행
프로그램 예 : D 플립플롭 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY d_ff IS PORT(D, CL : IN std_logic; Q : OUT std_logic); END d_ff; ARCHITECTURE behav OF d_ff IS BEGIN PROCESS BEGIN WAIT UNTIL CL = '1'; Q <= D; END PROCESS; END behav;
실습 23 / D 플립플롭 (a) 진리표와 특성방정식 (b) 논리기호
동작적 표현 1 동작적 표현 2 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY d_ff IS PORT(D, CL : IN std_logic; Q : OUT std_logic); END d_ff; ARCHITECTURE behav OF d_ff IS BEGIN PROCESS(D, CL) BEGIN IF (CL'EVENT and CL = '1') THEN Q <= D; END IF; END PROCESS; END behav; Q : OUT std_logic); PROCESS BEGIN WAIT UNTIL CL = '1'; Q <= D; END PROCESS;
실습 24 / 부논리 리세트 입력을 갖는 D 플립플롭 RST D Q(t+1) 1 × D 플립플롭의 동작을 리세트(reset) 또는 클리어(clear) 입력을 사용하여 제어할 수 있다. 클록신호와 관계없이 플립플롭 출력을 리세트하는 것을 비동기식 리세트(asynchronous reset) 플립플롭이라고 하며 클록 신호에 의해 플립플롭 출력을 리세트하는 것을 동기식 리세트(synchronous reset) 플립플롭이라고 한다. RST D Q(t+1) 1 × (a) 특성표 (b) 논리기호
리세트 입력을 갖는 D 플립플롭의 VHDL 표현 비동기식 리세트 입력 방식 : 동작적 표현 동기식 리세트 입력 방식 : 동작적 표현 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY dff_rst_a IS PORT(D, RST, CL : IN std_logic; Q : OUT std_logic); END dff_rst_a; ARCHITECTURE behav OF dff_rst_a IS BEGIN PROCESS(D, RST, CL) BEGIN IF RST = '0' THEN Q <= '0'; ELSIF (CL'EVENT and CL = '1') THEN Q <= D; END IF; END PROCESS; END behav; ENTITY dff_rst_s IS Q : OUT std_logic); END dff_rst_s; ARCHITECTURE behav OF dff_rst_s IS PROCESS WAIT UNTIL CL = '1'; IF RST = '0' THEN Q <= '0'; ELSE Q <= D; END IF;
신호 할당문 순차문에서의 신호 할당문은 값을 신호에 할당하는 문장이다. 신호 할당문의 형식과 사용 예 순차문에서의 신호 할당문은 값을 신호에 할당하는 문장이다. 신호 할당문의 형식과 사용 예 신호_이름에 값이 할당된다. 순차문에서 신호 선언은 아키텍쳐의 선언부에서 이루어진다. 신호에 값을 할당하기 위해서는 신호 할당 연산자(<=)를 사용 사용 예의 프로세스문에서 감지_리스트(sensitivity list)는 A, B 그리고 S 신호이다. 이들 신호의 값이 변할 때 프로세스는 활성화되는데, 신호 대입은 END PROCESS 후에 결정된다. ◎ 형식 신호_이름 <= 값; ◦ 사용 예 PROCESS(A, B, S) BEGIN Y <= A or B ; -- 신호 Y에 (A or B)의 값을 할당 S <= '1'; -- 신호 S에 1을 할당 END PROCESS;
실습 25 / 또 다른 크기 비교기 설계 두 수의 크기 비교는 한 수가 다른 수보다 큰가, 작은가 또는 같은가를 결정하는 동작이다. 크기 비교기는 두 수, A와 B를 비교하여 그들의 상대적 크기를 결정하는 조합회로이다. 즉 비교 결과는 A > B, A = B 그리고 A < B 로 나타낼 수 있다. 4비트 크기 비교기 설계는 두 개의 4비트 입력 A와 B 그리고 크기 비교 결과를 나타내는 3개의 출력, 즉 X(A = B), Y(A > B), Z(A < B)로 구성한다. 앞에서 설계한 크기 비교기와 구분하기 위해서 이름은 MC로 한다. 입력비교 출력 A B X Y Z A = B 1 A > B A < B (a) 개념 설계 (b) 심볼 (c) 기능표
동작적 표현 LIBRARY IEEE; USE IEEE.std_logic_1164.all; ENTITY mc IS PORT( A, B : in std_logic_vector(3 downto 0); X, Y, Z : out std_logic); END mc; ARCHITECTURE behav OF mc IS BEGIN PROCESS(A, B) BEGIN IF (A=B) THEN X <= '1'; Y <= '0'; Z <= '0'; ELSIF (A>B) THEN X <= '0'; Y <= '1'; Z <= '0'; ELSE X <= '0'; Y <= '0'; Z <= '1'; END IF; END PROCESS; END behav;
변수 할당문 순차문에서 값을 할당하는 또 다른 문은 변수 할당문이다. 변수_이름에 값이 할당된다. 순차문에서 변수 선언은 프로세스문의 PROCESS와 BEGIN 사이에서 선언된다. 변수에 값을 할당하기 위해서는 변수 할당 연산자(:=)를 사용한다. 신호와 다르게 변수는 회로에서 선으로 표현되지 않는다. 그러므로 변수는 신호 사용이 불가능한 논리회로의 기능을 설명하기 위해서 사용된다. ◎ 형식 변수_이름 := 값; ◦ 사용 예 PROCESS(A, B) variable DATA : std_logic_vector(1 downto 0); BEGIN DATA := B & A; END PROCESS;
실습 26 / 디코더(Decoder) 설계 [1] 2×4 디코더 2개 입력에 따라 4개의 가능한 패턴을 내는 2×4 디코더는 n비트의 2진정보를 2n개의 서로 다른 정보로 바꿔주는 조합회로이다. 입력에서 발생할 수 있는 가능한 2진 정보 각각에 대하여 디코더의 출력이 활성화된다. 예를 들면, 3개 입력에 따라 8개의 가능한 패턴이 있으므로 8개의 출력이 필요하다(23=8). [1] 2×4 디코더 2개 입력에 따라 4개의 가능한 패턴을 내는 2×4 B A Y3 Y2 Y1 Y0 1 (a) 진리표 (b) 심볼
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY dec2x4 IS 동작적 표현 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY dec2x4 IS PORT(A, B : IN std_logic; Y : OUT std_logic_vector(3 downto 0)); END dec2x4; ARCHITECTURE behav OF dec2x4 IS BEGIN PROCESS(A, B) VARIABLE DATA : std_logic_vector(1 downto 0); BEGIN DATA := B & A; CASE DATA IS WHEN "00" => Y <= "0001"; WHEN "01" => Y <= "0010"; WHEN "10" => Y <= "0100"; WHEN OTHERS => Y <= "1000"; END CASE; END PROCESS; END behav; case문은 수식에 따라 문장을 선택한다. 여기서 수식은 변수 DATA이며 WHEN 문장의 값과 비교하여 그 문장의 수행 여부를 결정한다.
[2] 인에이블 입력을 갖는 3×8 디코더 인에이블 입력(E)을 갖고 있는 3×8 디코더를 설계해보기로 한다. E=1이면 데이터 입력에 관계없이 출력은 모드 1이 된다. E=0이면 데이터 입력에 따라 해당되는 출력은 0으로 바뀐다(부논리 동작). E C B A Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 1 × (a) 진리표 (b) 심볼
동작적 표현 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY dec3x8 IS PORT(A, B, C, E : IN std_logic; Y : OUT std_logic_vector(7 downto 0)); END dec3x8; ARCHITECTURE behav OF dec3x8 IS BEGIN PROCESS(A, B, C, E) VARIABLE DATA : std_logic_vector(2 downto 0); BEGIN DATA := C & B & A; IF (E = '0') THEN CASE DATA IS WHEN "000" => Y <= "11111110"; WHEN "001" => Y <= "11111101"; WHEN "010" => Y <= "11111011"; WHEN "011" => Y <= "11110111"; WHEN "100" => Y <= "11101111"; WHEN "101" => Y <= "11011111"; WHEN "110" => Y <= "10111111"; WHEN OTHERS => Y <= "01111111"; END CASE; ELSE Y <= "11111111"; END IF; END PROCESS; END behav;
실습 27 / 디멀티플렉서(Demultiplexer) 설계 디멀티플렉서는 하나의 데이터 입력이 있고 제어입력들의 값에 따라 출력중의 하나에 데이터 입력이 연결된다. 인에이블 입력을 갖는 디코더와 디멀티플렉서의 논리회로는 모두 근본적으로 동일하다. 디멀티플렉서의 데이터 입력은 디코더에서 인에이블 입력이다. 예를 들면, 2×4 디코더는 1×4 디멀티플렉서가 된다. 디코더에서의 2개 입력(A, B)은 제어 입력들(control inputs)이 되어 특별한 출력을 선택한다. 디코더에서의 인에이블 입력(E)은 디멀티플렉서에서는 데이터 입력이 된다.
C B A Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 E 1
동작적 표현 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY demux1x8 IS PORT(A, B, C, E : IN std_logic; Y : OUT std_logic_vector(7 downto 0)); END demux1x8; ARCHITECTURE behav OF demux1x8 IS BEGIN PROCESS(A, B, C, E) VARIABLE DATA : std_logic_vector(2 downto 0); BEGIN DATA := C & B & A; CASE DATA IS WHEN "000" => Y <= "1111111" & E; WHEN "001" => Y <= "111111" & E & "1"; WHEN "010" => Y <= "11111" & E & "11"; WHEN "011" => Y <= "1111" & E & "111"; WHEN "100" => Y <= "111" & E & "1111"; WHEN "101" => Y <= "11" & E & "11111"; WHEN "110" => Y <= "1" & E & "111111"; WHEN "111" => Y <= E & "1111111"; WHEN OTHERS => Y <= "11111111"; END CASE; END PROCESS; END behav;
if문(If Statement) else 없는 if문 if문은 조건에 따라 문장을 선택한다. if문은 다양한 논리회로를 구현하는데 많이 사용되는데, 특히 else문이 없는 경우에는 기억소자를 만든다. if문의 형식 else 없는 if문 조건이 맞으면 문장을 수행하고, 조건이 맞지 않으면 문장을 수행하지 않는다. else문이 없는 if문은 조건이 거짓일 경우 수행해야 하는 문장이 없으므로 출력은 현재의 값을 유지하게 되므로 기억소자인 래치(latch)회로를 표현된다. else문이 없는 if문도 문장이 하나인 단일문 경우와 문장이 여러 개인 다중문으로 구별할 수 있다. 단일문은 하나의 기억 소자만 만들어지고, 다중문은 문장들의 수에 따라 그 수만큼의 기억 소자들이 만들어진다. if 조건 then 문장; {문장;} end if;
else를 갖는 if문 조건이 맞으면 문장1을 수행하고, 조건이 맞지 않으면 문장2를 수행한다. [단일 if문] else를 갖는 if문은 단일 if문과 다중 if문으로 나눌 수 있다. 단일 if문은 if와 else를 하나씩 사용한다. 다중 if문은 복수개의 if와 else를 사용하는 경우와 elsif를 사용하는 경우로 나눌 수 있다. else를 갖는 if문은 멀티플렉서를 표현하는데 적합하다. 단일 if문은 2×1 MUX를 표현한다. 다중 if문은 같은 방식으로 MUX 회로를 표현한다. [단일 if문] 조건이 맞으면 문장1을 수행하고, 조건이 맞지 않으면 문장2를 수행한다. if 조건 then 문장1; {문장1;} -- 일반 if문 else 문장2; {문장2;} end if;
다중 if문 : if-else 사용 다중 if문 : if-elsif 사용 if 조건1 then 문장1; {문장1;} -- 다중 if문 else if 조건2 then 문장2; {문장2;} … … else 문장n; {문장n;} … end if; if 조건1 then 문장1; {문장1;} -- 다중 if문 elsif 조건2 then 문장2; {문장2;} … … else 문장n; {문장n;} end if;
if문의 사용 예 else 없는 if문 : 단일문 else 있는 단일 if문 else 없는 if문 : 다중문 PROCESS(d, clk) BEGIN if clk = '1' THEN q <= d; END if END PROCESS; if clk = '1' THEN q <= d; ELSE q <= '0'; PROCESS(d0, d1, clk) if clk = '1' THEN q0 <= d0; q1 <= d1; 1개의 D 래치 2개의 D 래치
실습 28 / 멀티플렉서(Muliplexer) 설계( if문 사용 ) 멀티플렉서(multiplexer, MUX)는 선택될 데이터 입력 중의 하나를 하나의 출력으로 공급하는 논리회로이다. MUX는 입력(source)으로서 2n개의 데이터 입력(data input) 중에서 하나만을 선택하는 기능으로 n개의 제어 입력(select control input)과 1개의 데이터 출력(data output)으로 이루어진 조합회로이다.
[1] 2×1 MUX 2×1 MUX는 2개의 데이터 입력, 1개의 데이터 출력 그리고 하나의 제어 신호를 가진다. S F 1 1 I0 I1 (a) 기능표 (b) 심볼 (c) 논리식 (d) 논리회로
2×1 MUX 회로의 VHDL 표현 동작적 표현 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY mux2x1 IS PORT(I : IN std_logic_vector(1 downto 0); S : IN std_logic; F : OUT std_logic); END mux2x1; ARCHITECTURE behav OF mux2x1 IS BEGIN PROCESS(I, S) BEGIN IF S = '0' THEN F <= I(0); ELSE F <= I(1); END IF; END PROCESS; END behav;
[2] 4×1 MUX S1 S0 F 0 0 0 1 1 0 1 1 I0 I1 I2 I3 (a) 기능표 (b) 심볼 F=S1'S0'I0+S1'S0I1+S1S0'I2+S1S0I3 (c) 논리식 (d) 논리회로
동작적 표현 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY mux4x1 IS PORT(I : IN std_logic_vector(3 downto 0); S : IN std_logic_vector(1 downto 0); F : OUT std_logic); END mux4x1; ARCHITECTURE behav OF mux4x1 IS BEGIN PROCESS(I, S) BEGIN IF (S = "00") THEN F <= I(0); ELSIF (S = "01") THEN F <= I(1); ELSIF (S = "10") THEN F <= I(2); ELSE F <= I(3); END IF; END PROCESS; END behav;
실습 29 / D 래치 설계 ( if문 사용) CL D Q(t+1) 1 래치(latch)는 플립플롭과 비슷하다. 플립플롭은 클록 신호의 상승 에지(정에지) 또는 하강 에지(부에지)에 동작하지만, 래치는 클록 신호의 레벨 상태에 따라 동작한다. 즉 정레벨 또는 부레벨에 따라 동작하는 메모리 요소를 래치라고 한다. 여기서는 정레벨에 따라 동작하는 D 래치를 설계하기로 한다. (a) 클록 신호 CL D Q(t+1) 1 (b) 진리표 (c) 논리기호
동작적 표현 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY D_LATCH IS PORT(D, CL : IN std_logic; Q : OUT std_logic); END D_LATCH; ARCHITECTURE behav OF D_LATCH IS BEGIN PROCESS(D, CL) BEGIN IF CL = ‘1' THEN Q <= D; END IF; END PROCESS; END behav;
Case문(Case Statement) 논리식과 when 문장의 논리값과 비교하여 그 문장의 수행 여부를 결정한다. 즉 논리식과 논리값1이 같으면, 문장1을 실행한다. 그런데 이들 when문들은 순차적으로 실행되는 것이 아니라 모두 동시에 병행적으로 처리된다. case문은 논리식과 모든 논리값들을 동시에 비교하여 같은 논리값에 해당되는 문장을 수행하므로 똑같은 논리값이 기술되면 에러가 된다. when의 논리값을 여러 값으로 표현할 때는 ‘|’를 사용하여 표현한다. 마지막으로 when others 문장은 앞의 when 문장에서 나열되지 않은 논리값들의 모두를 나타낸다. 따라서 이 문장을 사용하지 않으면 에러가 발생된다. ■ 형식 case 논리식 is when 논리값1 => 문장1; when 논리값21 | 논리값22 => 문장2; ... when 논리값n => 문장n; when others => 문장; end case;
case문의 사용 예 : 진리표 구현 S의 값이 “000”, “100” 그리고 “101”일 때 모두 Y에 ‘0’을 대입하고, S의 값이 “001”, “010” 그리고 “011”일 때 모두 Y에 ‘1’을 대입한다. 앞의 두 가지 선택들이 아닌 모든 나머지 경우에는 Y에 무시항 ‘-’를 대입한다. 만일 when others 대신 다음과 같이 사용하는 경우를 생각해보기로 한다. ARCHITECTURE behav OF truth_table IS SIGNAL S : STD_LOGIC_VECTOR(2 downto 0); BEGIN S <= A & B & C; -- concatenate A, B, C case S is when "000" | "100" | "101" => Y <= '0'; when "001" | "010" | "011" => Y <= '1'; when others => Y <= '-'; end case; A B C Y 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 1 ×
ARCHITECTURE behav OF truth_table IS SIGNAL S : STD_LOGIC_VECTOR(2 downto 0); BEGIN S <= A & B & C; -- concatenate A, B, C case S is when "000" | "100" | "101" => Y <= '0'; when "001" | "010" | "011" => Y <= '1'; when "110" | "111" => Y <= '-'; end case; 이 경우 상식적으로 WHEN OTHERS를 WHEN “110” | “111”로 프로그램 하는 것이 8개의 논리값을 다 표현했으므로 합리적으로 보일 수도 있으나, 이 경우 에러가 발생한다. 왜냐하면 신호 S를 std_logic_vector 자료형으로 정했는데 이 자료형은 9가지의 다른 값 형태들이 존재한다. 따라서 S가 3비트로 선언되어 있으므로 9×9×9=729개의 값 형태들이 있으므로 앞서 표현한 8개의 논리값을 빼면 721개는 표현하지 않게 되므로 에러가 발생한다. OTHERS로 프로그램 하는 것이 에러를 제거할 수 있다.
Example 2×1 MUX 4×1 MUX case sel is when '0' => f <= in0; when others => f <= in1; end case; when "00" => f <= in0; when "01" => f <= in1; when "10" => f <= in2; when others => f <= in3;
실습 30 / 멀티플렉서 설계( case문 사용 ) [1] 2×1 MUX 동작적 표현 [1] 2×1 MUX 동작적 표현 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY mux2x1 IS PORT(I : IN std_logic_vector(1 downto 0); S : IN std_logic ; F : OUT std_logic); END mux2x1; ARCHITECTURE behav OF mux2x1 IS BEGIN PROCESS(I, S) BEGIN CASE S IS WHEN '0' => F <= I(0); WHEN OTHERS => F <= I(1); END CASE; END PROCESS; END behav;
[2] 4×1 MUX 동작적 표현 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY mux4x1 IS PORT(I : IN std_logic_vector(3 downto 0); S : IN std_logic_vector(1 downto 0); F : OUT std_logic); END mux4x1; ARCHITECTURE behav OF mux4x1 IS BEGIN PROCESS(I, S) BEGIN CASE S IS WHEN "00“ => F <= I(0); WHEN "01" => F <= I(1); WHEN "10“ => F <= I(2); WHEN OTHERS => F <= I(3); END CASE; END PROCESS; END behav;
실습 31 / 인코더(encoder) 설계(case문 사용) 인코더(encoder)는 디코더와 반대되는 동작을 하는 디지털 회로이다. 인코더는 2n(또는 그 이하)의 입력선과 n개의 출력선을 갖는다. 출력선은 입력값에 대한 2진 코드를 발생시킨다. D7 D6 D5 D4 D3 D2 D1 D0 Y2 Y1 Y0 0 1 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 (b) 심볼 (a) 진리표
동작적 표현 LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY enc8x3 IS PORT(D : IN std_logic_vector(7 downto 0); Y : OUT std_logic_vector(2 downto 0)); END enc8x3; ARCHITECTURE behav OF enc8x3 IS BEGIN PROCESS(D) BEGIN CASE D IS WHEN "00000001" => Y <= "000"; WHEN "00000010" => Y <= "001"; WHEN "00000100" => Y <= "010"; WHEN "00001000" => Y <= "011"; WHEN "00010000" => Y <= "100"; WHEN "00100000" => Y <= "101"; WHEN "01000000" => Y <= "110"; WHEN "10000000" => Y <= "111"; WHEN OTHERS => Y <= "---"; END CASE; END PROCESS; END behav;
Loop문 [레이블:] loop -- 조건이 없으므로 끝까지 수행 {순차문} end loop [레이블]; Loop문은 순차문을 반복적으로 실행할 때 사용한다. loop문은 어떤 조건 없이 끝까지 반복하는 단순 loop문이 있다. 그리고 반복적인 수행에서 벗어나기 위해서는 loop에 for문을 첨가한 for-loop문과 while의 조건을 추가한 while-loop문이 있다. 조건이 없으므로 끝까지 수행하고 루프를 빠져 나오기 위해서는 반드시 exit문 또는 next문이 필요하다. [레이블:] loop -- 조건이 없으므로 끝까지 수행 {순차문} end loop [레이블];
for-loop문 while-loop문 for-loop문은 루프_변수가 1씩 증가(또는 감소)하면서, 변수_범위 끝까지 도달할 때까지 순차문을 반복 처리한다. 따라서 루프_변수는 다른 객체로 정의되지 말아야 하며 반드시 for-loop문의 루프 변수로서 쓰여져야 한다. 루프_변수는 자동적으로 정수형(integer)으로 선언되므로 따로 선언할 필요가 없다. while-loop문 while-loop문은 조건이 참(true)이면 순차문을 수행하고, 거짓(false)이면 루프를 빠져 나온다. 반복 횟수가 정의되지 않으면 논리 합성은 이루어지지 않는다. [레이블:] for 루프_변수 in 변수_범위 loop -- 변수_범위 끝까지 수행 {순차문} end loop [레이블]; [레이블:] while 조건 loop -- 조건이 참인 동안에 수행 {순차문} end loop [레이블];
loop문의 사용 예 단순 loop For-loop문 variable A, B : integer; ~ A := 0; ~ A := 0; B := 0; loop1: loop A := A + 1; B := B + A; exit loop1 when A > 5; end loop loop1; For-loop문 variable B : integer; ~ B := 0; loop1: for A in 1 to 5 loop -- 변수_범위 1 to 5 B := B + A; end loop loop1;
[while-loop문 ] variable A, B : integer; ~ A := 0; B := 0; ~ A := 0; B := 0; loop1: while A <= 5 loop A := A + 1; B := B + A; end loop loop1;
실습 32 / 4입력 NAND 게이트와 4입력 NOR 게이트 동작적 표현 LIBRARY IEEE; USE IEEE.std_logic_1164.all; ENTITY nandn IS PORT(X : in std_logic_vector(n-1 downto 0); Y : out std_logic); END nandn; ARCHITECTURE behav OF nandn IS BEGIN PROCESS(X) VARIABLE tmp : STD_LOGIC; BEGIN tmp := X(0); AND_BITS : FOR i IN 1 TO 3 LOOP tmp := tmp AND X(i); END LOOP AND_BITS; Y <= not(tmp); END PROCESS; END behav;
[2] 4입력 NOR 게이트 동작적 표현 LIBRARY IEEE; USE IEEE.std_logic_1164.all; ENTITY norn IS PORT(X : in std_logic_vector(n-1 downto 0); Y : out std_logic); END norn; ARCHITECTURE behav OF norn IS BEGIN PROCESS(X) VARIABLE tmp : STD_LOGIC; BEGIN tmp := X(0); AND_BITS: FOR i IN 1 TO 3 LOOP tmp := tmp OR X(i); END LOOP AND_BITS; Y <= not(tmp); END PROCESS; END behav;
기타 제어문 : exit문, next문 exit문의 형식 exit 루프_레이블 [when 조건]; loop문의 루프 내에서 exit문이 수행되려면, 조건이 참(true)이면 루프_레이블로 빠져 나온다. 즉 loop문의 루프 내에서 exit문을 만나면 다음에 있는 문장들은 무시하고 루프를 빠져 나온다. exit문은 루프 내에서 단 한 번만 사용되고 루프 밖에서 사용할 수 없다. exit 루프_레이블 [when 조건]; loop1: loop A := A + 1; B := B + A; if A > 5 then exit loop1; end loop loop1; loop1: loop A := A + 1; B := B + A; exit loop1 when A > 5; end loop loop1;
next문의 형식 loop문의 루프 내에서 next문이 수행되려면, 조건이 참(true)이면 루프_레이블로 빠져 나온다. 즉 loop문의 루프 내에서 next문을 만나면 다음에 있는 문장들은 무시하고 루프를 빠져 나온다. next문은 루프 내에서 단 한 번만 사용되고 루프 밖에서 사용할 수 없다. next [루프_레이블] [when 조건]; loop1: for i in 1 to 5 loop loop2: for j in 1 to 5 loop if j = 3 then next loop1; end if; A := A + 1; end loop loop2; end loop loop1; (예제) loop1: for i in 1 to 5 loop loop2: for j in 1 to 5 loop next loop1 when j = 3; A := A + 1; end loop loop2; end loop loop1;
Null문 null문은 아무 것도 수행하지 않고 수행을 다음 문장으로 넘겨주기 위해서 사용된다. 즉 null문은 아무런 동작이 일어나지 않는 경우에 사용된다. null문의 형식과 사용 예 ◎ 형식 null; ○ 사용 예 case sel is when ‘0’ => out <= in1; when ‘1’ => out <= in2; when others => null; end case;
실습 33 / 패리티(Parity) 회로 설계 패리티 비트는 2진 정보(binary information) 전송할 때 발생하는 오류를 검출하는 기법으로서, 패리티 비트(parity bit)를 포함한 정보가 수신단에 전송되어 오류검출을 위해 이용된다. 전송되는 정보에서 1의 개수가 짝수가 되게 만들면 짝수 패리티(even parity)라 하고, 1의 개수가 홀수가 되게 만들면 홀수 패리티(odd parity)라고 한다. 검사된 패리티가 전송된 것과 일치하지 않으면 오류가 검출된다. 전송기에 패리티를 만들어내는 회로를 패리티 발생기(parity generator)라 하고, 수신 쪽에 패리티를 검사하는 회로를 패리티 검사기(parity checker)라 하며 이들을 패리티 회로라고 한다.
[1] 짝수 패리티 발생기(Even Parity Generator) 3비트 메시지 X Y Z 패리티비트 메시지 P 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 1 (c) 회로도 (a) 진리표 P=X⊕Y⊕Z (d) 논리식 (b) 심볼 3비트 X, Y, 및 Z는 정보를 구성하며 회로 입력이다. 패리티 비트 P는 회로 출력이다. 짝수 패리티에 대해서 비트 P는 전체 1의 개수가 짝수가 되도록 만들어져야 한다(P 포함). 그러므로 P는 3변수 XOR 함수로 표현될 수 있다.
짝수 패리티 발생기 회로의 VHDL 표현 동작적 표현 LIBRARY IEEE; USE IEEE.std_logic_1164.all; ENTITY parity_gen_even IS PORT(X, Y, Z : in std_logic; P : out std_logic); END parity_gen_even; ARCHITECTURE behav OF parity_gen_even IS BEGIN PROCESS(X, Y, Z) VARIABLE i : integer; BEGIN i := 0; IF X = '1' THEN i := i + 1; ELSE null; END IF; IF Y = '1' THEN i := i + 1; ELSE null; END IF; IF Z = '1' THEN i := i + 1; ELSE null; IF (i = 1) or (i = 3) THEN P <= '1'; ELSE P <= '0'; END PROCESS; END behav;
[2] 패리티 검사기(Parity Checker) 패리티 비트를 포함한 정보에서 3비트 목적지에 전송되며, 그 목적지에서는 전송 시 오류 검출을 위해 패리티 검사기 회로가 첨가된다. 정보가 짝수 패리티를 가지고 전송되기 때문에 수신된 4비트는 짝수개의 1을 가져야 한다. 수신된 4비트가 홀수개의 1을 가지면 전송 시 오류가 발생한 것이며, 전송 시 1비트의 값이 바뀐 것을 의미한다. C로 표시된 패리티 검사기의 출력은 오류가 발생하면, 즉 수신된 4비트가 홀수개의 1을 가지면 1이 될 것이다.
C=X ⊕Y ⊕Z ⊕P 4비트를 수신 X Y Z P 패리티오류체크 C 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 1 C=X ⊕Y ⊕Z ⊕P (a) 진리표 (b) 심볼, 논리식 그리고 회로도
(패리티 검사기) 동작적 표현 LIBRARY IEEE; USE IEEE.std_logic_1164.all; ENTITY parity_check_even IS PORT(X, Y, Z, P : in std_logic; C : out std_logic); END parity_check_even; ARCHITECTURE behav OF parity_check_even IS BEGIN PROCESS(X, Y, Z, P) variable i : integer; BEGIN i := 0; IF X = '1' THEN i := i + 1; ELSE null; END IF; IF Y = '1' THEN i := i + 1; ELSE null; IF Z = '1' THEN i := i + 1; ELSE null; IF P = '1' THEN i := i + 1; ELSE null; IF (i = 1) or (i = 3) THEN C <= '1'; ELSE C <= '0'; END PROCESS; END behav;
Return문 return문은 함수와 같은 부프로그램의 몸체에만 있을 수 있으며, 부프로그램을 수행한 후 호출한 문장으로 되돌아 갈 경우에만 사용된다. return문의 형식 return [리턴값];