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

Slides:



Advertisements
Similar presentations
Hankuk University of Foreign Studies Design and Verification Using FPGA Board Part I.
Advertisements

Family 의 개요 의 외부 Pin 기능과 내부 기능 Memory 구조 Timing 2 장 8051 의 구조.
1 8 장 대형 순차회로 문제의 해법 1) 시프트 레지스터 2) 카운터 3)ASM 도를 이용한 설계 4)One Hot encoding 5) 복잡한 예제.
임진수 이현철. 회로 설계 과정 합성 ?  합성 도구가 주어진 HDL 코드를 Library 에 맞춰 회로로 변경시켜주는 과정  모든 코드가 합성되는 것은 아니다 !
키보드 보안 순천향대학교 정보보호학과 임강빈 교수.
03월 식단표 So hot 비빔’s 덮으면 모락모락 보라매 도시락 03/21 (월) 03/22 (화) 03/23 (수)
11 레지스터 (Register) IT CookBook, 디지털 논리회로.
1 08 Simple Sequential Logic Design with Finite State Machines & Timing Design.
ARM을 이용한 7 segment LED 제어 Verilog 소스
VHDL 프로그램은 비동기 Reset을 갖는 D 플립플롭을 구현한 것이다
최종 프로젝트 Final Experiments in Electrical & Computer Engineering 1
AMBA BUS Protocol의 이해 (AMBA 2.0 Specification)
Chapter 7. Flip-Flops and Other Multivibrators
ASIC의 개요 ASIC(Application Specific Integrated Circuit) 특정 용도 주문형 집적회로
디지털 시계 설계.
제8장. RISC 및 슈퍼스칼라 프로세서 8.1 RISC의 출현 동기 8.2 RISC의 발전 경위
마이크로프로세서 메모리 및 입출력장치 인터페이스
Digital Logic Structures
기본 컴퓨터 프로그래밍 Lecture #6.
Computer System Architecture
7 조합논리회로 IT CookBook, 디지털 논리회로.
2 Part 전자계산기 구조 1. 논리 회로 2. 자료 표현 및 연산 3. 명령어 및 프로세서 4. 명령 수행 및 제어 5.
4 컴퓨터에서 활용되는 디지털 논리회로 IT CookBook, 컴퓨터 구조와 원리 2.0.
VHDL, FPGA를 이용한 소리인식 스위치 (Matched Filter 사용)
Sequential logic circuit
순차로직 개요.
조합 논리회로 설계 및 검증 Sun, Hye-Seung.
1. VHDL과 합성 설계 1.1 HDL: Hardware Description Language 집적회로의 설계환경의 변화
10장 주변장치 (PIO) Slide 1 (of 28).
Chapter 11. 레지스터.
임베디드 하드웨어 Lecture #6.
Verilog HDL 이론.
디지털 시스템 설계(3).
행위수준 모델링 Sun, Hye-Seung.
VHDL Description D-latch C=1 일 때 Q 는 D의 입력 값 이 전달된다.
신호등 제어기 차량의 흐름에 따라 신호등의 신호를 제어하는 장치 신호등 제어기의 입출력 신호
공학실험.
Computer System Architecture
COMPUTER ARCHITECTIRE
Ch2-2. VHDL Basic VHDL lexical element VHDL description
존슨카운터의 동작을 설명·설계할 수 있다 링카운터의 동작을 설명·설계할 수 있다
조합논리회로 모델링 Sun, Hye-Seung.
1장. 디지털 논리 회로 다루는 내용 논리 게이트 부울 대수 조합 논리회로 순차 논리회로.
순차 회로 설계 및 검증 Sun, Hye-Seung.
6 중앙처리장치의 조직과 기능 IT CookBook, 컴퓨터 구조와 원리 2.0.
FSM 설계.
Flip-Flop 설계.
SoC Test 실습 강성호 (연세대학교, 전기전자공학과) Copyrightⓒ2003.
Fault Diagnosis for Embedded Read-Only Memories
Programmable Logic Device
Chapter 4 The Von Neumann Model.
VHDL Mealy and Moore model
Sequence Logic.
Chapter 01. 들어가기.
6-1 중앙 처리 장치의 내부 구조 6-2 명령(instruction) 6-3 주소 지정 방식
Chapter 01 디지털기초.
8051 IO-PORT 정보통신•컴퓨터 공학부 송명규
사거리 신호등 제어 한국외국어대학교 전자공학과 SoC 설계.
Digital design 5장. 동기식 순차논리.
목적을 갖고 살아요!.
디 지 털 공 학 한국폴리텍V대학.
Chapter 08. 플립플롭.
LCD.
나비는 두 꽃 중에서 어느 꽃으로 날아 갈까요? 한 장미꽃은 향기가 나고 한 장미꽃은 악취가 납니다 두 개의 장미꽃이 있습니다
4. Flip-Flops : S-R, D, J-K, T 컴퓨터 구조 실습 안내서.
DEGITAL LOGIC CIRCUIT Term Project – 4 bit ALU.
아날로그 신호와 디지털 신호의 개념을 이해할 수 있다.
논리회로 설계실험 ICE ICE 담당교수 : 김 인 수.
임베디드 하드웨어 Lecture #6.
VHDL 응용 Lecture #10.
Presentation transcript:

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

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

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

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

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

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; always @(clock or rst or d) begin if(!rst) q = 1'b0; else if(clock) q = d; end endmodule 코드 11.3

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

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

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

