Presentation is loading. Please wait.

Presentation is loading. Please wait.

순차회로 모델링 Sun, Hye-Seung.

Similar presentations


Presentation on theme: "순차회로 모델링 Sun, Hye-Seung."— Presentation transcript:

1 순차회로 모델링 Sun, Hye-Seung

2 순차회로 모델링 순차회로 래치와 플립플롭 순차회로의 모델링
현재의 입력, 과거의 입력, 회로에 기억된 상태값에 의해 출력이 결정 과거의 입력, 현재의 상태값을 저장하는 기억소자(래치 또는 플립플롭)와 조합논리회로로 구성 데이터 레지스터, 시프트 레지스터, 계수기(counter), 직렬/병렬 변환기, 유한상태머신(Finite State Machine; FSM), 주파수 분주기, 펄스 발생기 등 클록신호에 의해 동작되는 래치 또는 플립플롭을 포함 래치와 플립플롭 래치 : 클록신호의 레벨(즉, 0 또는 1)에 따라 동작하는 저장소자 플립플롭 : 클록신호의 상승 또는 하강에지에 동기되어 동작하는 저장소자 always 구문 내부에 if 조건문을 이용하여 모델링 순차회로의 모델링 always 블록을 이용한 행위수준 모델링, 게이트 프리미티브 및 하위모듈 인스턴스, 연속 할당문 등 다양한 Verilog 구문들이 사용됨 할당문의 형태 (nonblocking 또는 blocking) 에 따라 회로의 동작과 구조가 달라짐

3 Positive level-sensitive D latch
G Q q clock d module dlatch(clock, d, q); input clock, d; output q; reg q; or d) begin if(clock) q = d; end endmodule Positive level-sensitive D latch 코드 11.1

4 11.1.1 래치(Latch) Testbench for D latch module tb_dlatch ; reg clk, d;
dlatch U0(clk, d, q); initial begin clk = 1'b0; forever #10 clk = ~clk; end d = 1'b0; forever begin #15 d = 1'b1; #20 d = 1'b0; #10 d = 1'b1; #10 d = 1'b0; #10 d = 1'b1; #15 d = 1'b0; endmodule Testbench for D latch 코드 11.2

5 래치(Latch) 코드 11.1의 시뮬레이션 결과 Negative level-sensitive 방식으로 동작하는 8비트 D 래치 회로를 설계하고, 테스트벤치를 작성하여 기능을 검증한다.

6 11.1.1 래치(Latch) Active-low 리셋을 갖는 positive level-sensitive D latch
module dlatch_rst(rst, clock, d, q); input rst, clock, d; output q; reg q; or rst or d) begin if(!rst) q = 1'b0; else if(clock) q = d; end endmodule 코드 11.3

7 래치(Latch) 코드 11.3의 시뮬레이션 결과 Active-low 셋과 리셋을 갖는 negative level-sensitive 8비트 D 래치 회로를 설계하고, 테스트벤치를 작성하여 기능을 검증한다.

8 11.1.1 래치(Latch) Latch가 포함된 회로에 blocking 할당문이 사용된 경우 합성 결과
module latch_blk(en, a, b, c, y); input en, a, b, c; output y; reg m, y; or a or b or c) begin if(en) begin m = ~(a | b); y = ~(m & c); end endmodule 코드 11.4 합성 결과 Latch

9 11.1.1 래치(Latch) Latch가 포함된 회로에 nonblocking 할당문이 사용된 경우 합성 결과
module latch_nonblk(en, a, b, c, y); input en, a, b, c; output y; reg m, y; or a or b or c) begin if(en) begin m <= ~(a | b); y <= ~(m & c); end endmodule 코드 11.5 합성 결과 Latch

10 래치(Latch) 코드 11.6은 코드 11.4에서 blocking 할당문의 순서를 바꾼 경우이다. 코드 11.4와 동일한 회로인지, 만약 다른 회로라면 어떤 회로가 되는지 시뮬레이션과 합성을 통해 확인하고, 그 이유를 생각해 본다. module latch_blk2(en, a, b, c, y); input en, a, b, c; output y; reg m, y; or a or b or c) begin if(en) begin y = ~(m & c); m = ~(a | b); end endmodule 코드 11.6

