본문 바로가기

Verilog/HDLbits

[HDLBits] Exams/review2015 fancytimer

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