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 |