11 래치(Latch) 코드 11.7은 코드 11.5에서 nonblocking 할당문의 순서를 바꾼 경우이다. 코드 11.5와 동일한 회로인지, 만약 다른 회로라면 어떤 회로가 되는지 시뮬레이션과 합성을 통해 확인하고, 그 이유를 생각해 본다. module latch_nonblk2(en, a, b, c, y); input en, a, b, c; output y; reg m, y; or a or b or c) begin if(en) begin y <= ~(m & c); m <= ~(a | b); end endmodule 코드 11.7

12 Positive edge-triggered D Flip-flop
clk d q D Q q clock d module dff(clk, d, q); input d ,clk; output q; reg q; clk) q <= d; endmodule Positive edge-triggered D Flip-flop 코드 11.8

13 플립플롭(Flip flop) 코드 11.8의 시뮬레이션 결과

14 플립플롭(Flip flop) Edge-triggered D Flip-flop with q and qb outputs module dff_bad1(clk, d, q, q_bar); input d, clk; output q, q_bar; reg q, q_bar; clk) begin // nonblocking assignments q <= d; q_bar <= ~d; end endmodule 코드 11.9(a) Not Recommended module dff_bad2(clk, d, q, q_bar); input d, clk; output q, q_bar; reg q, q_bar; clk) begin // blocking assignments q = d; q_bar = ~d; end endmodule 코드 11.9(b)

15 플립플롭(Flip flop) Edge-triggered D Flip-flop with q and qb outputs module dff_good(clk, d, q, q_bar); input d, clk; output q, q_bar; reg q; // using assign statement for q_bar assign q_bar = ~q; clk) q <= d; endmodule Recommended 코드 11.9(c)

16 플립플롭(Flip flop) Edge-triggered D Flip-flop with q and qb outputs Flip flop 코드 11.9 (a), (b)의 합성 결과 코드 11.9 (c)의 합성 결과

17 플립플롭(Flip flop) q와 q_bar 출력을 갖는 D 플립플롭을 코드 11.10과 같이 모델링하면, 단순 D 플립플롭이 아닌 다른 회로가 된다. 시뮬레이션과 합성을 통해 코드 11.10의 모델링이 어떤 회로로 동작하는 지 확인하고, 그 이유를 생각해 본다. module dff_bad3(clk, d, q, q_bar); input d, clk; output q, q_bar; reg q, q_bar; clk) begin q <= d; q_bar <= ~q; end endmodule 코드 11.10

18 플립플롭(Flip flop) Edge-triggered D Flip-flop with synchronous active-low reset module dff_sync_rst(clk, d, rst_n, q, qb); input clk, d, rst_n; output q, qb; reg q; assign qb = ~q; clk) // include only clk begin if(!rst_n) // active-low reset q <= 1'b0; else q <= d; end endmodule 코드 11.11

19 플립플롭(Flip flop) Edge-triggered D Flip-flop with synchronous active-low reset 코드 11.11의 시뮬레이션 결과

20 플립플롭(Flip flop) Edge-triggered D Flip-flop with asynchronous active-low reset module dff_async_rst(clk, d, rst_n, q, qb); input clk, d, rst_n; output q, qb; reg q; assign qb = ~q; clk or negedge rst_n) // both clk and rst_n begin if(!rst_n) // active-low reset q <= 1'b0; else q <= d; end endmodule 코드 11.12

21 플립플롭(Flip flop) Edge-triggered D Flip-flop with asynchronous active-low reset 코드 11.12의 시뮬레이션 결과

22 플립플롭(Flip flop) 다음의 D 플립플롭을 Verilog HDL로 모델링하고, 시뮬레이션을 통해 동작을 확인한다. ① 동기식 active-high 리셋을 갖는 D 플립플롭 ② 동기식 active-high 셋을 갖는 D 플립플롭 ③ 동기식 active-low 셋과 리셋을 갖는 D 플립플롭 ④ 비동기식 active-high 리셋을 갖는 D 플립플롭 ⑤ 비동기식 active-high 셋을 갖는 D 플립플롭 ⑥ 비동기식 active-low 셋과 리셋을 갖는 D 플립플롭

23 11.1.2 플립플롭(Flip flop) 플립플롭이 포함된 회로에 blocking 할당문이 사용된 경우 합성 결과
module seq_blk(clk, a, b, c, d, e, y); input clk, a, b, c, d, e; output y; reg m, n, y; clk) begin m = ~(a & b); n = c | d; y = ~(m | n | e); end endmodule 코드 11.13 합성 결과 Flip Flop

