VHDL을 이용한 디지털 회로 설계

Download Report

Transcript VHDL을 이용한 디지털 회로 설계

상태 기계
IT CookBook, VHDL을 이용한 디지털 회로 설계
학습목표
유한 상태 기계(무어 머신과 밀리 머신) 이해
설계 유형을 통한 상태 기계 이해
여러 상태 기계 설계
목차
1. 서론
2. 설계 스타일 #1
3. 설계 스타일 #2(저장되는 출력)
4. 인코딩 스타일:
이진 코드부터 OneHot까지
Section 8.0 들어가면서
 FSM(Finite State Machine, 유한 상태 기계)
• 순차 논리 회로를 위한 특별한 모델링 기술
- 어떤 순차 회로라도 FSM으로 모델링하여 설계할 수 있으나,
- 경우에 따라서는 기존 방식 보다 코드가 길고 복잡해지고 오류 발생 가능성이 커지기도 한다.
- 카운터와 같은 간단한 기록(저장) 회로를 포함하고 있는 경우에 종종 발생
• 시스템 형태의 설계에 매우 유용
- 잘 정의된 시퀀스(모든 상태를 쉽게 열거 가능)를 만드는 임무를 맡은 시스템(예: 디지털
컨트롤러)에 적합
- 즉, 전형적인 FSM 구현시, ARCHITECTURE 처음 부분에 모든 가능한 시스템 상태 리스트를
포함한 사용자 정의 열거형 데이터 타입을 볼 수 있다.
• 메모리가 사용된다고 모든 회로가 순차 회로는 아니다.
- 아닌 경우의 예 : RAM
Section 8.1 서론
 단일 위상의 상태 기계
• 조합 논리(상반부)와 순차 논리(하반부)로 구성, 이에 따라 분리하여 설계
- 조합 논리 부분: 2개의 입력(외 부입력, pr_state), 2개의 출력(외부 출력, nx_state)
- 순차 논리 부분: 3개의 입력(클록, 리셋, nx_state), 1개의 출력(pr_state)
순차 부분에 FF이 있기 때문에, 이를 제어하기 위해 클록과 리셋이 연결되어 있다.
[그림 8-1] 밀리(무어) 상태 기계의 블록도
• 밀리 머신(Mealy machine)
- 출력이 현재 상태와 현재 입력에 따라 결정되는 상태 기계
• 무어 머신(Moore machine)
- 출력이 현재 상태에 따라서만 결정되는 상태 기계
Section 8.2 설계 스타일 #1
 상태 기계의 하반부와 상반부를 완전히 분리하여 설계(그림 8-1 참조)
• 기계의 모든 상태는 열거형 데이터 타입을 사용하여 항상 명확하게 선언
• 설계를 데이터 저장 관점에서 검토하여 설계 스타일 #2로 발전시킴
 (순차적인) 하반부 설계