11.1.1 래치(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; always @(en or a or b or c) begin if(en) begin y = ~(m & c); m = ~(a | b); end endmodule 코드 11.6

11.1.1 래치(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; always @(en or a or b or c) begin if(en) begin y <= ~(m & c); m <= ~(a | b); end endmodule 코드 11.7

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; always @(posedge clk) q <= d; endmodule Positive edge-triggered D Flip-flop 코드 11.8

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

11.1.2 플립플롭(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; always @(posedge 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; always @(posedge clk) begin // blocking assignments q = d; q_bar = ~d; end endmodule 코드 11.9(b)

11.1.2 플립플롭(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; always @(posedge clk) q <= d; endmodule Recommended 코드 11.9(c)

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

11.1.2 플립플롭(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; always @(posedge clk) begin q <= d; q_bar <= ~q; end endmodule 코드 11.10

11.1.2 플립플롭(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; always @(posedge clk) // include only clk begin if(!rst_n) // active-low reset q <= 1'b0; else q <= d; end endmodule 코드 11.11

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

11.1.2 플립플롭(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; always @(posedge 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

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

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

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; always @(posedge clk) begin m = ~(a & b); n = c | d; y = ~(m | n | e); end endmodule 코드 11.13 합성 결과 Flip Flop

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; always @(posedge clk) begin m <= ~(a & b); n <= c | d; y <= ~(m | n | e); end endmodule 코드 11.14 합성 결과 Flip Flop

11.1.2 플립플롭(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; always @(posedge clk) begin y = ~(m | n | e); m = ~(a & b); n = c | d; end endmodule 코드 11.15

11.2 Blocking과 Nonblocking 할당문 module blk1(clk, d, q3); input clk; output q3; input d; reg q3, q2, q1, q0; always @(posedge 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; always @(posedge clk) begin q3 = q2; q2 = q1; q1 = q0; q0 = d; end endmodule 코드 11.16(a) 코드 11.16(b) Flip Flop Shift register

11.2 Blocking과 Nonblocking 할당문 module non_blk1(clk, d, q3); input clk; output q3; input d; reg q3, q2, q1, q0; always @(posedge 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; always @(posedge clk) begin q3 <= q2; q2 <= q1; q1 <= q0; q0 <= d; end endmodule 코드 11.17(a) 코드 11.17(b) Flip Flop

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

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

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; always @(posedge 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; always @(posedge 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)

11.2 Blocking과 Nonblocking 할당문 module ba_nba3(q, a, b, clk, rst_n); output q; input a, b, rst_n, clk; reg q; always @(posedge 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; always @(posedge clk or negedge rst_n) if(!rst_n) q <= 1'b0; else q <= tmp; endmodule 코드 11.18(d)

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; always @(posedge clk or negedge rst_n) if(!rst_n) q <= 1'b0; else q <= d1; else q <= d2; endmodule 코드 11.19 Multiple source driving이 발생하는 코딩

11.2 Blocking과 Nonblocking 할당문 코드 11.20 (a), (b)의 출력 y1, y2를 확인하고, 그 이유를 생각해 본다. 코드 11.20 (a), (b)의 합성 결과, 동일한 회로가 되는지, 아니면 서로 다른 회로가 되는 지 확인한다. module fbosc_blk(y1, y2, clk, rst); output y1, y2; input clk, rst; reg y1, y2; always @(posedge 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)

11.2 Blocking과 Nonblocking 할당문 module fbosc_nonblk(y1, y2, clk, rst); output y1, y2; input clk, rst; reg y1, y2; always @(posedge 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)

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

11.3.1 직렬입력-직렬출력 시프트 레지스터 그림 11.17 직렬입력-직렬출력 시프트 레지스터 clk rst DFF Q D sin sout q[0] q[1] q[2] q[7] 그림 11.17 직렬입력-직렬출력 시프트 레지스터 module shift_reg_nblk1(clk, rst, sin, sout); input clk, rst, sin; output sout; reg [7:0] q; assign sout = q[7]; always @(posedge 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

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]; always @(posedge clk) begin if(!rst) q <= 0; else begin q[0] <= sin; q[7:1] <= q[6:0]; end endmodule 벡터 할당문을 사용한 경우 코드 11.22

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

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 그림 11.19 병렬입력-직렬출력 시프트 레지스터

11.3.2 병렬입력-병렬출력 시프트 레지스터 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; always @(posedge clk) begin if(!rst) data_reg <= 0; else if(load) data_reg <= din; else data_reg <= data_reg << 1; end endmodule 코드 11.23

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

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

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]; always @(posedge 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

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

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

11.3.2 병렬입력-병렬출력 시프트 레지스터 코드 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; 왼쪽 시프트)

11.3.3 선형 귀환 시프트 레지스터 선형 귀환 시프트 레지스터(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 그림 11.23 LFSR 회로

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

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 할당문을 사용한 경우 always @(posedge 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)

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 할당문을 사용한 경우 always @(posedge 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)

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 할당문을 사용한 경우 always @(posedge 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)

11.3.3 선형 귀환 시프트 레지스터 3비트 LFSR Bad Code module lfsr_Bad2(q3, clk, pre_n); output q3; input clk, pre_n; reg q3, q2, q1; always @(posedge 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)

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

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

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

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

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

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비트 증가/감소 계수기를 설계하고, 시뮬레이션을 통해 동작을 확인한다.

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; always @(posedge 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

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

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

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

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

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 문으로 표현한다.

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

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; always @(posedge clk or negedge rst_n) //State Register if(!rst_n) state <= IDLE; else state <= next; always @(state 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)

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; always @(posedge clk or negedge rst_n) //State Register if(!rst_n) state <= IDLE; else state <= next; 코드 11.28(b)

11.5.1 Moore FSM 코드 11.28(b) //Next State and Output Logic always @(state 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)

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; always @(posedge clk or negedge rst_n) //State Register if(!rst_n) state <= IDLE; else state <= next; always @(state 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)

11.5.1 Moore FSM 코드 11.28(c) //Output Logic and output register always @(posedge 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)

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

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

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

11.5.2 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

11.5.2 Mealy FSM 코드 11.29 //Next State Logic always @(state_reg 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

11.5.2 Mealy FSM 코드 11.29 //State Register always @(posedge 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

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

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