24 11.1.2 플립플롭(Flip flop) 플립플롭이 포함된 회로에 nonblocking 할당문이 사용된 경우 합성 결과
module seq_nonblk(clk, a, b, c, d, e, y); input clk, a, b, c, d, e; output y; reg m, n, y; clk) begin m <= ~(a & b); n <= c | d; y <= ~(m | n | e); end endmodule 코드 11.14 합성 결과 Flip Flop

25 플립플롭(Flip flop) 코드 11.15는 코드 11.13에서 blocking 할당문의 순서를 바꾼 경우이다. 코드 11.13과 동일한 회로인지, 만약 다른 회로라면 어떤 회로가 되는지 시뮬레이션과 합성을 통해 확인하고, 그 이유를 생각해 본다. module seq_blk2(clk, a, b, c, d, e, y); input clk, a, b, c, d, e; output y; reg m, n, y; clk) begin y = ~(m | n | e); m = ~(a & b); n = c | d; end endmodule 코드 11.15

26 11.2 Blocking과 Nonblocking 할당문
module blk1(clk, d, q3); input clk; output q3; input d; reg q3, q2, q1, q0; clk) begin q0 = d; q1 = q0; q2 = q1; q3 = q2; end endmodule module blk2(clk, d, q3); input clk; output q3; input d; reg q3, q2, q1, q0; clk) begin q3 = q2; q2 = q1; q1 = q0; q0 = d; end endmodule 코드 11.16(a) 코드 11.16(b) Flip Flop Shift register

27 11.2 Blocking과 Nonblocking 할당문
module non_blk1(clk, d, q3); input clk; output q3; input d; reg q3, q2, q1, q0; clk) begin q0 <= d; q1 <= q0; q2 <= q1; q3 <= q2; end endmodule module non_blk2(clk, d, q3); input clk; output q3; input d; reg q3, q2, q1, q0; clk) begin q3 <= q2; q2 <= q1; q1 <= q0; q0 <= d; end endmodule 코드 11.17(a) 코드 11.17(b) Flip Flop

28 11.2 Blocking과 Nonblocking 할당문
코딩 가이드라인 가이드라인-1:순차회로 또는 래치를 모델링하는 always 블록에서는 nonblocking 할당문을 사용한다. 가이드라인-2:조합논리회로를 모델링하는 always 블록에서는 blocking 할당문을 사용한다.

29 11.2 Blocking과 Nonblocking 할당문
가이드라인-3:동일한 always 블록에서 순차회로와 조합논리회로를 함께 표현하는 경우에는 nonblocking 할당문을 사용한다.

30 11.2 Blocking과 Nonblocking 할당문
가이드라인-4:동일한 always 블록 내에서 blocking 할당문과 nonblocking 할당문을 혼합해서 사용하지 않는다. module ba_nba1(q, a, b, clk, rst_n); output q; input a, b, rst_n, clk; reg q, tmp; clk or negedge rst_n) if(!rst_n) q <= 1'b0; else begin tmp = a & b; q <= tmp; end endmodule 코드 11.18(a) Bad Coding module ba_nba2(q, a, b, clk, rst_n); output q; input a, b, rst_n, clk; reg q, tmp; clk or negedge rst_n) if(!rst_n) q = 1'b0; //blocking else begin tmp = a & b; q <= tmp; //nonblocking end endmodule 코드 11.18(b)

31 11.2 Blocking과 Nonblocking 할당문
module ba_nba3(q, a, b, clk, rst_n); output q; input a, b, rst_n, clk; reg q; clk or negedge rst_n) if(!rst_n) q <= 1'b0; else q <= a & b; endmodule Good Coding 코드 11.18(c) module ba_nba4(q, a, b, clk, rst_n); output q; input a, b, rst_n, clk; reg q; wire tmp; assign tmp = a & b; clk or negedge rst_n) if(!rst_n) q <= 1'b0; else q <= tmp; endmodule 코드 11.18(d)

32 11.2 Blocking과 Nonblocking 할당문
가이드라인-5:다수의 always 블록에서 동일한 reg 변수에 값을 할당하지 않는다. module badcode1(q, d1, d2, clk, rst_n); output q; input d1, d2, clk, rst_n; reg q; clk or negedge rst_n) if(!rst_n) q <= 1'b0; else q <= d1; else q <= d2; endmodule 코드 11.19 Multiple source driving이 발생하는 코딩

