SystemVerilog 기반의 논리 회로 설계(수업용) - 6장 상태기 설계
6064 단어 HDLSystemVerilog
제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
Reference
이 문제에 관하여(SystemVerilog 기반의 논리 회로 설계(수업용) - 6장 상태기 설계), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/rikitoro@github/items/eeccf22ae5d676ace77f
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
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 //
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 //
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 //
Reference
이 문제에 관하여(SystemVerilog 기반의 논리 회로 설계(수업용) - 6장 상태기 설계), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/rikitoro@github/items/eeccf22ae5d676ace77f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)