SystemVerilog 기반의 논리 회로 설계(수업용) - 6장 상태기 설계

6064 단어 HDLSystemVerilog
IS3 마이크로컴퓨터 기반 HDL 실습

제6장 상태기의 설계


지난 장까지 저는 레지스터의 디자인 방법과 회로를 조합하는 디자인 방법, 그리고 이 회로 모듈을 조합하여 새로운 회로를 설계하는 방법을 배웠습니다.
조합 레지스터와 조합 회로를 통해 상태기를 설계할 수 있다.
본 장은 상태기의 설계 방법을 학습한다.

회로 규격


상태기 mystm로서 그림6.1에서 보듯이 1-bit 입력 p, 시계 입력 clock, 소스 낮은 비동기 복원 신호 nreset, 2-bit 출력 y[1:0]가 있는 회로를 고려합니다.
이런 상태기stm의 상태 전환은 그림6.2에서 보여 줍니다.
4개의 상태(SA, SB, SC, SD)를 가지고 있으며, 상태로만 Y를 출력하는 Moore형 상태기다.
상태 이동은 clock이 상승하는 시기에 발생합니다.
그 중에서 원천이 낮은 비동기 리셋 신호 nreset이 0일 때 (clock의 상승을 기다리지 않음) 상태는 즉시 SA로 복원됩니다.

<그림 6.1 상태기 mystm>

<그림 6.2mystm의 상태 이동도 >

회로 구조


상태기 mystm와 같은 Moore형 상태기는 그림6.3에서 보듯이 3개의 회로 모듈을 조합하여 구성할 수 있다.
register 모듈, 이register 모듈은 현재 상태와 현재 상태를 저장하는 레지스터이고, 이register 모듈은 현재 상태와 입력에서 다음 상태를 생성하는 다음 상태 함수 회로에 사용되는next-state_generator 모듈 및 세 번째 출력 함수 회로의output-현재 상태를 바탕으로 출력 신호 생성decorder 모듈입니다.
이 모듈의nextstate_gener와 output-decorder는 조합 논리 회로입니다.
다음은 세 모듈의 각각의 디자인을 살펴보자.
그리고 이 모듈들을 그림6.3과 같은 my로 조합한다stm 모듈을 구성합니다.

<그림 6.3mystm의 내부 구성 >

상태 레지스터