• 전형적인 설계 템플릿
- 입력 : FF이 있으므로 클록, 리셋 사용. nx_state(다음 상태), 출력 : pr_state(현재 상태)
PROCESS (reset, clock)
BEGIN
IF (reset='1') THEN
pr_state <= state0;
ELSIF (clock'EVENT AND clock='1') THEN
pr_state <= nx_state;
END IF;
END PROCESS;
- 시스템 초기 상태(state0)를 결정하는 비동기 리셋
- 클록의 상승 천이에서 nx_state이 동기식으로 저장되고, 이를 pr_state에 전달
• 장점
- 하반부 설계를 표준화시킴
- 레지스터 수를 최소화 : 필요한 FF 수 = 모든 상태 인코딩에 필요한 비트수 = log2n (n은 상태 수)
Section 8.2 설계 스타일 #1
 (조합적인) 상반부 설계
• 전형적인 설계 템플릿
- 순수하게 조합적이므로 병행 코드를 그냥 사용 가능하고, (순차적인) PROCESS 문도 사용 가능
PROCESS (input, pr_state)
BEGIN
CASE pr_state IS
WHEN state0 =>
IF (input = ...) THEN
output <= <value>;
nx_state <= state1;
ELSE ...
END IF;
WHEN state1 =>
IF (input = ...) THEN
output <= <value>;
nx_state <= state2;
ELSE ...
END IF;
...
END CASE;
END PROCESS;
어떤 신호의 천이 시점에서의 신호 할당은 없고,
따라서 어떠한 FF도 유도되지 않음(7.5절)
규칙 1: 감지 리스트에 모든 입력 존재
규칙 2: 모든 입력/출력 조합이 코드에 포함
- 기능 : 출력 값을 할당, 다음 상태를 정함
- 순차문 사용 조합 회로 설계 관련 규칙 1, 규칙 2(6.10절)을 잘 시킴
Section 8.2 설계 스타일 #1
 설계 스타일 #1을 위한 완전한 상태 기계 템플릿
• 가능한 모든 상태를 사용자 정의 열거형 데이터 타입으로 선언
LIBRARY ieee;
USE ieee.std_logic_1164.all;
--------------------------------------------------------ENTITY <entity_name> IS
PORT ( input: IN <data_type>;
reset, clock: IN STD_LOGIC;
output: OUT <data_type>);
END <entity_name>;
--------------------------------------------------------ARCHITECTURE <arch_name> OF <entity_name> IS
TYPE state IS (state0, state1, state2, state3, ...);
SIGNAL pr_state, nx_state: state;
BEGIN
---------- 하반부: -------------------------------------PROCESS (reset, clock)
BEGIN
IF (reset='1') THEN
pr_state <= state0;
ELSIF (clock'EVENT AND clock='1') THEN
pr_state <= nx_state;
END IF;
END PROCESS;
---------- 상반부: -----------------------PROCESS (input, pr_state)
BEGIN
CASE pr_state IS
WHEN state0 =>
IF (input = ...) THEN
output <= <value>;
nx_state <= state1;
ELSE ...
END IF;
WHEN state1 =>
IF (input = ...) THEN
output <= <value>;
nx_state <= state2;
ELSE ...
END IF;
...
END CASE;
END PROCESS;
END <arch_name>;
Section 8.2 설계 스타일 #1
 (예제 8.1) BCD 카운터(0~9의 순환 카운터)
• 무어 머신: 저장된 (현재) 상태에 의해서만 출력이 결정
• 레지스터 수 = log210 = 4
• 단순한 기록 회로, sequencer
- 전통적인 방식 : LOOP 문 사용으로 간결하게 설계
- FSM 방식 : 상태 수가 많아지면, 이 모두를 열거해야 하므로 번거로우나, 정형화된 표준 설계
[그림 8-2] BCD 카운터의 상태도
Section 8.2 설계 스타일 #1
 (예제 8.1) BCD 카운터의 VHDL 코드
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
------------------------------------------------LIBRARY ieee;
USE ieee.std_logic_1164.all;
------------------------------------------------ENTITY counter IS
PORT ( clk, rst: IN STD_LOGIC;
count: OUT STD_LOGIC_VECTOR (3 DOWNTO 0));
END counter;
------------------------------------------------ARCHITECTURE state_machine OF counter IS
TYPE state IS (zero, one, two, three, four,
five, six, seven, eight, nine);
SIGNAL pr_state, nx_state: state;
BEGIN
------------- 하반부: ----------------PROCESS (rst, clk)
BEGIN
IF (rst='1') THEN
pr_state <= zero;
ELSIF (clk'EVENT AND clk='1') THEN
pr_state <= nx_state;
END IF;
END PROCESS;
24 ------------- 상반부: -------------------------25
PROCESS (pr_state)
26
BEGIN
27
CASE pr_state IS
28
WHEN zero =>
29
count <= "0000";
30
nx_state <= one;
31
WHEN one =>
32
count <= "0001";
33
nx_state <= two;
34
WHEN two =>
35
count <= "0010";
36
nx_state <= three;
-------------------------------------------------------------------- 37 – 54 행 생략 ------------------------------------------------------------------55
WHEN nine =>
56
count <= "1001";
57
nx_state <= zero;
58
END CASE;
59
END PROCESS;
60 END state_machine;
61 -------------------------------------------------
Section 8.2 설계 스타일 #1
 (예제 8.2) 간단한 FSM #1
[그림 8-4] 간단한 FSM #1
Section 8.2 설계 스타일 #1
 (예제 8.2) 간단한 FSM #1의 VHDL 코드
1 ---------------------------------------------2 ENTITY simple_fsm IS
3
PORT ( a, b, d, clk, rst: IN BIT;
4
x: OUT BIT);
5 END simple_fsm;
6 ---------------------------------------------7 ARCHITECTURE simple_fsm OF simple_fsm IS
8
TYPE state IS (stateA, stateB);
9
SIGNAL pr_state, nx_state: state;
10 BEGIN
11 ---------- 하반부: ---------------------12
PROCESS (rst, clk)
13
BEGIN
14
IF (rst='1') THEN
15
pr_state <= stateA;
16
ELSIF (clk'EVENT AND clk='1') THEN
17
pr_state <= nx_state;
18
END IF;
19
END PROCESS;
20 ---------- 상반부: -----------------------------------21
PROCESS (a, b, d, pr_state)
22
BEGIN
23
CASE pr_state IS
24
WHEN stateA =>
25
x <= a;
26
IF (d='1') THEN nx_state <= stateB;
27
ELSE nx_state <= stateA;
28
END IF;
29
WHEN stateB =>
30
x <= b;
31
IF (d='1') THEN nx_state <= stateA;
32
ELSE nx_state <= stateB;
33
END IF;
34
END CASE;
35
END PROCESS;
36 END simple_fsm;
37 --------------------------------------------------------
- Report file을 보면, 예상대로 2개의 상태만이 인코딩되어 있어 단 1개의 FF만이 필요함을 검증
- 입력에 따라 결정되는 출력(x)은 clk와 상관없이 a, b에 따라 변화하므로 상반부는 진정 조합적
- 동기적인 출력이 필요하면 설계 스타일 #2 선택할 것
Section 8.3 설계 스타일 #2(저장되는 출력)
 설계 스타일 #1
• (예) 앞서의 밀리 머신(현재 입력에 따라 출력이 결정)
- 비동기식 출력(입력이 바뀔 때마다 출력이 바뀜)
[그림 8-6] (a) 설계 스타일 #1, (b) 설계 스타일 #2
설계 스타일 #2
• (예) 동기식 밀리 머신
- 클록에 동기화하여 출력이 갱신(따라서 출력 저장 필요)
• 설계 스타일 #1과 달라지는 점
- 조합 회로의 출력을 위한 신호(예: temp)를 추가시키고(상반부),
- 클록 이벤트 발생시, 이를 실제 출력에 전달(하반부)
Section 8.3 설계 스타일 #2(저장되는 출력)
 설계 스타일 #2를 위한 완전한 상태 기계 템플릿
• clk’EVENT 발생시에만 temp가 출력에 전달되기 때문에 출력을 저장하는 결과
LIBRARY ieee;
USE ieee.std_logic_1164.all;
------------------------------------------------------ENTITY <ent_name> IS
PORT (input: IN <data_type>;
reset, clock: IN STD_LOGIC;
output: OUT <data_type>);
END <ent_name>;
------------------------------------------------------ARCHITECTURE <arch_name> OF <ent_name> IS
TYPE states IS (state0, state1, state2, ...);
SIGNAL pr_state, nx_state: states;
SIGNAL temp: <data_type>;
BEGIN
---------- 하반부: -----------------------------------PROCESS (reset, clock)
BEGIN
IF (reset'1') THEN
pr_state <= state0;
ELSIF (clock'EVENT AND clock='1') THEN
output <= temp;
pr_state <= nx_state;
END IF;
END PROCESS;
---------- 상반부: ----------------------------------------PROCESS (pr_state)
BEGIN
CASE pr_state IS
WHEN state0 =>
temp <= <value>;
IF (condition) THEN nx_state <= state1;
...
END IF;
WHEN state1 =>
temp <= <value>;
IF (condition) THEN nx_state <= state2;
...
END IF;
WHEN state2 =>
temp <= <value>;
IF (condition) THEN nx_state <= state3;
...
END IF;
...
END CASE;
END PROCESS;
END <arch_name>;
Section 8.3 설계 스타일 #2
 (예제 8.3) 간단한 FSM #2
• 예제 8.2의 설계를 고쳐서, 출력이 동기식(클록 상승시에만 바뀜)
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
-------------------------------------------------ENTITY simple_fsm IS
PORT ( a, b, d, clk, rst: IN BIT;
x: OUT BIT);
END simple_fsm;
-------------------------------------------------ARCHITECTURE simple_fsm OF simple_fsm IS
TYPE state IS (stateA, stateB);
SIGNAL pr_state, nx_state: state;
SIGNAL temp: BIT;
BEGIN
---------- 하반부: ------------------------------PROCESS (rst, clk)
BEGIN
IF (rst='1') THEN
pr_state <= stateA;
ELSIF (clk'EVENT AND clk='1') THEN
x <= temp;
pr_state <= nx_state;
END IF;
END PROCESS;
22 ---------- 상반부: ------------------------------------23
PROCESS (a, b, d, pr_state)
24
BEGIN
25
CASE pr_state IS
26
WHEN stateA =>
27
temp <= a;
28
IF (d='1') THEN nx_state <= stateB;
29
ELSE nx_state <= stateA;
30
END IF;
31
WHEN stateB =>
32
temp <= b;
33
IF (d='1') THEN nx_state <= stateA;
34
ELSE nx_state <= stateB;
35
END IF;
36
END CASE;
37
END PROCESS;
38 END simple_fsm;
39 ---------------------------------------------------------
- Report file을 보면, 2 개의 FF(기계 상태 인코딩을 위해 1개, 출력 저장을 위해 1개) 확인 가능
Section 8.3 설계 스타일 #2
 (예제 8.4) 비트열 검출기
• 입력의 직렬 비트열 중 “111”의 시퀀스 발생시마다 출력은 ‘1’
- (예) 입력 시퀀스 …0111110…에 대해 출력은 3개의 클록 사이클 동안 연속적으로 ‘1’
[그림 8-8] 비트 검출기의 상태도
Section 8.3 설계 스타일 #2
 (예제 8.4) 비트열 검출기의 VHDL 코드 : 설계 스타일 #1
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
--------------------------------------------------LIBRARY ieee;
USE ieee.std_logic_1164.all;
--------------------------------------------------ENTITY string_detector IS
PORT ( d, clk, rst: IN BIT;
q: OUT BIT);
END string_detector;
--------------------------------------------------ARCHITECTURE my_arch OF string_detector IS
TYPE state IS (zero, one, two, three);
SIGNAL pr_state, nx_state: state;
BEGIN
---------- 하반부: ------------------------------PROCESS (rst, clk)
BEGIN
IF (rst='1') THEN
pr_state <= zero;
ELSIF (clk'EVENT AND clk='1') THEN
pr_state <= nx_state;
END IF;
END PROCESS;
23 ---------- 상반부: ----------------------------------24
PROCESS (d, pr_state)
25
BEGIN
26
CASE pr_state IS
27
WHEN zero =>
28
q <= '0';
29
IF (d='1') THEN nx_state <= one;
30
ELSE nx_state <= zero;
31
END IF;
----------------------------------------------------------------------- 32-41 행 생략 -----------------------------------------------------------------------------------42
WHEN three =>
43
q <= '1';
44
IF (d='0') THEN nx_state <= zero;
45
ELSE nx_state <= three;
46
END IF;
47
END CASE;
48
END PROCESS;
49 END my_arch;
50 -------------------------------------------------------
- 출력(q)는 현재 입력(d)에 의존적이지 않다(즉, 출력( q)에 대한 할당은 모두 무조건적).
- 따라서, 출력은 자동적으로 동기적이고(무어 머신), 설계 스타일 #2는 불필요
Section 8.3 설계 스타일 #2
 (예제 8.5) 교통 제어 신호기(Traffic Light Controller)
• 60 Hz 클록 사용 가정
• 대기 모드(standby mode)
- 양방향 Yellow Light
- stby가 비활성화될 때까지
• 평시 모드(regular mode)
- 4 가지 상태 : RY, GR, YR, RG
- 동작 시간은 CONSTANT로 전달
• 테스트 모드
- 시스템 테스트(상태 당 1초씩)
- 이미 프로그램된 모든 설정 시간을
작은 값으로 고쳐 사용
- 동작 시간은 CONSTANT로 전달
[그림 8-10] TLC의 명세 및 상태도(평시 모드)
Section 8.3 설계 스타일 #2
 (예제 8.5) TLC의 VHDL 코드 : 설계 스타일 #1
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
--------------------------------------------------------LIBRARY ieee;
USE ieee.std_logic_1164.all;
--------------------------------------------------------ENTITY tlc IS
PORT ( clk, stby, test: IN STD_LOGIC;
r1, r2, y1, y2, g1, g2: OUT STD_LOGIC);
END tlc;
--------------------------------------------------------ARCHITECTURE behavior OF tlc IS
CONSTANT timeMAX : INTEGER := 2700;
CONSTANT timeRG : INTEGER := 1800;
CONSTANT timeRY : INTEGER := 300;
CONSTANT timeGR : INTEGER := 2700;
CONSTANT timeYR : INTEGER := 300;
CONSTANT timeTEST : INTEGER := 60;
TYPE state IS (RG, RY, GR, YR, YY);
SIGNAL pr_state, nx_state: state;
SIGNAL time : INTEGER RANGE 0 TO timeMAX;
21 -------- 상태 기계의 하반부: -------------------22
PROCESS (clk, stby)
23 VARIABLE count : INTEGER RANGE
0 TO timeMAX;
24
BEGIN
25
IF (stby='1') THEN
26
pr_state <= YY;
27
count := 0;
28
ELSIF (clk'EVENT AND clk='1') THEN
29
count := count + 1;
30
IF (count = time) THEN
31
pr_state <= nx_state;
32
count := 0;
33
END IF;
34
END IF;
35
END PROCESS;
Section 8.3 설계 스타일 #2
 (예제 8.5) TLC의 VHDL 코드 : 설계 스타일 #1
36 -------- 상태 기계의 상반부: -----------------------37
PROCESS (pr_state, test)
38
BEGIN
39
CASE pr_state IS
40
WHEN RG =>
41
r1<='1'; r2<='0'; y1<='0'; y2<='0';
g1<='0'; g2<='1';
42
nx_state <= RY;
43
IF (test='0') THEN time <= timeRG;
44
ELSE time <= timeTEST;
45
END IF;
46
WHEN RY =>
47
r1<='1'; r2<='0'; y1<='0'; y2<='1';
g1<='0'; g2<='0';
48
nx_state <= GR;
49
IF (test='0') THEN time <= timeRY;
50
ELSE time <= timeTEST;
51
END IF;
52
WHEN GR =>
53
r1<='0'; r2<='1'; y1<='0'; y2<='0';
54
55
56
57
57
58
59
60
61
62
63
64
65
66
67
68
69
r1<='0'; r2<='1'; y1<='0'; y2<='0';
g1<='1'; g2<='0';
nx_state <= YR;
IF (test='0') THEN time <= timeGR;
ELSE time <= timeTEST;
END IF;
WHEN YR =>
r1<='0'; r2<='1'; y1<='1'; y2<='0';
g1<='0'; g2<='0';
nx_state <= RG;
IF (test='0') THEN time <= timeYR;
ELSE time <= timeTEST;
END IF;
WHEN YY =>
r1<='0'; r2<='0'; y1<='1'; y2<='1';
g1<='0'; g2<='0';
nx_state <= RY;
END CASE;
END PROCESS;
END behavior;
- 회로 구현에 필요한 예상 FF 수는 15 개
pr_state 저장하는데 3개(5개의 상태를 인코딩하는데 3비트가 필요하기 때문)
카운터를 위해 12개(timeMAX =2700까지 카운트해야 하므로 12 비트 카운터 필요)
Section 8.3 설계 스타일 #2(저장되는 출력)
 (예제 8.6) 신호 발생기
(a) clk로부터 생성된 신호 outp
(b) 중간 신호 out1 및 out2(outp = out1 AND out2)
[그림 8-12] 신호 발생기
• 이 회로는 clk의 상승 에지와 하강 에지 모두에서 동작되어야 함
- clk의 상승 에지에서만 동작하는 신호(out1)와 clk의 하강 에지에서만 동작하는 신호(out2)를 각각
만들어, 이를 AND하여 원하는 신호 outp를 만든다.
• 출력은 clk가 변화할 때애만 변화하므로 동기식 출력
Section 8.3 설계 스타일 #2
 (예제 8.6) 신호 발생기의 VHDL 코드
01
02
03
04
05
06
07
08
09
10
11
12
----------------------------------------------ENTITY signal_gen IS
PORT ( clk: IN BIT;
outp: OUT BIT);
END signal_gen;
----------------------------------------------ARCHITECTURE fsm OF signal_gen IS
TYPE state IS (one, two, three);
SIGNAL pr_state1, nx_state1: state;
SIGNAL pr_state2, nx_state2: state;
SIGNAL out1, out2: BIT;
BEGIN
13 ----- 기계 #1의 하반부: --------------------14
PROCESS(clk)
15
BEGIN
16
IF (clk'EVENT AND clk='1') THEN
17
pr_state1 <= nx_state1;
18
END IF;
19
END PROCESS;
20 ----- 기계 #2의 하반부: --------------------21
PROCESS(clk)
22
BEGIN
23
IF (clk'EVENT AND clk='0') THEN
24
pr_state2 <= nx_state2;
25
END IF;
26
END PROCESS;
Section 8.3 설계 스타일 #2
 (예제 8.6) 신호 발생기의 VHDL 코드
27 ---- 기계 #1의 상반부: ---------------------28
PROCESS (pr_state1)
29
BEGIN
30
CASE pr_state1 IS
31
WHEN one =>
32
out1 <= '0';
33
nx_state1 <= two;
34
WHEN two =>
35
out1 <= '1';
36
nx_state1 <= three;
37
WHEN three =>
38
out1 <= '1';
39
nx_state1 <= one;
40
END CASE;
41
END PROCESS;
42 ---- 기계 #2의 상반부: ---------------------43
PROCESS (pr_state2)
44
BEGIN
45
CASE pr_state2 IS
46
WHEN one =>
47
out2 <= '1';
48
nx_state2 <= two;
49
WHEN two =>
50
out2 <= '0';
51
nx_state2 <= three;
52
WHEN three =>
53
out2 <= '1';
54
nx_state2 <= one;
55
END CASE;
56
END PROCESS;
57
outp <= out1 AND out2;
58 END fsm;
59 -----------------------------------------------
Section 8.4 인코딩 스타일: 이진 코드~OneHot
 상태 기계의 인코딩 방법
• default encoding style : binary
-
n개의 FF(n 비트)로 2n개의 상태까지 인코딩 가능
장점 : 필요한 FF 수를 최소화
단점 : 다른 방식 보다 더 많은 논리, 더 느린 속도
ASIC에서 사용하는 일반적 방법
• OneHot encoding style
- 상태 당 1개의 FF 사용
(n개의 FF로 n개의 상태 인코딩)
- 장점 : 추가되는 회로가 적고 가장 빠르다.
- 단점 : 가장 많은 수의 FF 필요
- FF가 풍부한 FPGA 응용에 적합
• TwoHot encoding style(Hybrid 방법)
- 위 두 가지를 혼합하여 사용
- 상태 당 2 비트 활성화시킴
(n개의 FF로 n(n-1)/2개의 상태까지 인코딩)
[표 8-1] FSM의 상태 인코딩의 예
8장 상태 기계 끝