33 11.2 Blocking과 Nonblocking 할당문
코드 (a), (b)의 출력 y1, y2를 확인하고, 그 이유를 생각해 본다. 코드 (a), (b)의 합성 결과, 동일한 회로가 되는지, 아니면 서로 다른 회로가 되는 지 확인한다. module fbosc_blk(y1, y2, clk, rst); output y1, y2; input clk, rst; reg y1, y2; clk or posedge rst) if(rst) y1 = 0; // reset else y1 = y2; if(rst) y2 = 1; // set else y2 = y1; endmodule Blocking 할당문 사용 코드 11.20(a)

34 11.2 Blocking과 Nonblocking 할당문
module fbosc_nonblk(y1, y2, clk, rst); output y1, y2; input clk, rst; reg y1, y2; clk or posedge rst) if(rst) y1 <= 0; // reset else y1 <= y2; if(rst) y2 <= 1; // set else y2 <= y1; endmodule Nonblocking 할당문 사용 코드 11.20(b)

35 11.3 시프트 레지스터 시프트 레지스터 클록신호가 인가될 때마다 데이터가 왼쪽 또는 오른쪽으로 이동되는 회로
여러 개의 플립플롭이 직렬로 연결된 구조 형태 직렬입력-직렬출력(Serial-In, Serial-Out) 직렬입력-병렬출력(Serial-In, Parallel-Out) 병렬입력-직렬출력(Parallel-In, Serial-Out) 병렬입력-병렬출력(Parallel-In, Parallel-Out) 왼쪽 시프트, 오른쪽 시프트, 양방향 시프트 nonblocking 할당문, 시프트 연산자, 결합 연산자, 반복문 등 다양한 구문으로 모델링

36 11.3.1 직렬입력-직렬출력 시프트 레지스터 그림 11.17 직렬입력-직렬출력 시프트 레지스터
clk rst DFF Q D sin sout q[0] q[1] q[2] q[7] 그림 직렬입력-직렬출력 시프트 레지스터 module shift_reg_nblk1(clk, rst, sin, sout); input clk, rst, sin; output sout; reg [7:0] q; assign sout = q[7]; clk) begin if(!rst) q <= 8'b0; else begin q[0] <= sin; q[1] <= q[0]; q[2] <= q[1]; q[3] <= q[2]; q[4] <= q[3]; q[5] <= q[4]; q[6] <= q[5]; q[7] <= q[6]; end endmodule 코드 11.21

37 11.3.1 직렬입력-직렬출력 시프트 레지스터 벡터 할당문을 사용한 경우
module shift_reg_nblk2(clk, rst, sin, sout); input clk, rst, sin; output sout; reg [7:0] q; assign sout = q[7]; clk) begin if(!rst) q <= 0; else begin q[0] <= sin; q[7:1] <= q[6:0]; end endmodule 벡터 할당문을 사용한 경우 코드 11.22

38 11.3.1 직렬입력-직렬출력 시프트 레지스터 코드 11.22의 시뮬레이션 결과
그림 11.17의 시프트 레지스터를 다음의 방법으로 모델링하고, 시뮬레이션한다. ① 결합 연산자를 사용하는 방법 ② 시프트 연산자를 사용하는 방법 ③ for 반복문을 사용하는 방법

39 11.3.2 병렬입력-병렬출력 시프트 레지스터 병렬입력-병렬출력 시프트 레지스터
clk rst DFF Q D pout[0] MUX pout[1] pout[2] pout[8] din[0] din[1] din[2] din[8] load 그림 병렬입력-직렬출력 시프트 레지스터

40 병렬입력-병렬출력 시프트 레지스터 module pld_shift_reg(clk, rst, load, din, pout); input clk, rst, load; input [7:0] din; output [7:0] pout; reg [7:0] data_reg; assign pout = data_reg; clk) begin if(!rst) data_reg <= 0; else if(load) data_reg <= din; else data_reg <= data_reg << 1; end endmodule 코드 11.23

41 병렬입력-병렬출력 시프트 레지스터 코드 11.23의 시뮬레이션 결과 직렬입력-병렬출력 8비트 시프트 레지스터를 모델링하고, 시뮬레이션을 통해 동작을 확인한다.

