1. 문제 및 설명
A. 이 문제는 복잡한 카운터를 만들기 위한 5단계 중 최종번째 단계입니다.
B. 타이머를 제어하는 FSM을 설계하시오.
- 이 타이머는 특정 패턴(1101)이 감지되면 시작됩니다.
- 이후 4비트를 추가로 입력 받아 지연 시간을 결정합니다.
- 카운터가 종료 될 때 까지 기다립니다.
- 사용자에게 알림을 보내고, 사용자의 확인을 기다립니다.
2. 요구사항
- 시퀀스 감지: 입력에서 특정 패턴('1101')이 감지되면 타이머가 시작됩니다.
- 데이터 입력: 패턴 감지 직후, 이어지는 4비트(최상위 비트 우선, MSB first)를 추가로 입력받아 지연 시간 값인 delay[3:0]을 결정합니다.
- 카운팅: counting 신호를 활성화하여 카운팅 중임을 알립니다. 이때 카운팅 시간은 정확히 (delay[3:0] + 1) * 1000 클록 주기입니다.
- 예: delay가 0이면 1000 주기, delay가 5이면 6000 주기를 카운트합니다.
- 남은 시간 출력: count[3:0] 출력은 현재 남은 지연 시간 단위를 나타내야 합니다. (각 1000 주기마다 delay 값에서 1씩 감소하여 0이 될 때까지 출력)
- 완료 및 확인: 카운팅이 끝나면 done 신호를 1로 설정하여 타이머 종료를 알리고, ack 입력이 1이 될 때까지 대기합니다.
- 리셋: ack을 받으면 다시 처음 상태로 돌아가 '1101' 시퀀스를 찾습니다.
- 카운팅하지 않는 동안 count[3:0] 출력값은 무엇이든 상관없습니다(Don't-care).
- 회로가 리셋되면 다시 '1101' 시퀀스를 검색하는 상태로 시작되어야 합니다.
3. 문제 풀이
A. state
| 상태 | 의미 |
| S0 | 1 입력 대기 |
| S1 | 1 입력 대기 (1) |
| S2 | 0 입력 대기 (11) |
| S3 | 1 입력 대기 (110) |
| Shift0 | 1101 감지완료 -> shift 시작 |
| Shift1 | shift 1번째 |
| Shift2 | shift 2번째 |
| Shift3 | shift 3번째 |
| Count | shift 4번째, Counting |
| Wait | Counting 완료(Done), ACK 대기 |

4. 모듈 정의
module top_module (
input clk,
input reset, // Synchronous reset
input data,
output [3:0] count,
output counting,
output done,
input ack );
5. 답
module top_module (
input clk,
input reset, // Synchronous reset
input data,
output [3:0] count,
output counting,
output done,
input ack );
parameter S0 = 4'd0, S1 = 4'd1, S2 = 4'd2, S3 = 4'd3,
Shift0 = 4'd4, Shift1 = 4'd5, Shift2 = 4'd6, Shift3 = 4'd7,
Count = 4'd8, Wait = 4'd9;
reg [3:0] state, next_state;
reg [3:0] reg_count;
reg [9:0] cnt;
wire shift_ena;
wire done_counting;
always@(*)
begin
case(state)
S0: next_state = data?S1:S0;
S1: next_state = data?S2:S0;
S2: next_state = data?S2:S3;
S3: next_state = data?Shift0:S0;
Shift0: next_state = Shift1;
Shift1: next_state = Shift2;
Shift2: next_state = Shift3;
Shift3: next_state = Count;
Count: next_state = done_counting?Wait:Count;
Wait: next_state = ack?S0:Wait;
default: next_state = S0;
endcase
end
assign counting = (state==Count);
assign done = (state == Wait);
assign shift_ena = (state==Shift0)|(state == Shift1)|(state == Shift2)|(state == Shift3);
assign done_counting = counting&(reg_count == 4'b0)&(cnt == 10'd999);
assign count = reg_count;
always@(posedge clk) begin
if(reset) begin
state <= S0;
end else begin
state <= next_state;
end
end
always@(posedge clk) begin
if(reset) begin
reg_count <= 4'b0;
cnt <= 10'b0;
end else begin
if(shift_ena) begin
reg_count <= {reg_count[2:0], data};
cnt <= 0;
end
else if(counting & cnt < 10'd999) begin
cnt <= cnt + 1'b1;
end
else if (counting & cnt ==10'd999) begin
cnt <= 10'b0;
reg_count <= reg_count - 1'b1;
end else begin
cnt <= 10'd0;
end
end
end
endmodule
'Verilog > HDLbits' 카테고리의 다른 글
| [HDLBits] Exams/review2015 fsmonehot (0) | 2026.05.31 |
|---|---|
| [HDLBits] Exams/review2015 fsm (0) | 2026.05.31 |
| [HDLBits] Exams/review2015 shiftcount (0) | 2026.05.31 |
| [HDLBits] Exams/review2015 shiftcount (0) | 2026.05.31 |
| [HDLBits] Exams/review2015 shiftcount (0) | 2026.05.31 |