错误情况1:
module top_module(
input clk,
input in,
input reset, // Synchronous reset
output done
);
parameter IDLE = 5'b00001;
parameter START = 5'b00010;
parameter RECV = 5'b00100;
parameter STOP = 5'b01000;
parameter END = 5'b10000;
reg [4:0] state, next;
integer cnt;
//state trans
always @(*) begin
if(reset)
next = IDLE;
else begin
case(state)
IDLE: begin
if(in == 0)
next = START;
else
next = IDLE;
end
START: begin
next = RECV;
end
RECV: begin
if(cnt >= 7)
next = STOP;
else
next = RECV;
end
STOP: begin
if(in == 1) begin
next = IDLE;
end
else begin
next = STOP;
end
end
default: begin
next = IDLE;
end
endcase
end
end
//ff
always @(posedge clk) begin
if(reset)
state = IDLE;
else
state = next;
end
//cnt
always @(posedge clk) begin
if(reset)
cnt = 0;
else begin
if(state == START)
cnt = 0;
else
cnt = cnt+1;
end
end
//output
assign done = (state==STOP)? 1'b1: 1'b0;
endmodule
错误状况2, 第一个字节的检验过了, 问题发生在第二个字节:
module top_module(
input clk,
input in,
input reset, // Synchronous reset
output done
);
parameter IDLE = 12'b000000000001;
parameter START = 12'b000000000010;
parameter B0 = 12'b000000000100;
parameter B1 = 12'b000000001000;
parameter B2 = 12'b000000010000;
parameter B3 = 12'b000000100000;
parameter B4 = 12'b000001000000;
parameter B5 = 12'b000010000000;
parameter B6 = 12'b000100000000;
parameter B7 = 12'b001000000000;
parameter STOP = 12'b010000000000;
parameter END = 12'b100000000000;
reg [11:0] state, next;
//ff
always @(posedge clk) begin
if(reset)
state = START;
else
state = next;
end
// trans
always @(*) begin
next = START;
case(state)
START:begin
if(in == 0)
next = B0;
else
next = START;
end
B0:begin
next = B1;
end
B1:begin
next = B2;
end
B2:begin
next = B3;
end
B3:begin
next = B4;
end
B4:begin
next = B5;
end
B5:begin
next = B6;
end
B6:begin
next = B7;
end
B7:begin
next = STOP;
end
STOP:begin
if(in == 1)
next = END;
else
next = STOP;
end
END:
next = START;
default:begin
next = START;
end
endcase
end
//out
assign done = (state == END)? 1: 0;
endmodule
第三版, 还是有错, 错误点又后移了, 新的验证条件是该出现stopbit的时候没出现, 晚了一个时钟, done不应该有一个输出, 表示这次的数据应该废弃。
module top_module(
input clk,
input in,
input reset, // Synchronous reset
output done
);
parameter IDLE = 12'b000000000001;
parameter START = 12'b000000000010;
parameter B0 = 12'b000000000100;
parameter B1 = 12'b000000001000;
parameter B2 = 12'b000000010000;
parameter B3 = 12'b000000100000;
parameter B4 = 12'b000001000000;
parameter B5 = 12'b000010000000;
parameter B6 = 12'b000100000000;
parameter B7 = 12'b001000000000;
parameter STOP = 12'b010000000000;
parameter END = 12'b100000000000;
reg [11:0] state, next;
//ff
always @(posedge clk) begin
if(reset)
state = START;
else
state = next;
end
// trans
always @(*) begin
next = START;
case(state)
START:begin
if(in == 0)
next = B0;
else
next = START;
end
B0:begin
next = B1;
end
B1:begin
next = B2;
end
B2:begin
next = B3;
end
B3:begin
next = B4;
end
B4:begin
next = B5;
end
B5:begin
next = B6;
end
B6:begin
next = B7;
end
B7:begin
next = STOP;
end
STOP:begin
if(in == 1)
next = END;
else
next = STOP;
end
END:
//next = START;
if(in == 0)
next = B0;
else
next = START;
default:begin
next = START;
end
endcase
end
//out
assign done = (state == END)? 1: 0;
endmodule
第四次修改, 加了一个error状态, 终于对了
module top_module(
input clk,
input in,
input reset, // Synchronous reset
output done
);
parameter IDLE = 13'b0000000000001;
parameter START = 13'b0000000000010;
parameter B0 = 13'b0000000000100;
parameter B1 = 13'b0000000001000;
parameter B2 = 13'b0000000010000;
parameter B3 = 13'b0000000100000;
parameter B4 = 13'b0000001000000;
parameter B5 = 13'b0000010000000;
parameter B6 = 13'b0000100000000;
parameter B7 = 13'b0001000000000;
parameter STOP = 13'b0010000000000;
parameter END = 13'b0100000000000;
parameter ERROR = 13'b1000000000000;
reg [12:0] state, next;
//ff
always @(posedge clk) begin
if(reset)
state = START;
else
state = next;
end
// trans
always @(*) begin
next = START;
case(state)
START:begin
if(in == 0)
next = B0;
else
next = START;
end
B0:begin
next = B1;
end
B1:begin
next = B2;
end
B2:begin
next = B3;
end
B3:begin
next = B4;
end
B4:begin
next = B5;
end
B5:begin
next = B6;
end
B6:begin
next = B7;
end
B7:begin
next = STOP;
end
STOP:begin
if(in == 1)
next = END;
else
next = ERROR;
end
ERROR:
if(in == 1)
next = START;
else
next = ERROR;
END:
if(in == 0)
next = B0;
else
next = START;
default:begin
next = START;
end
endcase
end
//out
assign done = (state == END)? 1: 0;
endmodule