42 표 11.1 양방향 병렬포트를 갖는 시프트 레지스터의 신호 정의
병렬입력-병렬출력 시프트 레지스터 양방향 병렬포트를 갖는 시프트 레지스터 데이터의 병렬로드(wr=0)와 시프팅 동작(en=0)이 동시에 일어나지 않으며, data_io 포트가 inout 이므로 rd 신호와 wr 신호가 동시에 0이 되지 않는다. 표 양방향 병렬포트를 갖는 시프트 레지스터의 신호 정의 신호 이름 기  능 clk 클록 신호 rst 리셋 신호(Active Low) en 시프팅 동작을 위한 enable 신호(Active Low) wr 병렬로드를 위한 enable 신호(Active Low) rd 병렬출력을 위한 enable 신호(Active Low) si 직렬입력 so 직렬출력 data_io 병렬입/출력 데이터(inout)

43 11.3.2 병렬입력-병렬출력 시프트 레지스터 양방향 병렬포트를 갖는 시프트 레지스터 코드 11.24
module shifter(clk, rst, en, wr, rd, si, so, data_io); parameter Len = 8; input clk, rst, en, wr, rd, si; output so; inout [Len-1:0] data_io; reg [Len-1:0] shift_reg; assign data_io = !rd ? shift_reg : {Len{1'bz}}; assign so = shift_reg[7]; clk) begin if(!rst) shift_reg <= {Len{1'b0}}; else begin if(!en) begin shift_reg <= shift_reg << 1; shift_reg[0] <= si; end else if(!wr) shift_reg <= data_io; endmodule 코드 11.24

44 11.3.2 병렬입력-병렬출력 시프트 레지스터 양방향 병렬포트를 갖는 시프트 레지스터 코드 11.24의 시뮬레이션 결과
(직렬입력 데이터의 시프팅 동작)

45 11.3.2 병렬입력-병렬출력 시프트 레지스터 양방향 병렬포트를 갖는 시프트 레지스터 코드 11.24의 시뮬레이션 결과
(병렬입력 데이터의 시프팅 동작)

46 병렬입력-병렬출력 시프트 레지스터 코드 11.24의 시프트 레지스터에 좌/우 시프팅 기능을 추가하여 설계 하고, 시뮬레이션을 통해 동작을 확인한다. 신호의 정의는 다음과 같다. 신호 이름 기  능 clk 클록 신호 rst 리셋 신호(Active Low) en 시프팅 동작을 위한 enable 신호(Active Low) wr 병렬로드를 위한 enable 신호(Active Low) rd 병렬출력을 위한 enable 신호(Active Low) si 직렬입력 so 직렬출력 data_io 병렬입/출력 데이터(inout) mode 좌/우 시프팅 선택 신호 (mode=0; 오른쪽 시프트, mode=1; 왼쪽 시프트)

47 선형 귀환 시프트 레지스터 선형 귀환 시프트 레지스터(Linear Feedback Shift Register; LFSR) 선형 귀환을 통해 2진 비트 열을 생성 N-비트 시프트 레지스터에 의해, 최대 2N개의 의사 난수 시퀀스 생성 계수기, 의사 난수(pseudo-random sequence) 발생, 데이터 암호/복호, 데이터 압축, 데이터 무결성 검사합(data integrity checksum) 등 디지털 시스템에서 매우 다양한 목적으로 사용 시스템 IC의 내장형 자기 진단(Built-In Self-Test; BIST) 회로에 사용되어 테스트 벡터 생성 및 테스트 응답 분석에도 사용 clk rst DFF d q sout 그림 LFSR 회로

48 선형 귀환 시프트 레지스터 선형 귀환 시프트 레지스터(Linear Feedback Shift Register; LFSR) 시프트 레지스터의 초기화 XOR 게이트가 사용되는 LFSR : 레지스터를 0으로 초기화시키지 않는다. 0이 계속 시프팅되므로, LFSR로 동작할 수 없다. XNOR 게이트가 사용되는 LFSR : 레지스터를 1로 초기화시키지 않는다. 1이 계속 시프팅되므로, LFSR로 동작할 수 없다. 3비트 LFSR

49 11.3.3 선형 귀환 시프트 레지스터 3비트 LFSR Bad Code
module lfsr_Bad1(q3, clk, pre_n); output q3; input clk, pre_n; reg q3, q2, q1; assign n1 = q1 ^ q3; // Blocking 할당문을 사용한 경우 clk or negedge pre_n) if(!pre_n) begin q3 = 1'b1; q2 = 1'b1; q1 = 1'b1; end else begin q3 = q2; q2 = n1; q1 = q3; endmodule Bad Code 코드 11.25(a)

