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장 상태 기계 끝