1. 문제 및 설명
A. 모터를 제어하기 위한 FSM이다.
- 입력
- x
- y
- clk
- resetn
- 출력
- f
- g
B. FSM 초기 동작
- resetn = 0 인 동안 FSM은 초기 상태인 상태 A를 유지한다.
- resetn이 비활성화 되면, 다음 클록에 f=1을, 한 클럭 동안 출력한다.
C. 입력 x 패턴 검출
- 연속된 3개의 클록 동안 x가 1-> 0-> 1 패턴이 입력 되면, 다음 클럭 사이클에서 g=1을 출력해야 한다.
D. 입력 y 감시
- g=1인 상태가 된 이후 FSM은 y를 감시한다.
- 최대 2클록 이내에 y=1이 입력되면, g=1을 계속 유지한다.
- 2클록 이내에 y=1이 입력되지 않으면 g=0을 계속 유지한다.
- reset 전까지 위 상태를 유지한다.
2. 요구사항
A. FSM을 Verilog로 구현하시오.
B. FSM은 다음 기능을 포함해야 한다.
- Active-low reset 처리
- f의 1클록 pulse 출력
- 입력 x의 101 패턴 검출
- g 출력 제어
- y 입력 시간 제한 검사
3. 문제 풀이
A. state
| 상태 | 의미 |
| A | Reset/Idle 상태 |
| B | f=1 출력 상태 |
| C | x=1 검출 |
| D | x=10 검출 |
| E | x=101 검출 완료 (g=1) |
| F | y 검사 1클록째 |
| G | y 검사 2클록째 |
| H | g=1 영구 유지 상태 |
| I | g=0 영구 유지 상태 |

4. 모듈 정의
module top_module (
input clk,
input resetn, // active-low synchronous reset
input x,
input y,
output f,
output g
);
5. 답
module top_module (
input clk,
input resetn, // active-low synchronous reset
input x,
input y,
output f,
output g
);
parameter A = 0, B = 1, C = 2, D = 3, E = 4, F = 5, G = 6, H = 7, I = 8;
reg [3:0] state, next_state;
assign f = (state == B);
assign g = (state == F)|(state == G)|(state == H);
always@(*)
begin
case(state)
A: next_state = B;
B: next_state = C;
C: next_state = x?D:C;
D: next_state = x?D:E;
E: next_state = x?F:C;
F: next_state = y?G:H;
G: next_state = G;
H: next_state = y?G:I;
I: next_state = I;
endcase
end
always@(posedge clk)
begin
if(!resetn)
state <= A;
else
state <= next_state;
end
endmodule
'Verilog > HDLbits' 카테고리의 다른 글
| [HDLBits] Exams/review2015 shiftcount (0) | 2026.05.31 |
|---|---|
| [HDLBits] Exams/review2015 count1k (0) | 2026.05.31 |
| [HDLBits] Exams/2013 q2afsm (0) | 2026.05.17 |
| [HDLBits] Exams/2012 q2b (0) | 2026.05.17 |
| [HDLBits] Exams/2012 q2fsm (0) | 2026.05.17 |