상태기 mystm는 4가지 상태가 있습니다.
이 상태들을 표 6.1과 같이 두 자리로 인코딩합니다.
<표 6.1 상태 코딩>
컨디션
기호state[1:0]
SA
00
SB
01
SC
10
SD
11
두 개의 레지스터를 준비하고 레지스터에 인코딩된 신호를 저장하면 현재 어떤 상태에 있는지 표시할 수 있습니다.
이 레지스터를 상태 레지스터라고 부른다.
목록 6.1에서 보듯이 상태 레지스터는 비동기적으로 복원된 2비트 레지스터로 설계할 수 있다.
또한 회로의 규격(그림6.3)에 따라 원천이 낮은 비동기 복원 nreset에 들어가면 SA로 상태가 복원되므로 목록 6.1에서도 nreset이 0일 때 출력 q[1:0]를 상태 SA에 해당하는 기호 00으로 초기화합니다.
<목록 6.1 register 모듈(이동식 리셋이 있는 2비트 레지스터)>
module register ( // 非同期リセット付き2ビットレジスタ
  input   logic       clock,
  input   logic       n_reset, // active low async reset
  input   logic [1:0] d,
  output  logic [1:0] q
);

  always_ff @ (posedge clock, negedge n_reset) begin
    if (n_reset == 1'b0) begin
      q <= 2'b00;  // SA にリセット
    end else begin
      q <= d;
    end
  end

endmodule

다음 상태 함수 회로


그림 6.2의 상태 마이그레이션 맵에 따라 현재 상태와 다음 상태의 관계를 테이블에 요약하면 표 6.2의 상태 마이그레이션 테이블을 얻을 수 있습니다.
<표 6.2mystm의 상태 마이그레이션 테이블 >
p
현재 상태
다음 상태
0
SA
SB
0
SB
SC
0
SC
SD
0
SD
SA
1
SA
SA
1
SB
SB
1
SC
SC
1
SD
SD
표6.1을 이용하여 표6.2의 상태 이동표에 나타난 상태를 기호로 바꾸면 다음 상태 함수 회로next를state_generator 모듈의 진리 값표(표6.3)를 얻을 수 있습니다.
<표 6.3회 상태 함수 회로nextstate_generator의 진리 값표 >
입력 p
state[1:0] 입력
출력nextstate[1:0]
0
00
01
0
01
10
0
10
11
0
11
00
1
00
00
1
01
01
1
10
10
1
11
11
표6.3의 진리치표를 바탕으로nextstate_generator 모듈은 목록 6.2에 따라 설명할 수 있습니다.
<목록 6.2nextstate_generator 모듈(다음 상태 함수 회로)>
module next_state_generator (
  input   logic [1:0] state,
  input   logic       p,
  output  logic [1:0] next_state
);

  always_comb begin
    case ({p, state})
      3'b0_00:  next_state = 2'b01;
      3'b0_01:  next_state = 2'b10;
      3'b0_10:  next_state = 2'b11;
      3'b0_11:  next_state = 2'b00;
      3'b1_00:  next_state = 2'b00;
      3'b1_01:  next_state = 2'b01;
      3'b1_10:  next_state = 2'b10;
      3'b1_11:  next_state = 2'b11;
      default:  next_state = 2'b00;
    endcase
  end

endmodule //

출력 함수 회로


그림 6.2의 상태 마이그레이션 다이어그램에 따라 현재 상태와 출력의 관계를 테이블에 요약하면 표 6.4를 얻을 수 있습니다.
<표 6.4 상태 및 출력에 대한 표>
현재 상태
출력 y[1:0]
SA
00
SB
01
SC
00
SD
10
아까와 마찬가지로 상태를 기호로 바꾸는 것을 통해 표6.5와 같이 출력 함수 회로outputdecorder의 진리 값표를 얻을 수 있습니다.
<표 6.5 출력 함수 회로 outputdecorder의 진리 값표 >
state[1:0] 입력
출력 y[1:0]
00
00
01
01
10
00
11
10
표 6.5 시작 outputdecorder 모듈은 목록 6.3처럼 설명할 수 있습니다.
<목록 6.3 outputdecorder 모듈(출력 함수 회로)>
module output_decoder (
  input   logic [1:0] state,
  output  logic [1:0] y
);

  always_comb begin
    case (state)
      2'b00   :  y = 2'b00;
      2'b01   :  y = 2'b01;
      2'b10   :  y = 2'b00;
      2'b11   :  y = 2'b10;
      default :  y = 2'b00;
    endcase
  end

endmodule //

조립상태기


위에서 말한 바와 같이 상태 레지스터register 모듈, 다음 상태 함수 회로nextstate_generator 모듈, 출력 함수 회로 output-데코더가 디자인이 됐습니다.
마지막으로 그림6.3에서 보듯이 이 모듈, 상태기 my를 연결한다.stm 할 수 있어요.
my_stm 모듈의 디자인 예는 목록 6.4와 같다.
<목록 6.4mystm 모듈 >
module my_stm (
  input   logic       clock,
  input   logic       n_reset,
  input   logic       p,
  output  logic [1:0] y
);

  logic [1:0] state;      // 今の状態
  logic [1:0] next_state; // 次の状態

  // 状態レジスタ
  register state_register(
    .clock    (clock),
    .n_reset  (n_reset),
    .d        (next_state),
    .q        (state)
  );

  // 次状態関数
  next_state_generator next_state_generator(
    .p          (p),
    .state      (state),
    .next_state (next_state)
  );

  // 出力関数
  output_decoder output_decoder(
    .state      (state),
    .y          (y)
  );

endmodule //

연습하다


목록 6.4my실습판 DE0-CV에 stm 모듈을 설치하여 동작을 확인합니다.
my_표5.6에서 보듯이 stm 모듈의 입력과 출력 신호를 DE0-CV의 입력과 출력 장치에 분배하십시오.
목록 6.1 register 모듈, 목록 6.2nextstate_generator 모듈 및 목록 6.3 outputdecorder 모듈이 필요하니까 프로젝트에도 디자인 파일을 추가하세요.
<표 6.6mystm 모듈의 입력과 출력을 장치에 할당 >
신호 이름
장치 지정
입출력
clock
KEY0
input
n_reset
KEY1
input
p
SW0
input
y[1:0]
LEDR1-LEDR0
output

좋은 웹페이지 즐겨찾기