26
93 module register (qout, data, load, reset, clock); output [3:0] qout; input [3:0] data; input load, reset, clock; reg [3:0] qout; always @ (posedge clock or negedge reset) begin Reset Load CLK Qi 0 x x 1 0 1 1 0 Qi Di 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에 대한 지식을 바탕으로 많이 사용 되는 기본적인 순차회로 블록들의 모델링과 순차회로 설계 방법에 대해서 배운다. 6.1 레지스터 레지스터는 n-bit 데이터를 저장하는 기억소자이다. 데이터의 저장은 클럭에 동기가 되어 이루어진다. 그림 6.1은 전형적인 레지스터의 블록도와 동작표이다. D0 D1 D2 D3 register Q0 Q1 Q2 Q3 Load Reset 그림 6.1 4비트 레지스터 이 레지스터는 클럭 이외에 두 개의 제어신호를 가지고 있다. load는 동기식 제어신호 로서 클럭의 상승에지에서 이 신호가 1이면 4비트 데이터 D4비트 출력 Q에 저장 된다. reset은 비동기 제어신호로서 이 신호가 0이면 출력은 클럭과 관계없이 즉시 0된다. 나머지 경우에는 출력은 그대로 유지된다. 6.1은 이 레지스터에 대한 동작적 모델이다. 예 6.1 reset과 load 제어입력을 가진 4비트 레지스터

6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

93

module register (qout, data, load, reset, clock);

output [3:0] qout;

input [3:0] data;

input load, reset, clock;

reg [3:0] qout;

always @ (posedge clock or negedge reset) begin

Reset Load CLK Qi

0 x x

1 0

1 1

0

Qi

Di

6장 순차회로 모델링

이 장에서는 앞에서 배운 여러 가지 모델링 방법에 대한 지식을 바탕으로 많이 사용

되는 기본적인 순차회로 블록들의 모델링과 순차회로 설계 방법에 대해서 배운다.

6.1 레지스터

레지스터는 n-bit 데이터를 저장하는 기억소자이다. 데이터의 저장은 클럭에 동기가

되어 이루어진다. 그림 6.1은 전형적인 레지스터의 블록도와 동작표이다.

D0D1D2D3

register

Q0Q1Q2Q3

LoadReset

그림 6.1 4비트 레지스터

이 레지스터는 클럭 이외에 두 개의 제어신호를 가지고 있다. load는 동기식 제어신호

로서 클럭의 상승에지에서 이 신호가 1이면 4비트 데이터 D가 4비트 출력 Q에 저장

된다. reset은 비동기 제어신호로서 이 신호가 0이면 출력은 클럭과 관계없이 즉시 0이

된다. 나머지 경우에는 출력은 그대로 유지된다. 예 6.1은 이 레지스터에 대한 동작적

모델이다.

예 6.1 reset과 load 제어입력을 가진 4비트 레지스터

Page 2: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

94

if (~reset) qout <= 4'b0; // reset

else if (load) qout <= data; // load

// 나머지 경우에는 hold

end

endmodule

여기에서 reset은 0일 때에 동작하는 비동기 제어신호이므로 감지목록에 negedge reset

이 포함된다. load는 동기식 제어신호이므로 감지목록에는 포함되지 않는다. 만약에

reset이 1일 때에 동작하는 비동기 제어신호라면 posedge reset이 감지목록에 포함된다.

쉬프트 레지스터

4장에서 4비트 쉬프트 레지스터에 대한 모델을 이미 보았다. 예 6.2는 비동기 Reset

제어신호를 포함한 4비트 쉬프트 레지스터의 모델이다. 여기에서 할당문은 각 플립플

롭의 병렬 동작을 나타내기 위해서 비블록킹 할당문을 사용하였다.

예 6.2 쉬프트 레지스터

module shiftreg(sout, sin, reset, clock);

output sout; // serial out

input sin, reset, clock; // serial in 등

reg [3: 0] qout;

assign sout = qout[0];

always @ (negedge reset or posedge clock) begin