50 11.3.3 선형 귀환 시프트 레지스터 3비트 LFSR Good Code
module lfsr_Good1(q3, clk, pre_n); output q3; input clk, pre_n; reg q3, q2, q1; // Nonblocking 할당문을 사용한 경우 clk or negedge pre_n) if(!pre_n) begin q3 <= 1'b1; q2 <= 1'b1; q1 <= 1'b1; end else begin q3 <= q2; q2 <= q1 ^ q3; q1 <= q3; endmodule Good Code 코드 11.25(b)

51 11.3.3 선형 귀환 시프트 레지스터 3비트 LFSR Good Code
module lfsr_Good2(q3, clk, pre_n); output q3; input clk, pre_n; reg q3, q2, q1; // Nonblocking 할당문을 사용한 경우 clk or negedge pre_n) if(!pre_n) {q3,q2,q1} <= 3'b111; else {q3,q2,q1} <= {q2,(q1^q3),q3}; endmodule Good Code 코드 11.25(c)

52 11.3.3 선형 귀환 시프트 레지스터 3비트 LFSR Bad Code
module lfsr_Bad2(q3, clk, pre_n); output q3; input clk, pre_n; reg q3, q2, q1; clk or negedge pre_n) if(!pre_n) {q3,q2,q1} <= 3'b000; else {q3,q2,q1} <= {q2,(q1 ^ q3),q3}; endmodule Bad Code 코드 11.25(d)

53 선형 귀환 시프트 레지스터 3비트 LFSR (a) (b) (d) (c) 코드 11.25의 시뮬레이션 결과

54 선형 귀환 시프트 레지스터 그림 11.23의 8비트 LFSR 회로를 모델링하고, 시뮬레이션을 통해 동작을 확인한다. clk rst DFF d q sout 그림 11.23

55 11.4 계수기 (Counter) 계수기(counter) 클록펄스가 인가될 때마다 값을 증가 또는 감소시키는 회로
주파수 분주기, 타이밍 제어신호 생성 등에 사용 동기식 계수기 모든 플립플롭이 하나의 공통 클록신호에 의해 구동되며, 모든 플립플롭의 상태변경이 동시에 일어남 장점 : 설계와 검증이 용이하며, 계수 속도가 빠름 단점 : 비동기식 카운터에 비하여 회로가 복잡함 비동기식 계수기 첫단의 플립플롭에 클록신호가 인가되면, 플립플롭의 출력이 다음 단의 플립플롭을 트리거시키는 방식으로 동작 리플 계수기(ripple counter)라고도 함 장점 : 동기식 계수기에 비해 회로가 단순해짐 단점 : 각 플립플롭의 전파 지연시간이 누적되어 최종단의 출력에 나타나므로 계수속도가 느림

56 11.4 계수기 (Counter) 8비트 증가 계수기 module counter_up(clk, rst, cnt);
input clk, rst; output [7:0] cnt; reg [7:0] cnt; clk or negedge rst) begin if(!rst) cnt <= 0; else cnt <= cnt + 1; end endmodule 코드 11.26

57 11.4 계수기 (Counter) 8비트 증가 계수기 코드 11.26 코드 11.26의 시뮬레이션 결과

58 11.4 계수기 (Counter) Enable 신호(active high)를 갖는 8비트 감소 계수기를 설계하고, 시뮬레이션을 통해 동작을 확인한다. Enable 신호 en=1이면 계수기가 동작하고, en=0이면 계수동작을 멈추는 기능을 갖는다. Mode 신호에 따라 계수기 값이 증가(mode=1) 또는 감소(mode=0)되는 8비트 증가/감소 계수기를 설계하고, 시뮬레이션을 통해 동작을 확인한다. 설계과제 11.13과 11.14에서 설계된 기능에 추가하여 8비트 데이터의 병렬로드(load=1) 기능을 갖는 8비트 증가/감소 계수기를 설계하고, 시뮬레이션을 통해 동작을 확인한다.

59 11.4 계수기 (Counter) 1/10 주파수 분주기(frequency divider) 코드 11.27
module frq_div(mclk, rst, clk_div); input rst, mclk; output clk_div; reg [3:0] cnt; reg clk_div; mclk or posedge rst) begin if(!rst) begin cnt <= 0; clk_div <= 0; end else begin if(cnt == 9) begin clk_div <= 1'b1; clk_div <= 1'b0; cnt <= cnt + 1; endmodule 코드 11.27

