본문 바로가기

Verilog/HDLbits

[HDLBits] Exams/ece241 2013 q4

1.    문제 및 설명

     A.     큰 물 저장 탱크가 여러 사용자에게 물을 공급한다. 수위를 충분히 높게 유지하기 위해, 5인치 간격으로 세 개의 센서가 수직으로 배치되어 있다.

  • 수위가 가장 높은 센서(S3)보다 위에 있을 때는 입력 유량(flow rate)은 0이어야 한다.
  • 수위가 가장 낮은 센서(S1)보다 아래에 있을 때는 유량이 최대가 되어야 한다 (기본 유량 밸브와 보조 유량 밸브 모두 개방).

     B.      수위가 상단 센서와 하단 센서 사이에 있을 경우, 유량은 두 가지 요소에 의해 결정된다:

  • 현재 수위
  • 마지막 센서 변화 이전의 수위

     C.      각 수위 구간마다 대응되는 기본 유량(nominal flow rate)이 아래 표에 주어져 있다.

  • 센서 변화가 발생하기 전의 이전 수위가 현재 수위보다 낮았다면 → 기본 유량을 그대로 적용한다.
  • 이전 수위가 현재 수위보다 높았다면보조 유량 밸브(ΔFR로 제어)를 열어 유량을 증가시킨다.

     D. 수위별 조건표

수위 상태 활성 센서 출력되어야 할 기본 유량
S3 S1, S2, S3 없음
S3 S2 사이 S1, S2 FR1
S2 S1 사이 S1 FR1, FR2
S1 아래 없음 FR1, FR2, FR3

 

2.    요구사항

     A.     물 저장 탱크 제어기를 위한 Moore 상태 머신(state diagram)을 설계하시오.

  • 모든 상태 전이(state transitions)와 각 상태에서의 출력(outputs)을 명확히 표시하시오.
  • FSM 입력: S1, S2, S3
  • FSM 출력: FR1, FR2, FR3, ΔFR

 

3. 문제 풀이

     A. state 

  • A: (Sensor Asserted:None, Before State: A)
  • B: (Sensor Asserted: S1, Before State: A or B) 
  • C: (Sensor Asserted: S1, S2, Before State: B or C)
  • D: (Sensor Asserted: S1, S2, S3, Before State: C or D)
  • AD: (Sensor Asserted: None, Before State: B)
  • BD: (Sensor Asserted: S1, Before State: C)
  • CD: (Sensor Asserted: S1, S2, Before State: D)

 

 

 

2. 모듈 정의

module top_module (
    input clk,
    input reset,
    input [3:1] s,
    output fr3,
    output fr2,
    output fr1,
    output dfr
);

 

 

 

 

3. 답

module top_module (
    input clk,
    input reset,
    input [3:1] s,
    output fr3,
    output fr2,
    output fr1,
    output dfr
); 
    
    parameter A = 3'd0, B = 3'd1, C = 3'd2, D = 3'd3, AD = 3'd4, BD = 3'd5, CD = 3'd6;
    reg [2:0] state,next_state; 
    
    assign fr1 = (state != D);
    assign fr2 = (state != D)&(state != C)&(state != CD);
    assign fr3 = (state != D)&(state != C)&(state != CD)&(state != B)&(state != BD);
    assign dfr = (state == AD)|(state == BD)|(state == CD)|(state == A);
    
    always@(*)
        begin
            case(state)
                A: next_state = (s == 3'b001)?B:A;
                B: next_state = (s == 3'b011)?C:((s == 3'b000)?AD:B);
                C: next_state = (s == 3'b111)?D:((s == 3'b001)?BD:C);
                D: next_state = (s == 3'b111)?D:CD;
                AD: next_state = (s == 3'b001)?B:AD;
                BD: next_state = (s == 3'b011)?C:((s == 3'b000)?AD:BD);
                CD: next_state = (s == 3'b111)?D:((s == 3'b001)?BD:CD);                
            endcase 
        end
    
    always@(posedge clk)
        begin
            if(reset)
                begin
                    state = A;
                end
            else
                begin
                    state <= next_state;
                end
        end
    
endmodule
 



'Verilog > HDLbits' 카테고리의 다른 글

[HDLBits] Lemmings2  (0) 2026.04.11
[HDLBits] Lemmings1  (0) 2026.04.10
[HDLBits] Fsm3s  (0) 2026.03.17
[HDLBits] Fsm3  (0) 2026.03.17
[HDLBits] Fsm3onehot  (0) 2026.03.06