if (reset == 1'b0)

qout <= 4'b0; // reset

else begin

qout[3] <= sin; // shift right

qout[2] <= qout[3];

qout[1] <= qout[2];

qout[0] <= qout[1];

end

end

endmodule

예 6.2의 모델에서 4비트의 데이터의 이동은 동일한 동작을 동시에 수행한다. 이러한

동작은 벡터 자료형 및 벡터 연산을 사용하면 더욱 간결하게 기술할 수 있다. 예 6.3

Page 3: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

95

Reset Sel CLK 동작

0 xx

1 00

1 01

1 10

1 11

reset

변화없음

shift right

shift left

병렬 load

은 예 6.2를 벡터 자료형과 연산을 사용하여 기술한 것이다.

예 6.3 쉬프트 레지스터 - 벡터 자료형 사용

module shiftreg(sout, sin, reset, clock);

output sout; // serial out

input sin, reset, clock; // serial in

reg [3: 0] qout;

assign sout = qout[0];

always @ (negedge reset or posedge clock) begin

if (reset == 1'b0) qout <= 4'b0; // reset

else qout <= { sin, qout[3:1] }; // shift left

end

endmodule

양방향 쉬프트 레지스터

예 6.3의 쉬프트 레지스터는 레지스터 값이 한자리씩 아래 자리로 이동한다. 우리가

비트를 표기할 때에 아래 자리가 오른쪽에 위치하므로 이 동작은 오른쪽 쉬프트 동작

이 된다. 왼쪽 쉬프트 동작은 값이 한자리씩 윗자리로 이동하는 것이다. 양방향 쉬프

트 레지스터는 오른쪽 쉬프트와 왼쪽 쉬프트 동작을 선택적으로 할 수 있는 레지스터

를 말한다. 그림 6.2는 병렬로드 기능을 갖는 양방향 쉬프트 레지스터의 블록도와 동

작표이다.

D0D1D2D3

Q0Q1Q2Q3

SelReset

2

LSBin

MSBin

그림 6.2 양방향 쉬프트 레지스터

이 쉬프트 레지스터에서 제어신호는 모두 동기식 제어신호로서 클럭의 상승에지에서

동작을 한다. reset은 출력을 0으로 만들며, sel은 2비트 동기식 제어신호로서 값에 따

라서 왼쪽 쉬프트, 오른쪽 쉬프트, 병렬 로드 및 변화없음 동작을 수행한다. 오른쪽

Page 4: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

96

쉬프트 동작에서는 최상위 비트가 MSBin 입력값으로 채워지며, 왼쪽 쉬프트 동작에서

는 최하위 비트가 LSBin 입력값으로 채워진다. 예 6.4는 그림 6.2의 양방향 쉬프트 레

지스터에 대한 기술이다.

예 6.4 병렬로드 기능이 있는 양방향 쉬프트 레지스터

module bishiftreg(qout, data, MSBin, LSBin, sel, reset, clock);

output [3: 0] qout; // parallel out

output MSBout, LSBout; // serial out

input [3:0] data; // parallel in

input MSBin, LSBin; // serial in

input [1:0] sel; // function select

input clock, reset;

reg [3:0] qout;

always @(posedge clock) begin

if (reset==0) qout <= 0;

else begin

case (sel)

0: qout <= qout; // hold

1: qout <= {MSBin, qout[3:1]}; // shift right

2: qout <= {qout[2:0], LSBin}; // shift left

3: qout <= data; // parallel Load

endcase

end

end

endmodule

예 6.4에서 선택신호에 따른 동작을 case 문을 사용하여 기술하였다. 표의 동작을 그

대로 기술하였기 때문에 qout <= qout 문장이 포함된 sel 신호가 0인 경우를 포함하였

으나 출력의 변화가 없는 경우에는 기술하지 않아도 되므로 sel 신호가 0인 경우는 포

함하지 않아도 된다.

6.2 카운터

카운터는 매 클럭마다 정해진 순서에 따라서 상태값이 변하는 레지스터를 말한다. 카

운터는 대개 값이 증가 또는 감소하는 순서로 변한다. 카운터의 모든 상태가 클럭에

Page 5: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

97

reset enable CLK Qi

0 x x

1 0

1 1

0

변화없음

증가

가 되어 변하면 동기식 카운터라고 하고 그렇지 않으면 비동기식 카운터라고 한다.

그림 6.3은 4비트 동기식 2진 카운터의 블록도와 동작표이다.

en

reset

counter

Q0Q1Q2Q3

그림 6.3 4비트 동기식 2진 카운터

이 카운터는 0000부터 1111까지의 16개의 상태를 가지며 순서대로 변한다. 1111의 다

음 상태는 0000이 된다. 두 개의 제어신호가 있는 데 reset은 출력을 0으로 만드는 비

동기식 제어신호이고 enable은 동기식 제어신호로서 클럭의 상승에지에서 이 신호가 1

이면 카운터 동작을 수행하고 그렇지 않으면 출력에 변화가 없다. 예 6.5는 이 카운터

에 대한 동작적 모델이다.

예 6.5 덧셈을 사용한 동기식 2진 카운터

module counter(qout, enable, reset, clock);

output [3:0] qout;

input enable, reset, clock;

reg [3:0] qout;

always @(negedge reset or posedge clock) begin

if (~reset) qout <= 0; // 비동기 reset

else if (enable) qout <= qout + 1; // 증가

end

endmodule

예 6.5에서 카운터 상태가 증가하는 동작을 단순히 1을 더하는 것으로 기술하였다. 출

력이 4비트이어서 캐리가 무시되므로 1111에서 0000으로 바뀌는 동작도 1을 더하는

것으로 기술할 수 있다. 이 모델은 합성도구에 의해서 미리 설계된 카운터를 사용하

여 합성될 수 있다.

동기식 카운터의 실제 구현은 덧셈 연산을 사용하지 않고 논리 연산만으로 구현된

다. 동기식 카운터의 각 자리는 아래 자리가 전부 1일 때에 바뀐다. 예를 들어서 0111

Page 6: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

98

reset up down CLK Qi

01111

x0011

x0101

x 0변화없음

감소

증가

변화없음

과 1111의 다음 상태가 각각 1000과 0000이며 bit 3은 bit 2부터 bit 0까지가 모두 111

일 때에 다음 상태에서 값이 바뀐다. 예 6.6은 이러한 동작을 기술한 것이다.

예 6.6 동기식 2진 카운터

module counter2(qout, enable, reset, clock);

output [3:0] qout;

input enable, reset, clock;

reg [3:0] qout;

always @(negedge reset or posedge clock) begin

if (~reset) qout <= 0;

else if (enable) begin

qout[0] <= ~qout[0];

if (qout[0] == 1'b1) qout[1] <= ~qout[1];

if (qout[1:0] == 2'b11) qout[2] <= ~qout[2];

if (qout[2:0] == 3'b111) qout[3] <= ~qout[3];

end

end

endmodule

증감 카운터

상태가 증가 또는 감소될 수 있는 기능을 모두 가지고 있는 카운터를 증감 카운터

라고 한다. 그림 6.4는 증감 카운터의 블록도와 동작표이며 예 6.6은 이 증감카운터의

동작을 기술한 것이다.

up

reset

Q0Q1Q2Q3

down

그림 6.4 증감 카운터

Page 7: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

99

reset load enable up CLK Qi

0

1

1

1

1

x

0

0

0

1

x

0

1

1

x

x

x

0

1

x

0

변화없음

감소

증가

병렬로드

예 6.6 증감 카운터

module updown_counter(qout, up_dn, reset, clock);

output [3:0] qout;

input [1:0] up_dn;

input reset, clock;

reg [3:0] qout;

always @ (negedge clock or negedge reset) begin

if (reset == 0) qout <= 4'b0; // reset

else if (up_dn == 2'b01) qout <= qout + 1; // up

else if (up_dn == 2'b10) qout <= qout - 1; // down

end

endmodule

여기에서 감소 동작은 뺄셈을 사용하여 기술하였으며 두 제어신호 up과 down은 2비

트 신호 up_dn으로 함께 나타내었다.

일반적으로 카운터는 병렬 로드 기능을 포함한 것이 많이 사용되며 그림 6.5는 이

러한 병렬로드 증감 카운터의 블록도와 동작표이다.

D0D1D2D3

counter

Q0Q1Q2Q3

load

resetupen

그림 6.5 병렬로드 증감 카운터

이 카운터에서의 reset 신호는 동기식 동작을 한다. 예 6.7은 이 카운터의 동작을 기술

한 것이다. 그림 6.5의 동작표에서 제어신호가 reset, load, enable, up의 순서로 동작이

적용되므로 예 6.7에서 제어신호를 이 순서로 기술하였다.

Page 8: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

100

module updown_counter2(qout, data, load, up, enable, reset, clock);

output [3:0] qout;

input load, up, enable, reset, clock;

input [3:0] data;

reg [3:0] qout;

always @(posedge clock) begin

if (reset) qout <= 4'b0; // reset

else if (load) qout <= data; // load

else if (enable) begin // enable

if (up) qout <= qout + 1; // up

else qout <= qout - 1; // down

end

end

endmodule

예 6.7 병렬로드 증감 카운터

모듈로 N 카운터

상태의 수가 N개인 카운터를 모듈로 N 카운터라고 하며 대개 0부터 N-1까지의 N

개의 상태를 갖는다. 상태가 0부터 9까지를 갖는 카운터를 10진 카운터라고 한다. 예

6.8은 동기식 reset 신호를 갖는 10진 카운터를 기술한 것이다.

예 6.8 동기식 10진 카운터

module counter10(qout, enable, reset, clock);

output [3:0] qout;

input enable, reset, clock;

reg [3:0] qout;

always @(posedge clock) begin

if (~reset) qout <= 0;

else if (enable) begin

if (qout==9) qout <= 0;

else qout <= qout + 1;

end

end

endmodule

Page 9: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

101

4비트 이진카운터를 사용한 여러 가지 카운터의 구현

미리 설계된 범용 카운터를 사용하여 다양한 카운터를 설계할 수 있다. 그림 6.6은

터미널 카운트 출력 TC와 동기식 reset 제어신호를 갖는 4비트 이진 카운터의 블록도

이다.

en

reset

counter

Q0Q1Q2Q3TC

그림 6.6 터미널카운터 출력을 가진 이진카운터

터미널 카운트 출력 TC는 enable이 1일 때에 이진카운터의 마지막 상태에서 1이 된다.

TC 출력은 이진카운터를 직렬로 연결하여 크기가 큰 카운터를 구성하는 데 이용될

수 있으며, 동기식 reset 제어신호는 모듈로 N 카운터를 구성하는 데 이용될 수 있다.

예 6.9는 그림 6.6의 카운터에 대한 기술이다.

예 6.9 캐리출력을 갖는 4비트 이진 카운터

// counter with synchronous reset

module counter4(qout, tc, enable, reset, clock);

output [3:0] qout;

output tc;

input enable, reset, clock;

reg [3:0] qout;

always @(posedge clock) begin

if (~reset) qout <= 0;

else if (enable) qout <= qout + 1;

end

assign tc = (qout == 4'b1111) & enable;

endmodule

예 6.10은 예 6.9의 4비트 이진 카운터를 사용하여 10진 카운터를 구성한 예이다. 상

Page 10: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

102

태가 9일 때 reset 신호가 0이 되도록 하여 다음상태가 0이 되도록 하였다. 그리고 출

력 tc를 사용하지 않으므로 이에 해당하는 부분은 빈칸으로 두었다.

예 6.10 이진 카운터를 사용한 10진 카운터

// modulo-10 counter

module counter10(qout, tc, enable, reset, clock);

output [3:0] qout;

input enable, reset, clock;

wire rst;

counter4 u1 (qout, ,enable, ~rst, clock);

assign rst = ~reset || (qout == 9);

endmodule

여러 개의 4비트 이진카운터를 사용하여 크기가 큰 이진 카운터를 구현할 수 있다.

그림 6.7은 4개의 4비트 이진카운터를 사용하여 16비트 카운터를 구현한 것으로서 높

은 자리의 카운터는 아래의 모든 자리의 출력이 1이 되어야 카운트 동작을 수행하므

로 이를 위해서 터미널 카운트 출력 tc는 높은 자리의 이진 카운터의 enable 신호로

사용되었다.

enq0-q3

tcreset

enq0-q3

tcreset

enq0-q3

tcreset

enq0-q3

tcreset

enable

resetclock

q0-q3 q4-q7 q8-q11 q12-q15

tc

그림 6.7 16비트 카운터

예 6.11은 16비트 카운터를 4비트 이진카운터를 사용한 구조적 모델링으로 기술한

것으로서 내부 신호 enable1, enable2, enable3는 카운터의 tc 출력을 다음 카운터의

enable 입력에 연결하기 위해서 사용되었다.

Page 11: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

103

예 6.11 4비트 이진카운터를 사용한 16비트 카운터

// modulo-10 counter

module counter16(qout, tc, enable, reset, clock);

output [15:0] qout;

input enable, reset, clock;

wire enable1, enable2, enable3;

counter4 u1 (qout[3:0],enable1, enable, reset, clock);

counter4 u2 (qout[7:4],enable2,enable1, reset, clock);

counter4 u3 (qout[11:8],enable3,enable2, reset, clock);

counter4 u4 (qout[15:12],tc,enable3, reset, clock);

endmodule

6.3 순차회로와 상태도

순차회로의 설계

현재의 입력에 의해서 출력이 정해지는 조합회로와는 달리 순차회로의 출력은 현재

의 입력 뿐 만 아니라 내부의 상태에 의해서 정해진다. 순차회로의 상태는 현재 상태

와 현재 입력에 따라서 다음 상태가 정해진다. 이처럼 순차회로의 상태는 입력의 변

화에 따라서 계속적으로 영향을 받으므로 과거의 입력들을 반영한 것이라고 할 수 있

다.

memory조합회로

input output

presentstate

nextstate

그림 6.8 순차회로의 구성

순차회로는 상태가 변화되는 시점이 클럭과 동기가 되는 동기식 순차회로와 그렇지

않은 비동기식 순차회로로 구분이 된다. 비동기식 순차회로는 설계하기가 어렵고 여

러 가지 문제점을 가지고 있기 때문에 대부분의 순차회로는 동기식으로 설계된다. 앞

으로 소개하는 순차회로는 동기식 순차회로에 국한하여 다루기로 한다.

동기식 순차회로에서 상태의 변화는 클럭의 특정 에지에서 발생한다. 현재 상태의

Page 12: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

104

변화는 다음 상태를 변화시킬 수 있으며 클럭의 에지에서 다음 상태 값이 현재 상태

로 된다. 메모리는 대개 에지 트리거 플립플롭을 사용하는 데 연속적인 상태 변화를

처리하기 위해서는 클럭 주기 TCLK는 다음의 조건을 만족해야 한다.

TCLK > tp + tcomb + tsu

여기서, tp와 tsu는 플립플롭 출력의 최대 지연시간과 플립플롭 입력의 최소 셋업시간

이고 tcomb는 조합회로의 입출력 사이의 최대 지연시간이다.

밀리 순차회로와 무어 순차회로

순차회로는 밀리(Mealy) 회로와 무어(Moore) 회로의 두 가지 형태가 있다. 밀리 회

로는 순차회로의 출력이 현재 상태와 입력에 의해서 정해지며 무어 회로는 출력이 현

재 상태에 의해서만 결정된다. 같은 동작을 수행하는 회로를 무어 회로로 설계할 경

우에 밀리 회로에 비해서 상태 수가 많아지지만 조합회로 부분은 간단해진다. 그리고

출력이 상태에 의해서만 정해지므로 클럭에 동기가 되어 변하여 글리치(glitch)가 없게

된다. 밀리 회로의 출력은 입력이 클럭과 비동기일 경우에 출력도 클럭과 비동기로

변할 수 있으며 입력이 클럭에 동기되는 신호일지라고 입력과 상태가 동시에 변하는

경우에 입력과 상태 변화와의 미세한 시차로 인하여 글리치가 여전히 발생할 수 있

다. 그림 6.9는 밀리 회로와 무어 회로의 구성도이다.

statenext state조합회로

input outputoutput조합회로

Mealy 회로

statenext state조합회로

input outputoutput조합회로

Moore 회로

clock

clock

그림 6.9 밀리 회로와 무어 회로

Page 13: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

105

상태도

순차회로의 동작은 타이밍도, 상태도(state diagram), 상태표(state table), 알고리즘 챠

트 등에 의해서 나타낼 수 있다. 동작의 외형적인 기술은 타이밍도를 많이 사용하지

만 설계를 위해서는 상태도, 상태표, 또는 알고리즘 챠트로 표현되어야 한다. 이 세

가지 방법은 서로 연관이 되어 있으며 여기에서는 상태도 만 다루기로 한다.

상태도의 기본 표기법은 그림 6.10와 같이 상태를 원으로 표시하고 현재 상태에서

다음 상태로의 전이는 입력이 표시된 화살표로 상태들을 연결하여 표시한다. 그리고

출력은 밀리 회로에서는 화살표에 표시한 입력과 함께, 무어 회로에서는 원 안의 상

태와 함께 표시한다. 그림 6.11은 밀리 회로와 무어 회로의 상태도의 예이다.

00 000/1

00/0

01/1

0

Mealy 회로

Moore 회로

그림 6.10 상태도의 기본 표기법

그림 6.11 상태도의 예 (a) 밀리 회로 (b) 무어 회로

상태도에 대한 모델링

순차회로에 대한 Verilog 모델링은 크게 상태 레지스터, 다음상태 조합회로, 출력 조

합회로의 세 부분으로 구성된다. 예 6.12는 그림 6.11 (a)의 상태도에 대한 Verilog 모

델링으로서 다음상태 조합회로와 출력 조합회로 부분을 함께 기술한 예이다.

Page 14: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

106

예 6.12 순차회로의 Verilog 모델링 - 다음상태와 출력을 함께 기술

module mealy1(out, state, in, reset, clock);

output out;

output [1:0] state;

input in, reset, clock;

reg out;

reg [1:0] state, nextstate;

always @(posedge clock or negedge reset) begin

if (~reset) state <= 2'b00;

else state <= nextstate;

end

always @(state or in) begin

out = 0;

case (state)

2'b00: if (in==0) nextstate = 2'b00;

else nextstate = 2'b01;

2'b01: if (in==0) begin nextstate = 2'b00; out = 1; end

else nextstate = 2'b11;

2'b10: if (in==0) begin nextstate = 2'b00; out = 1; end

else nextstate = 2'b10;

2'b11: if (in==0) begin nextstate = 2'b00; out = 1; end

else nextstate = 2'b10;

default: nextstate = 2'bxx;

endcase

end

endmodule

예 6.12에서 상태 레지스터는 클럭의 상승에지에서 다음 상태가 현재 상태로 저장되

며 reset 신호가 0일 때에 초기 상태값이 지정된다. case문을 사용하여 상태와 입력에

따라서 다음상태와 출력이 결정되는 동작을 기술하였는데 출력은 처음에 0으로 초기

화하고 case문에서는 출력이 1이 되는 경우만 기술하였다.

예 6.13은 그림 6.11 (a)의 상태도를 다음상태 조합회로와 출력 조합회로를 분리하여

기술한 예이다. 다음상태 조합회로는 case문을 사용하여 기술하였으며 출력 조합회로

는 assign을 사용한 연속할당문으로 기술하였다.

Page 15: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

107

예 6.13 밀리 순차회로의 Verilog 모델링 - 다음상태와 출력을 분리하여 기술

module mealy2(out, state, in, reset, clock);

output out;

output [1:0] state;

input in, reset, clock;

reg [1:0] state, nextstate;

always @(posedge clock or negedge reset) begin

if (~reset) state <= 2'b00;

else state <= nextstate;

end

always @(state or in) begin

case (state)

2'b00: if (in==0) nextstate = 2'b00;

else nextstate = 2'b01;

2'b01: if (in==0) nextstate = 2'b00;

else nextstate = 2'b11;

2'b10: if (in==0) nextstate = 2'b00;

else nextstate = 2'b10;

2'b11: if (in==0) nextstate = 2'b00;

else nextstate = 2'b10;

default: nextstate = 2'bxx;

endcase

end

assign out = (state==2'b01)&&(in==0) || (state==2'b11) && (in==0) ||

(state==2'b10)&&(in==0);

endmodule

그림 6.11 (b)의 무어 회로 상태도와 이와 같이 기술할 수 있는 데 출력에 대한 식

이 입력 신호가 없이 상태만으로 표시된다.

Page 16: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

108

6.4 맨체스터코드 변환기

데이터를 직렬 전송을 할 때에 사용되는 코딩 방식에는 다음과 같은 네 가지 방식

이 있다.

NRZ (non-return-to-zero) 코드: 입력 비트 값을 그대로 전송하는 방식이다. 같은 값

이 연속적으로 전송될 경우에 코드의 변화가 없다.

NRZI (non-return-to-zero invert-on-ones) 코드: 입력 비트 값이 0이면 코드의 변화가

없으며 1이면 코드 값을 바꾸어 보낸다. 0이 연속적으로 전송될 경우에 코드의 변

화가 없다.

RZ (return-to-zero) 코드: 입력 비트 값이 0이면 코드는 0을 전송하고 1이면 비트

시간의 전반부는 1을 후반부는 0을 전송한다. 이처럼 코드는 비트 시간의 후반부

에는 항상 0이 된다. 비트 시간은 한 비트가 전송되는 시간을 말한다. 0이 연속적

으로 전송될 경우에는 코드의 변화가 없다.

맨체스터(Manchester) 코드: 입력 비트 값이 0이면 비트시간의 전반부는 0을, 후반

부는 1을 전송하고 1이면 비트시간의 전반부는 1을, 후반부는 0을 전송한다. 이 방

식은 비트 시간마다 코드의 변화가 발생한다.

그림 6.12 직렬 전송 코딩 방식들의 파형

비트 스트림(bit stream)의 각 비트들 간의 경계는 클럭 신호에 의해서 구분된다. 맨체

스터 코딩으로 비트 스트림을 직렬 전송하면 비트 시간마다 코드의 변화가 발생하므

로 클럭 신호를 별도로 보내지 않더라도 수신측에서 PLL(phase locked loop) 회로에 의

해서 클럭 신호를 얻을 수 있다.

맨체스터 코드 변환기는 비트 시간마다 두 번의 변화가 발생하므로 비트 스트림용

클럭의 주파수의 2배의 주파수를 갖는 클럭 신호를 필요로 한다.

Page 17: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

109

module Manchester_Mealy(out, in, reset, clock, state);

output out;

output [1:0] state;

input in, reset, clock;

reg [1:0] state, next_state;

parameter S0 = 0, S1 = 1, S2 = 2;

always @(posedge clock or negedge reset) begin

if (reset==0) state <= S0; // initial state

else state <= next_state;

end

// next state combinational logic

always @(state or in) begin

case (state)

S0: if (in == 0) next_state = S1;

else if (in == 1) next_state = S2;

else next_state = 2'bx;

밀리 회로 구현

맨체스터 코드 변환기에 대한 상태도는 그림 6.13과 같이 표현된다. 초기 상태 S0에

서 입력이 0이면 출력을 0으로 만들고 상태 S1로 전이한 후에 출력을 1로 만들고 다

시 상태 S0로 전이한다. 입력이 1이면 출력을 1로 만들고 상태 S2로 전이한 후 출력

을 0으로 만들고 다시 상태를 S0로 전이한다.

s2 s00/1

s10/01/1

1/0

그림 6.13 맨체스터 코드 변환기의 밀리회로 상태도

예 6.14는 이 상태도를 기술한 것이다. 여기에서 parameter 키워드를 사용하여 상태

S0, S1, S2에 2진수를 할당하고 동작을 기술할 때에는 상태 이름을 그대로 사용하였

다. 이러한 기술은 상태 할당 값을 변경하고자 할 때에 parameter문 만 고치면 되므로

편리하다.

예 6.14 맨체스터 코드 변환기 - 밀리 회로 구현

Page 18: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

110

S1: next_state = S0;

S2: next_state = S0;

default: next_state = 2'bx;

endcase

end

// output combinational logic

assign out = (state==S0) && (in==1) || (state==S1) && (in==0);

endmodule

그림 6.14는 예 6.14의 구현에 대한 시뮬레이션 결과를 나타내는 파형이다. 출력 파

형에서 원으로 둘러싼 부분은 글리치이다. 글리치는 입력과 상태의 변화가 일치하지

않음으로 인해서 발생한다.

그림 6.14 밀리 회로 맨체스터 코드 변환기 시뮬레이션 결과

출력의 글리치를 없애려면 그림 6.15의 회로와 같이 레지스터를 사용하여 밀리회로

의 출력을 클럭에 동기시켜서 출력시킨다. 이 회로의 출력은 원래의 출력에서 한 클

럭씩 지연이 되어 나타난다.

register

clock

Mealy회로output

registeredoutput

그림 6.15 글리치를 없애기 위한 출력 회로

무어 회로 구현

맨체스터 코드 변환기를 무어 회로로 구현하기 위한 상태도는 그림 6.16과 같이 표

현된다. 입력이 0이면 상태가 S1과 S2로 순서대로 전이하며 상태 S1에서 출력이 0가,

Page 19: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

111

module Manchester_Moore(out, in, reset, clock, state);

output out;

output [1:0] state;

input in, reset, clock;

reg [1:0] state, next_state;

parameter S0 = 0, S1 = 1, S2 = 2, S3 = 3;

always @(posedge clock or negedge reset) begin

if (reset==0) state <= S0; // initial state

else state <= next_state;

end

// next state combinational logic

always @(state or in) begin

case (state)

S0, S2: if (in == 0) next_state = S1;

else next_state = S3;

S1: next_state = S2;

S3: next_state = S0;

default: next_state = 2'bx;

endcase

상태 S2에서 출력이 1이 된다. 입력이 1이면 상태가 S3과 S0의 순서대로 전이하며

상태 S3에서 출력이 1이, 상태 S0에서 출력이 0가 된다. 초기 상태는 S0이며 상태가

S0 또는 S2에서 새로운 비트 값을 입력받는다.

0s0/0

s3/1

s2/1

s1/0

01

1

1 0

그림 6.16 맨체스터 코드 변환기의 무어회로 상태도

예 6.15는 이 상태도를 기술한 것이다. 상태 S0와 S2는 다음 상태가 같으므로 함께

기술하였다.

예 6.15 맨체스터 코드 변환기 - 무어 회로 구현

Page 20: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

112

end

// output combinational logic

assign out = (state==S2) || (state==S3);

endmodule

그림 6.17는 예 6.15의 구현에 대한 시뮬레이션 결과를 나타내는 파형이다. 이 파형

에서 출력에는 글리치가 발생하지 않지만 원으로 표시한 것과 같이 출력이 입력보다

한 클럭 뒤에 나타남을 확인할 수 있다. 이 결과는 밀리 회로의 출력을 클럭에 동기

시킨 것과 같다.

그림 6.17 무어 회로 맨체스터 코드 변환기 시뮬레이션 결과

6.5 선형 피드백 쉬프트 레지스터

선형 피드백 쉬프트 레지스터(linear feedback shift register: LFSR)은 출력의 일부가

XOR 또는 XNOR게이트를 통하여 입력에 피드백되는 쉬프트 레지스터이다. LFSR은

오류 검출에 사용되는 CRC(cyclic redundancy check) 코드 생성기, 의사 난수 발생기

(pseudo random pattern generator), 암호화 등에 사용된다. 의사 난수 발생기는 회로의

동작 검사를 위한 스티뮬러스 패턴을 생성하는 데 사용될 수 있다.

그림 6.18은 한 개의 출력을 여러 입력에 XOR 게이트를 통하여 피드백 시키는

autonomous LFSR로서 의사 난수를 발생시키는 데에 사용된다. 이 회로에서 최상위 비

트 Y(N-1)은 Y(0)를 피드백 입력 받고 Y(k) (k < N-1)는 Ck가 0이면 Y(k+1)를 입력 받

고 Ck가 1이면 Y(k+1)과 Y(0)의 XOR 연산 결과를 입력 받는다. 여기서 Ck는 피드백

여부를 나타내며 탭 계수라고 부른다. LFSR은 용도에 따라서 탭 계수와 초기 상태가

정해진다. 예 6.16은 8비트 LFSR 회로를 모델링한 예이다.

Page 21: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

113

그림 6.18 한 출력을 여러 입력에 피드백시키는 LFSR

예 6.16 LFSR 회로

module LFSR(Y, reset, clock);

parameter initial_state = 8'b1001_0001; // 91h

parameter [7:1] C = 7'b100_1111; // coefficient

input reset, clock;

output [7:0] Y;

reg [7:0] Y;

always @ (posedge clock) begin

if (!reset) // Active-low reset to initial state

Y <= initial_state;

else begin

Y[7] <= Y[0];

Y[6] <= C[7] ? Y[7] ̂ Y[0] : Y[7];

Y[5] <= C[6] ? Y[6] ̂ Y[0] : Y[6];

Y[4] <= C[5] ? Y[5] ̂ Y[0] : Y[5];

Y[3] <= C[4] ? Y[4] ̂ Y[0] : Y[4];

Y[2] <= C[3] ? Y[3] ̂ Y[0] : Y[3];

Y[1] <= C[2] ? Y[2] ̂ Y[0] : Y[2];

Y[0] <= C[1] ? Y[1] ̂ Y[0] : Y[1];

end

end

endmodule

Page 22: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

114

예 6.16의 모델링은 비슷한 과정이 반복되므로 예 6.17과 같이 반복문을 사용하여 더

간단하게 기술할 수 있으며 이 모델링에서는 쉬프트 레지스터의 비트 수도 재지정될

수 있도록 parameter를 사용하여 나타낼 수 있다.

예 6.17 반복문을 사용한 LFSR 회로

module LFSR2(Y, reset, clock);

parameter N = 8; // length

parameter initial_state = 8'b1001_0001; // 91h

parameter [N-1:1] C = 7'b100_1111; // coefficient

input reset, clock;

output [N-1:0] Y;

reg [N-1:0] Y;

integer k;

always @ (posedge clock) begin

if (!reset) // Active-low reset to initial state

Y <= initial_state;

else begin

Y[N-1] <= Y[0];

for (k = 1; k <= N-1; k=k+1)

Y[k-1] <= C[k] ? Y[k] ̂ Y[0] : Y[k];

end

end

endmodule

그림 6.19은 설계한 회로가 동작되는 예를 나타낸 것이다.

그림 6.19 LFSR의 데이터 이동

Page 23: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

115

6.6 레지스터 파일

레지스터 파일(register file)은 여러 개의 레지스터들을 포함한 회로로서 레지스터들

이외에 레지스터에 대한 읽기, 쓰기를 위한 추가적인 회로로 구성되어 있다. 레지스터

파일은 포함한 레지스터들에 대한 읽기와 쓰기를 동시에 수행할 수 있다.

그림 6.20은 16개의 레지스터로 구성된 레지스터 파일의 블록도로서 동시에 두 개

의 레지스터 값을 읽어서 출력하고, 한 개의 레지스터에 입력 값을 저장하는 동작을

수행할 수 있다.

raddr1

raddr2

waddr

4

4

4

din

dout1

dout2

32

32

32

register file

wen

그림 6.20 16개의 레지스터를 포함한 레지스터 파일의 블록도

레지스터 파일 내의 레지스터는 4비트 주소로 선택되며 raddr1과 raddr2는 데이터를

읽을 두 레지스터의 주소 입력이며, waddr는 데이터를 저장할 레지스터의 주소 입력

이다. dout1과 dout2는 주소 raddr1과 raddr2이 지정하는 레지스터의 값을 출력한다. 데

이터의 저장은 클럭에 동기되어 이루어진다. wen (write enable) 신호는 데이터 저장을

활성화하는 신호로서 입력 데이터 din은 wen이 1일 때의 클럭의 상승에지에서 waddr

이 지정하는 레지스터에 저장된다.

이러한 동작을 수행하는 레지스터 파일은 그림 6.21과 같이 구성될 수 있다. 16개의

레지스터의 출력은 두 개의 멀티플렉서의 입력에 연결되는 주소 raddr1과 raddr2에 의

해서 선택된 레지스터의 출력이 두 멀티플렉서의 출력으로 전달되어 동시에 두 레지

스터의 값을 읽을 수 있다. 입력 데이터는 모든 레지스터의 입력에 연결되어 있다. 그

렇지만 디코더를 통하여 waddr에 의해서 선택된 하나의 레지스터만 인에이블이 되어

클럭에 동기되어 입력 데이터를 저장할 수 있으며 wen이 디스에이블되면 아무 레지스

터도 인에이블되지 않는다.

Page 24: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

116

module regfile(dout1, dout2, din, raddr1, raddr2, waddr, wen,

clock);

output [31:0] dout1, dout2;

input [31:0] din;

input [3:0] raddr1, raddr2, waddr;

input wen, clock;

reg [31:0] reg_file [0:15]; // 32 bit x 16 word memory declaration

reg [31:0] dout1, dout2;

integer i;

// write

always @(posedge clock) begin

for (i=0; i<16; i=i+1) begin

if (wen & (waddr==i)) reg_file[i] <= din;

end

end

// read

always @(raddr1 or raddr2 or reg_file[0] or ... or reg_file[15]) begin

dout1 = 32'bx;

dout2 = 32'bx;

mux

dout1

dout2

raddr1raddr2

din

CLK

4

enD Q

enD Q

R0

R1

enD Q

R15

32

waddr

decoder

wen

그림 6.21 레지스터 파일의 내부 구성도

예 6.18은 그림 6.21과 같은 구성의 레지스터 파일을 설계한 예이다. 이 설계에서 디

코더와 멀티플렉서를 명시적으로 사용하지는 않았지만 두 동작에 대한 기술이 포함되

어 있다.

예 6.18 레지스터 파일

Page 25: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

117

for (i=0; i<16; i=i+1) begin

if (raddr1==i) dout1 = reg_file[i];

if (raddr2==i) dout2 = reg_file[i];

end

end

endmodule

레지스터 파일은 예 6.19와 같이 주소 신호를 배열의 첨자로 사용하여 기술할 수 있

으며 이러한 기술은 훨씬 간단하지만 논리합성 도구에 따라서 합성되지 못할 수도 있

다.

예 6.19 레지스터 파일

module register_file(dout1, dout2, din, raddr1, raddr2, waddr, wen,

clock);

output [31:0] dout1, dout2;

input [31:0] din;

input [3:0] raddr1, raddr2, waddr;

input wen, clock;

reg [31:0] reg_file [0:15]; // 32 bit x 16 word memory declaration

assign dout1 = reg_file[raddr1]; // read

assign dout2 = reg_file[raddr2];

always @ (posedge clock) begin // write

if (wen) reg_file[waddr] <= din;

end

endmodule

이러한 레지스터 파일은 그림 6.22와 같이 ALU와 연결하여 두 레지스터 값을 동시에

읽어서 연산을 수행한 후 연산 수행 결과를 같은 클럭 사이클의 끝에서 저장할 수 있

도록 하는 데 사용될 수 있다.

Page 26: 6장 순차회로 모델링 - Yonsei Universitycsys.yonsei.ac.kr/lect/emhw/v/v6.pdf · 6장 순차회로 모델링 이 장에서는 앞에서 배운 여러 가지 모델링 방법에

118

Raddr1Raddr2

Waddr

DataIn

DataOut1

DataOut2

WEN CLK

ALU

register file

그림 6.22 ALU에 연결된 레지스터 파일