60 11.4 계수기 (Counter) 1/10 주파수 분주기(frequency divider) 코드 11.27의 시뮬레이션 결과
Duty cycle이 50%인 대칭 분주 클록을 생성하는 1/10 주파수 분주기를 설계하고, 시뮬레이션을 통해 동작을 확인한다.

61 11.5 유한상태 머신(FSM) 유한상태 머신(Finite State Machine; FSM)
지정된 수의 상태를 가지고 상태들 간의 천이에 의해 출력을 생성하는 회로 디지털 시스템의 제어회로 구성에 사용 Moore 머신 : 출력이 단지 현재상태에 의해서 결정 Mealy 머신 : 현재상태와 입력에 의해 출력이 결정 Next state logic (조합논리회로) State register (순차회로) Output logic 출력 입력 클록 리셋 Mealy 머신의 경우 그림 유한상태 머신의 구조

62 11.5 유한상태 머신(FSM) 상태값의 이진 데이터의 인코딩 방식에 따라 상태 레지스터의 비트 수가 달라짐
표 11.3 상태 인코딩 형식 상태번호 2진 인코딩 Gray 인코딩 Johnson 인코딩 One-hot 인코딩 000 0000 1 001 0001 2 010 011 0011 3 0111 4 100 110 1111 5 101 111 1110 6 1100 7 1000

63 11.5 유한상태 머신(FSM) 유한상태 머신(FSM)의 코딩 가이드라인
각각의 상태머신을 독립된 Verilog 모듈로 설계한다. FSM 모델의 유지가 용이하고, FSM 합성 툴의 최적화 작업에 도움이 된다. FSM의 상태 이름을 parameter로 정의하여 사용한다. 컴파일러 지시어인 ‘define을 이용하여 상태이름을 정의할 수도 있으나 ‘define은 컴파일 과정에서 광역적으로 영향을 미치므로, 다수의 FSM에서 동일한 상태이름이 사용되는 경우에 오류가 발생된다. parameter는 국부적인 영향을 미치므로 다른 FSM에 영향을 미치지 않는다. FSM이 비동기 리셋을 갖도록 설계한다. 리셋을 갖지 않는 FSM은 초기 전원 인가 후, 상태 레지스터의 초기값이 불확정적이므로 정의되지 않은 상태에 갇혀서 빠져 나오지 못하는 상황이 발생할 수 있다.

64 11.5 유한상태 머신(FSM) 유한상태 머신 (FSM) 의 코딩 가이드라인
그림 11.28의 FSM을 구성하는 3개의 블록(next state logic, state register, output logic)을 분리된 always 블록 또는 assign 문으로 구현한다. FSM 코딩의 일관성을 좋게 하고, 수정 및 변경을 용이하게 한다. 상태 레지스터는 래치보다는 플립플롭을 사용하는 것이 좋다. 래치를 사용하는 경우, 래치가 transparent 상태일 때 상태 발진(state oscillation)을 일으킬 수 있다. Next state logic은 case 문을 이용하여 모델링하는 것이 바람직하며, FSM에서 정의되지 않은 상태들은 default 문으로 표현한다.

65 Moore FSM 4개의 상태를 갖는 FSM

66 11.5.1 Moore FSM assign 문으로 출력을 생성하는 경우 코드 11.28(a)
module fsm_ex1(clk, rst_n, go, ws, rd, ds); input clk, rst_n, go, ws; output rd, ds; parameter IDLE = 2'b00, READ = 2'b01, DLY = 2'b10, DONE = 2'b11; reg [1:0] state, next; clk or negedge rst_n) //State Register if(!rst_n) state <= IDLE; else state <= next; or go or ws) begin //Next State Logic next = 2'bx; case(state) IDLE : if(go) next = READ; else next = IDLE; READ : next = DLY; DLY : if(!ws) next = DONE; else next = READ; DONE : next = IDLE; endcase end // Output Logic assign rd =((state==READ)||(state==DLY)); assign ds =(state==DONE); endmodule assign 문으로 출력을 생성하는 경우 코드 11.28(a)

67 11.5.1 Moore FSM always 블록에서 출력을 생성하는 경우 코드 11.28(b)
module fsm_ex2(clk, rst_n, go, ws, rd, ds); input clk, rst_n, go, ws; output rd, ds; parameter IDLE = 2'b00, READ = 2'b01, DLY = 2'b10, DONE = 2'b11; reg [1:0] state, next; reg rd, ds; clk or negedge rst_n) //State Register if(!rst_n) state <= IDLE; else state <= next; 코드 11.28(b)

