Synchronous HDLC framing involves decoding a continuous bit stream of data to look for bit patterns that indicate the beginning and end of frames (packets). Seeing exactly 6 consecutive 1s (i.e., 01111110) is a "flag" that indicate frame boundaries. To avoid the data stream from accidentally containing "flags", the sender inserts a zero after every 5 consecutive 1s which the receiver must detect and discard. We also need to signal an error if there are 7 or more consecutive 1s.
Create a finite state machine to recognize these three sequences:
When the FSM is reset, it should be in a state that behaves as though the previous input were 0.
Here are some example sequences that illustrate the desired operation.
- module top_module(
- input clk,
- input reset, // Synchronous reset
- input in,
- output disc,
- output flag,
- output err);
- //0-5识别为1,5为0跳discard,为1跳6.6为1跳error,为0跳flag
- reg [3:0]state,next;
- parameter discard=7,flagg=8,error=9;
- always@(*)begin
- case(state)
- 0:next<=in?1:0;
- 1:next<=in?2:0;
- 2:next<=in?3:0;
- 3:next<=in?4:0;
- 4:next<=in?5:0;
- 5:next<=in?6:discard;
- 6:next<=in?error:flagg;
- discard:next<=in?1:0;
- flagg:next<=in?1:0;
- error:next<=in?error:0;
- endcase
- end
- always@(posedge clk) begin
- if(reset)
- state<=0;
- else
- state<=next;
- end
- assign disc=state==discard;
- assign flag=state==flagg;
- assign err=state==error;
- endmodule