在许多(较旧的)串行通信协议中,每个数据字节都与一个起始位和一个停止位一起发送,以帮助接收器从位流中划定字节。 一种常见的方案是使用 1 个起始位 (0)、8 个数据位和 1 个停止位 (1)。 当没有传输任何内容(空闲)时,该线路也处于逻辑 1。
设计一个有限状态机,当给定比特流时,它将识别何时正确接收到字节。 它需要识别起始位,等待所有 8 个数据位,然后验证停止位是否正确。 如果停止位未按预期出现,则 FSM 必须等到找到停止位后再尝试接收下一个字节。
module top_module(
input clk,
input in,
input reset, // Synchronous reset
output done
);
localparam IDLE=0,START=1,DATA=2,STOP=3,ERROR=4;
reg [2:0] state,nstate;
reg [3:0] cnt;
always@(posedge clk)
if(reset)
state<=IDLE;
else
state<=nstate;
always@(posedge clk)
if(reset)
cnt<=4'd0;
else
case(nstate)
START:cnt<=0;
DATA:cnt<=cnt+1;
default:cnt<=cnt;
endcase
always@(*)
begin
case(state)
IDLE:nstate=in?IDLE:START;
START:nstate=DATA;
DATA:nstate=(cnt==4'd8)?(in?STOP:ERROR):DATA;
STOP:nstate=in?IDLE:START;
ERROR:nstate=in?IDLE:ERROR;
default:nstate=IDLE;
endcase
end
assign done=(state==STOP);
endmodule
浙公网安备 33010602011771号