한국기술교육대학교 장영조
한국기술교육대학교전기전자통신공학부 2
. 조합회로설계 2. 순차회로설계 3. FSM 회로설계 4. ASM 을사용한설계 한국기술교육대학교전기전자통신공학부 3
input clk 유한상태머신 (Finite State Machine; FSM) 지정된수의상태로상태들간의천이에의해출력을생성하는회로 디지털시스템의제어회로구성에사용 Moore 머신 : 출력이현재상태에의해서만결정, 동기형출력 Mealy 머신 : 출력이현재상태와입력에의해결정, 비동기형출력 3 부분으로구성 현재상태레지스터 차기상태논리회로 출력회로 next state logic ns state register ps Mealy output logic Moore output logic Mealy output Moore output S3 -/ / S S S2 S S2 / / / / S3 S -/ / Input/output w/yy2 S4 무어머신 밀리머신 한국기술교육대학교전기전자통신공학부 4
상태할당 - 상태값의이진데이터의인코딩방식에따라상태레지스터의비트수가달라짐 상태인코딩예 상태번호 2진인코딩 Gray 인코딩 Johnson 인코딩 One-hot 인코딩 2 3 4 5 6 7 한국기술교육대학교전기전자통신공학부 5
유한상태머신 (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
code 3.3- moore.v, 세부분으로구분된무어머신 module moore (clk, rst, x, z, ps); input clk, rst, x; output z; output [:] ps; // to monitor state status wire z; reg [:] ps, ns; parameter S = 2'b, S = 2'b, S2 = 2'b, S3 = 2'b; // state register always @ (posedge rst or posedge clk) // 순차회로 if (rst) ps <= S; // 논블록킹할당 else ps <= ns; // next state logic always @ (ps or x) // 조합회로 case(ps) S : if (x) ns = S; else ns = S; // 블록킹할당 S : if (x) ns = S2; else ns = S; S2 : if (x) ns = S3; else ns = S; S3 : ns = S; default : ns = S; endcase // output logic assign z = (ps == S3) ; // 조합회로, 동기형출력 S3 한국기술교육대학교전기전자통신공학부 7 S S2 S
code 3.3-2 moore2.v, 두부분으로구분된무어머신 module moore2 (clk, rst, x, z, ps); input clk, rst, x; output z; output [:] ps; // to monitor state status reg z; reg [:] ps, ns; parameter S = 2'b, S = 2'b, S2 = 2'b, S3 = 2'b; always @ (posedge rst or posedge clk) if (rst) ps <= S; else ps <= ns; // next state logic and output logic always @ (ps or x) case(ps) S : begin z = 'b; // 동기형무어출력위치 if (x) ns = S; else ns = S; end S : begin z = 'b; if (x) ns = S2; else ns = S; end S2 : begin z = 'b; if (x) ns = S3; else ns = S; end S3 : begin z = 'b; ns = S; end default : begin z= 'b; ns = S; end endcase S3 S S2 S 한국기술교육대학교전기전자통신공학부 8
code 3.3-3 mealy.v, 두부분으로구분된밀리머신 module mealy (clk, rst, w, y, ps); input clk, rst, w; output [:] y; output [2:] ps; // to monitor state status reg [:] y; reg [2:] ps, ns; parameter S = 3'b, S = 3'b, S2 = 3'b; parameter S3 = 3'b, S4 = 3'b; always @ (posedge rst or posedge clk) if (rst) ps <= S; else ps <= ns; always @ (ps or w) begin y = 2'b; // default output case(ps) // 비동기출력 S : if (w) begin y = 2'b; ns = S; end else begin y = 2'b; ns = S; end S : if (w) begin y = 2'b; ns = S2; end else begin y = 2'b; ns = S3; end S2 : begin y = 2'b; ns = S; end S3 : if (w) begin y = 2'b; ns = S2; end else begin y = 2'b; ns = S4; end S4 : begin y = 2'b; ns = S; end default : ns = S; endcase end -/ / S S S2 / / / / 한국기술교육대학교전기전자통신공학부 9 S3 Input/output w/yy2 -/ / S4
패턴검사기 : 감지입력패턴 :... 예상출력 :... S4 S5 S3 S st st S2 S code 3.3-4 detect.v, 패턴순서검사기 module detect (clk, rst, st, x, y, ps); input clk, rst, st, x; output y; output [2:] ps; // to monitor state status reg y; reg [2:] ps, ns; parameter S = 3'b, S = 3'b, S2 = 3'b; parameter S3 = 3'b, S4 = 3'b, S5 = 3'b; always @ (posedge rst or posedge clk) if (rst) ps <= S; else ps <= ns; always @ (ps or x or st) begin case(ps) S : begin y = 'b; // moore output if (st) ns = S; else ns = S; end S : begin y = 'b; if (x) ns = S; else ns = S2; end S2 : begin y = 'b; if (x) ns = S3; else ns = S2; end S3 : begin y = 'b; if (x) ns = S4; else ns = S2; end S4 : begin y = 'b; if (x) ns = S; else ns = S5; end S5 : begin y = 'b; if (x) ns = S3; else ns = S2; end default : begin y='b; ns = S; end endcase end 한국기술교육대학교전기전자통신공학부
ASM (Algorithmic State Machine) 차트 - 디지털하드웨어알고리즘정의 - 클럭펄스에의한연산실행표현 ASM 차트구성요소 - state box : 상태부호 ( 이진값 ), active 레지스터, 출력신호 - decision box : 분기신호 - conditional output box : 조건출력 decision box 로부터 상태상자상태상자예판단상자 조건출력상자 조건출력상자예 한국기술교육대학교전기전자통신공학부
ASM block - 한개의상태박스는반드시포함, 판별및조건적출력박스는 option - 한개의 ASM 블럭은한개의클럭타임에수행 Timing - 레지스터의상태변화는다음클럭의에지에서발생함에유의 ASM 블록예 ASM 도는상태도와유사 상태박스 - 상태원, E= decision 상태천이조건 조건출력 Mealy type 출력 ASM 차트와등가인상태도 한국기술교육대학교전기전자통신공학부 2
start clk 비트전가산기를사용한 n 비트덧셈연산데이터패스 전가산기, 캐리, 시프트레지스터제어회로 시스템타이밍신호 데이터패스의모드제어신호 x y sh sh sa_con ld sreg sreg ld ld sh done A B Ci q FA dff_ar en rst clk 직렬가산기구조 d S Co ld clk sh ~start preg sum sa_dp S start S x sr x y sr y sum {s, sr sum} q co S2 x sr x y sr y sum {s, sr sum} q co S9 x a y b q. done S~S8 same operations 직렬가산기 ASM 차트 한국기술교육대학교전기전자통신공학부 3
직렬가산기의계층도 sadd TB_sadd sa_dp sa_con sreg preg fa dff_ar sreg Hardware Simulation 한국기술교육대학교전기전자통신공학부 4
data path 하위모듈 // sreg.v, PISO, parallel in serial out module sreg (clk, sh, ld, din, sout); parameter size = 8; input clk, sh, ld; input [size-:] din; output sout; reg [size-:] sreg; // internal register assign sout = sreg[]; always @ (posedge clk) if (ld) sreg <= din; else if (sh) sreg <= sreg >> ; // fa.v, 비트전가산기 module fa (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; // 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 <= ; else if (en) q <= d; // preg.v, SIPO, serial in parallel out module preg (clk, sh, sin, q); parameter size = 8; input clk, sh; input sin; output [size-:] q; reg [size-:] q; always @ (posedge clk) if (sh) q <= {sin, q[size-:]}; 한국기술교육대학교전기전자통신공학부 5
data path 모듈 module sa_dp (rst, clk, x, y, sh, ld, res); parameter size = 8; input rst, clk; input [size-:] x, y; // operands input sh, ld ; // from control output [size:] res; wire x, y, ci, co, s; wire [size-:] sum; assign res = { ci, sum }; sreg UX (clk, sh, ld, x, x); sreg UY (clk, sh, ld, y, y); preg Us (clk, sh, s, sum); dff_ar UD (.rst(rst),.clk(clk),.en(sh),.d(co),.q(ci)); fa UF (.a(x),.b(y),.ci(ci),.co(co),.s(s)); 한국기술교육대학교전기전자통신공학부 6
module sa_con ( start, clk, sh, ld, done, ps); input start, clk; output sh, ld, done; output [3:] ps; // to monitor reg [3:] ps, ns; parameter S=4'b, S=4'b, S2=4'b, S3=4'b; parameter S4=4'b, S5=4'b, S6=4'b, S7=4'b; parameter S8=4'b, S9=4'b; reg [2:] mode; control 모듈 -FSM 구조 // state register always @ (posedge start or posedge clk) if (start) ps <= S; else ps <= ns; assign sh = mode[2]; assign ld = mode[]; assign done = mode[]; // next logic always @ (ps or start) begin mode = 3'b; // default output case(ps) S : begin mode = 3'b; ns = S; end S,S2,S3,S4,S5,S6,S7,S8 : ns = ps + 'b; S9 : begin mode = ; ns = S; end // if (start) ns=s; else ns=s9; end default : ns = S; endcase end 한국기술교육대학교전기전자통신공학부 7
Top 모듈 데이터패스와제어회로의구조적연결 module sadd(start, clk, x, y, ps, res, done, sh, ld); parameter size = 8; input start, clk; input [size-:] x, y; output [3:] ps; // to monitor output [size:] res; output done; output sh, ld; // to monitor wire sh, ld; sa_dp UD ( ~start, clk, x, y, sh, ld, res); sa_con UC ( start, clk, sh, ld, done, ps); 한국기술교육대학교전기전자통신공학부 8
테스트벤치 `timescale ns/ns module tb_sadd; parameter size = 8; reg start, clk=; reg [size-:] x, y; wire [3:] ps; wire [size:] res; wire done, sh, ld; always forever #5 clk = ~clk; initial begin start = ; # start = ; // first trial #5 start = ; # start = ; // second trial # start = ; end initial begin x = 8'h27; y = 8'h9c; #9 x = 8'h58; y = 8'hf9; end sadd DUT (start, clk, x, y, ps, res, done, sh, ld); 한국기술교육대학교전기전자통신공학부 9