68 11.5.1 Moore FSM 코드 11.28(b) //Next State and Output Logic
or go or ws) begin next = 2'bx; rd = 1'b0; ds = 1'b0; case(state) IDLE : if(go) next = READ; else next = IDLE; READ : begin rd = 1'b1; next = DLY; end DLY : begin if(!ws) next = DONE; else next = READ; DONE : begin ds = 1'b1; next = IDLE; endcase endmodule 코드 11.28(b)

69 11.5.1 Moore FSM 레지스터를 통해 출력을 생성하는 경우 코드 11.28(c)
module fsm_ex3(clk, rst_n, go, ws, rd, ds); input clk, rst_n, go, ws; output rd, ds; // 상태 선언 parameter IDLE = 2'b00, READ = 2'b01, DLY = 2'b10, DONE = 2'b11; reg [1:0] state, next; reg rd, ds; clk or negedge rst_n) //State Register if(!rst_n) state <= IDLE; else state <= next; or go or ws) begin // Next State Logic next = 2'bx; case(state) IDLE : if(go) next = READ; else next = IDLE; READ : next = DLY; DLY : if(!ws) next = DONE; else next = READ; DONE : next = IDLE; endcase end 레지스터를 통해 출력을 생성하는 경우 코드 11.28(c)

70 11.5.1 Moore FSM 코드 11.28(c) //Output Logic and output register
clk or negedge rst_n) if(!rst_n) begin ds <= 1'b0; rd <= 1'b0; end else begin case(next) READ: rd <= 1'b1; DLY : rd <= 1'b1; DONE: ds <= 1'b1; endcase endmodule 코드 11.28(c)

71 Moore FSM 코드 (a), (b)의 합성 결과 코드 (c)의 합성 결과

72 Moore FSM 아래의 상태 천이도를 갖는 Moore FSM 회로를 설계하고, 시뮬레이션을 통해 동작을 확인한다. ST1 ST3 ST2 ST0 bypass reset out=0 out=1 out=2 out=3 설계과제 11.17에서 설계된 Moore FSM의 출력이 레지스터를 통해 생성되도록 설계하고 시뮬레이션을 통해 동작을 확인한다.

73 11.5.2 Mealy FSM 연속된 0 또는 1 입력을 검출기 din_bit : 1 dout_bit : start
1 din_bit : dout_bit : start rd1_once rd0_twice rd1_twice rd0_once 1/0 0/0 1/1 0/1 reset

74 Mealy FSM module seq_det_mealy(clk, rst, din_bit, dout_bit); input clk, rst, din_bit; output dout_bit; reg [2:0] state_reg, next_state; // 상태 선언 parameter start = 3'b000; parameter rd0_once = 3'b001; parameter rd1_once = 3'b010; parameter rd0_twice = 3'b011; parameter rd1_twice = 3'b100; 코드 11.29

75 11.5.2 Mealy FSM 코드 11.29 //Next State Logic
or din_bit) begin case(state_reg) start : if (din_bit == 0) next_state <= rd0_once; else if(din_bit == 1) next_state <= rd1_once; else next_state <= start; rd0_once : if(din_bit == 0) next_state <= rd0_twice; rd0_twice : if(din_bit == 0) next_state <= rd0_twice; else if(din_bit == 1) next_state <= rd1_once; else next_state <= start; rd1_once : if(din_bit == 0) next_state <= rd0_once; else if(din_bit == 1) next_state <= rd1_twice; rd1_twice : if(din_bit == 0) next_state <= rd0_once; default : next_state <= start; endcase end 코드 11.29

76 11.5.2 Mealy FSM 코드 11.29 //State Register
clk or posedge rst) begin if(rst == 1) state_reg <= start; else state_reg <= next_state; end //Output Logic assign dout_bit =(((state_reg == rd0_twice) &&(din_bit == 0) || (state_reg == rd1_twice) &&(din_bit == 1))) ? 1 : 0; endmodule 코드 11.29

77 Mealy FSM 코드 11.29의 시뮬레이션 결과

78 11.5.2 Mealy FSM 1 din_bit : detect_out : start st1 st3 st2 st4 1/0
1 din_bit : detect_out : start st1 st3 st2 st4 1/0 0/0 0/1 reset


Download ppt "순차회로 모델링 Sun, Hye-Seung."

Similar presentations


Ads by Google