한국기술교육대학교 장영조 · 2016-10-31 · 상태할당-...
Transcript of 한국기술교육대학교 장영조 · 2016-10-31 · 상태할당-...
한국기술교육대학교장영조
한국기술교육대학교 전기전자통신공학부 2
1. 조합회로 설계2. 순차회로 설계3. FSM 회로 설계4. ASM을 사용한 설계
한국기술교육대학교 전기전자통신공학부 3
유한상태 머신(Finite State Machine; FSM)
지정된 수의 상태로 상태들 간의 천이에 의해 출력을 생성하는 회로
디지털 시스템의 제어회로 구성에 사용
Moore 머신 : 출력이 현재상태에 의해서만 결정, 동기형 출력
Mealy 머신 : 출력이 현재상태와 입력에 의해 결정, 비동기형 출력
3 부분으로 구성
현재상태 레지스터
차기상태 논리회로
출력회로
한국기술교육대학교 전기전자통신공학부 4
nextstatelogic
stateregister
Mealyoutputlogic
Mooreoutputlogic
inputinput
clk
ns psMealyoutput
Mooreoutput
S0
S2
S1S3
0
0
0
0
1
1
0
1
0
1
S1
S2
S3 S4
1/10-/01
-/11
1/10
0/00
0/001/01
S0
0/00
w/y1y2Input/output
무어머신
밀리머신
상태할당- 상태값의 이진 데이터의 인코딩 방식에 따라 상태 레지스터의 비트 수가 달라짐
한국기술교육대학교 전기전자통신공학부 5
상태번호 2진 인코딩 Gray 인코딩 Johnson 인코딩 One-hot 인코딩
0 000 000 0000 00000001
1 001 001 0001 00000010
2 010 011 0011 00000100
3 011 010 0111 00001000
4 100 110 1111 00010000
5 101 111 1110 00100000
6 110 101 1100 01000000
7 111 100 1000 10000000
상태 인코딩 예
유한상태 머신(FSM)의 코딩 가이드라인 FSM의 상태 이름을 parameter로 정의하여 사용
컴파일러 지시어인 `define을 이용하여 상태이름을 정의할 수도 있으나`define은 컴파일 과정에서 광역적으로 영향을 미치므로, 다수의 FSM에서 동일한 상태이름이 사용되는 경우에 오류가 발생된다.
parameter는 국부적인 영향을 미치므로 다른 FSM에 영향을 미치지 않는다.
FSM이 비동기 리셋을 할 수 있게 설계
리셋을 갖지 않는 FSM은 초기 전원 인가 후, 상태 레지스터의 초기값이 ‘x’ 이므로 미정의 상태에서 나오지 못하는 상황이 발생할 수 있다.
FSM을 구성하는 3개의 블록(next state logic, state register, output logic)을 분리된 always 블록 또는 assign 문으로 구현
FSM 코딩의 일관성을 좋게 하고, 수정 및 변경을 용이하게 한다.
상태 레지스터는 플립플롭을 사용
Next state logic은 case 문을 사용하고, 정의되지 않은 상태들은 default 문으로 표현, 외부 입력은 case_item 문에서 if~else를 사용
한국기술교육대학교 전기전자통신공학부 6
한국기술교육대학교 전기전자통신공학부 7
code 3.3-1 moore1.v, 세 부분으로 구분된 무어 머신
module moore1 (clk, rst, x, z, ps);input clk, rst, x;output z;output [1:0] ps; // to monitor state status wire z;reg [1:0] ps, ns;parameter S0 = 2'b00, S1 = 2'b01, S2 = 2'b10, S3 = 2'b11;// state registeralways @ (posedge rst or posedge clk) // 순차회로
if (rst) ps <= S0; // 논블록킹 할당else ps <= ns;
// next state logicalways @ (ps or x) // 조합회로
case(ps) S0 : if (x) ns = S1; else ns = S0; // 블록킹 할당S1 : if (x) ns = S2; else ns = S1; S2 : if (x) ns = S3; else ns = S1; S3 : ns = S0; default : ns = S0;
endcase// output logicassign z = (ps == S3) ; // 조합회로, 동기형 출력
endmodule
S0
S2
S1S3
0
0
0
0
1
1
0
1
0
1
한국기술교육대학교 전기전자통신공학부 8
code 3.3-2 moore2.v, 두 부분으로 구분된 무어 머신
module moore2 (clk, rst, x, z, ps);input clk, rst, x;output z;output [1:0] ps; // to monitor state statusreg z;reg [1:0] ps, ns;parameter S0 = 2'b00, S1 = 2'b01, S2 = 2'b10, S3 = 2'b11;always @ (posedge rst or posedge clk)
if (rst) ps <= S0;else ps <= ns;
// next state logic and output logicalways @ (ps or x)
case(ps) S0 : begin z = 1'b0; // 동기형 무어 출력 위치
if (x) ns = S1; else ns = S0; endS1 : begin z = 1'b0;
if (x) ns = S2; else ns = S1; endS2 : begin z = 1'b0;
if (x) ns = S3; else ns = S1; endS3 : begin z = 1'b1;
ns = S0; enddefault : begin z= 1'b0; ns = S0; end
endcaseendmodule
S0
S2
S1S3
0
0
0
0
1
1
0
1
0
1
한국기술교육대학교 전기전자통신공학부 9
code 3.3-3 mealy.v, 두 부분으로 구분된 밀리 머신module mealy (clk, rst, w, y, ps);input clk, rst, w;output [1:0] y;output [2:0] ps; // to monitor state statusreg [1:0] y;reg [2:0] ps, ns;parameter S0 = 3'b000, S1 = 3'b001, S2 = 3'b010;parameter S3 = 3'b011, S4 = 3'b100;always @ (posedge rst or posedge clk)
if (rst) ps <= S0;else ps <= ns;
always @ (ps or w) beginy = 2'b00; // default outputcase(ps) // 비동기 출력
S0 : if (w) begin y = 2'b10; ns = S1; endelse begin y = 2'b00; ns = S0; end
S1 : if (w) begin y = 2'b10; ns = S2; endelse begin y = 2'b00; ns = S3; end
S2 : begin y = 2'b11; ns = S0; endS3 : if (w) begin y = 2'b01; ns = S2; end
else begin y = 2'b00; ns = S4; endS4 : begin y = 2'b01; ns = S0; enddefault : ns = S0;
endcase endendmodule
S1
S2
S3 S4
1/10-/01
-/11
1/10
0/00
0/001/01
S0
0/00
w/y1y2Input/output
한국기술교육대학교 전기전자통신공학부 10
code 3.3-4detect.v, 패턴 순서 검사기module detect (clk, rst, st, x, y, ps);input clk, rst, st, x;output y;output [2:0] ps; // to monitor state statusreg y;reg [2:0] ps, ns;parameter S0 = 3'b000, S1 = 3'b001, S2 = 3'b010;parameter S3 = 3'b011, S4 = 3'b100, S5 = 3'b101;always @ (posedge rst or posedge clk)
if (rst) ps <= S0;else ps <= ns;
always @ (ps or x or st) begincase(ps)
S0 : begin y = 1'b0; // moore outputif (st) ns = S1; else ns = S0; end
S1 : begin y = 1'b0;if (x) ns = S1; else ns = S2; end
S2 : begin y = 1'b0;if (x) ns = S3; else ns = S2; end
S3 : begin y = 1'b0;if (x) ns = S4; else ns = S2; end
S4 : begin y = 1'b0;if (x) ns = S1; else ns = S5; end
S5 : begin y = 1'b1;if (x) ns = S3; else ns = S2; end
default : begin y=1'b0; ns = S0; end endcase end
endmodule
S3 S2
S4
S0st
st
0
1
1
0
S11
0
0
1
S5
0 1
0
0
00
0
1
패턴 검사기 : 0110 감지입력 패턴 : 0 1 0 0 0 0 1 1 0 0 0 1 1 0 1 1 0 0 1 1 0 0 ...예상 출력 : 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 1 0 ...
ASM (Algorithmic State Machine) 차트- 디지털 하드웨어 알고리즘 정의- 클럭펄스에 의한 연산실행표현
ASM 차트 구성요소- state box : 상태부호(이진값),
active 레지스터, 출력신호- decision box : 분기신호- conditional output box : 조건출력
decision box로부터
한국기술교육대학교 전기전자통신공학부 11
상태 상자 상태 상자 예 판단 상자
조건출력 상자 조건출력 상자 예
ASM block- 한 개의 상태박스는 반드시 포함,
판별 및 조건적 출력박스는 option- 한 개의 ASM 블럭은 한 개의 클럭 타임에 수행
Timing - 레지스터의 상태 변화는 다음 클럭의
에지에서 발생함에 유의
ASM도는 상태도와 유사
상태박스-상태원,
decision –상태천이조건
조건출력 –Mealy type 출력
한국기술교육대학교 전기전자통신공학부 12
ASM 블록 예
ASM 차트와 등가인 상태도
E=1
1비트 전가산기를 사용한 n 비트 덧셈연산 데이터패스 전가산기,캐리,시프트레지스터
제어회로 시스템 타이밍신호 데이터패스의 모드제어신호
한국기술교육대학교 전기전자통신공학부 13
직렬 가산기 구조
pregsreg
sreg
dff_ar
q d
enclk
FA
A
B
Ci
S
Co
sa_con
ld
sh
done
sh
shsh
ld
ld
ld
0
0
clk
start
~startrst
x
ysum
sa_dp
clk
start
x sr xy sr y
sum {s, sr sum} q co
S1
x sr xy sr y
sum {s, sr sum} q co
S2
done
S9
.
.
.
S1~S8same
operations
x ay bq 0
S0
직렬 가산기ASM 차트
직렬가산기의 계층도
한국기술교육대학교 전기전자통신공학부 14
sadd
sa_dp sa_con
sreg preg fa1 dff_ar
TB_sadd
Hardware Simulation
sreg
한국기술교육대학교 전기전자통신공학부 15
// sreg.v, PISO, parallel in serial outmodule sreg (clk, sh, ld, din, sout);parameter size = 8;input clk, sh, ld;input [size-1:0] din;output sout;reg [size-1:0] sreg; // internal registerassign sout = sreg[0];always @ (posedge clk)
if (ld) sreg <= din;else if (sh) sreg <= sreg >> 1;
endmodule // preg.v, SIPO, serial in parallel outmodule preg (clk, sh, sin, q);parameter size = 8;input clk, sh;input sin;output [size-1:0] q;reg [size-1:0] q;always @ (posedge clk)
if (sh) q <= {sin, q[size-1:1]}; endmodule
// dff_ar.v, 비동기 리셋을 가진 D 플립플롭module dff_ar (rst, clk, en, d, q);input rst, clk, en, d;output q;reg q;always @ (negedge rst or posedge clk)
if (~rst ) q <= 0;else if (en) q <= d;
endmodule
data path 하위 모듈
// fa1.v, 1 비트 전가산기module fa1 (a, b, ci, co, s);input a, b, ci;output co, s;assign co = ( a & b) | (ci & a ) | (ci & b);assign s = a ^ b ^ ci;
endmodule
data path 모듈
한국기술교육대학교 전기전자통신공학부 16
module sa_dp (rst, clk, x, y, sh, ld, res);
parameter size = 8;
input rst, clk;
input [size-1:0] x, y; // operands
input sh, ld ; // from control
output [size:0] res;
wire x0, y0, ci, co, s;
wire [size-1:0] sum;
assign res = { ci, sum };
sreg UX (clk, sh, ld, x, x0);
sreg UY (clk, sh, ld, y, y0);
preg Us (clk, sh, s, sum);
dff_ar UD (.rst(rst), .clk(clk), .en(sh), .d(co), .q(ci));
fa1 UF (.a(x0), .b(y0), .ci(ci), .co(co), .s(s));
endmodule
control 모듈- FSM 구조
한국기술교육대학교 전기전자통신공학부 17
module sa_con ( start, clk, sh, ld, done, ps);input start, clk;output sh, ld, done;output [3:0] ps; // to monitorreg [3:0] ps, ns;parameter S0=4'b0000, S1=4'b0001, S2=4'b0010, S3=4'b0011;parameter S4=4'b0100, S5=4'b0101, S6=4'b0110, S7=4'b0111;parameter S8=4'b1000, S9=4'b1001;reg [2:0] mode;
// state registeralways @ (posedge start or posedge clk)
if (start) ps <= S0; else ps <= ns;
assign sh = mode[2];assign ld = mode[1];assign done = mode[0];
// next logicalways @ (ps or start) begin
mode = 3'b100; // default outputcase(ps)
S0 : begin mode = 3'b010; ns = S1; endS1,S2,S3,S4,S5,S6,S7,S8 : ns = ps + 1'b1; S9 : begin mode = 001; ns = S0; end
// if (start) ns=S0; else ns=S9; enddefault : ns = S0;
endcaseend
endmodule
Top 모듈 데이터 패스와 제어회로의 구조적 연결
한국기술교육대학교 전기전자통신공학부 18
module sadd(start, clk, x, y, ps, res, done, sh, ld);parameter size = 8;input start, clk;input [size-1:0] x, y;output [3:0] ps; // to monitoroutput [size:0] res;output done;output sh, ld; // to monitorwire sh, ld;
sa_dp UD ( ~start, clk, x, y, sh, ld, res);sa_con UC ( start, clk, sh, ld, done, ps);
endmodule
테스트벤치
한국기술교육대학교 전기전자통신공학부 19
`timescale 1 ns/1nsmodule tb_sadd;parameter size = 8;reg start, clk=0;reg [size-1:0] x, y;wire [3:0] ps;wire [size:0] res;wire done, sh, ld;always forever #50 clk = ~clk;
initial begin start = 0;
#10 start = 1; // first trial#150 start = 0;
#1000 start = 1; // second trial#100 start = 0; end
initial beginx = 8'h27; y = 8'h9c;
#900 x = 8'h58; y = 8'hf9; end
sadd DUT (start, clk, x, y, ps, res, done, sh, ld);endmodule