飞泉

【红色飓风Nano二代测评】 串口接收模块设计优化

0
阅读(1166)

    我对串口输入模块做了如下优化改进设计,并且采用了16 倍波特率采样时钟,并且当低电平次数大于7,则认为是低电平,否则高电平,这种设计可以显著提高抗干扰能力。如果通信过程中,信号受到了一些尖刺的干扰,这种设计很大程度上也能确保数据传输的正确性。但是如果采用中间采样一次的方法,如果尖刺,整好影响了这个位,那么数据就出错了。

    代码如下:

module UartRxd(Clk,Dout,IsDone,Rxd);
input Clk; //系统时钟
output [7:0] Dout; // 串口采样数据输出
output IsDone; //串口一次采样完成
input Rxd; //串口输入
reg Clk16;
reg [6 : 0]C1;
always @ (posedge Clk ) 
if( C1 < 7'd80 )begin Clk16 <= 1'b0;C1 <= C1 + 1'b1;end
else begin Clk16 <= 1'b1; C1 <= 7'd0; end
reg RxdD1,RxdD2;
always @ ( posedge Clk ) begin
RxdD1 <= Rxd; RxdD2 <= RxdD1;
end
parameter IDLE= 1'b0;
parameter SAMP= 1'b1; 
reg IsDone;
reg [7:0] Dout;
reg [3:0] C2;
reg [3:0] C3;
reg [3:0] i; 
reg IsSta= 1'b0; 
reg [0:0]s= 1'b0;
always @(posedge Clk) begin
IsDone <= 1'b0;
case ( s )
IDLE:
begin
i <= 4'd0; C2 <= 4'd0; C3 <= 4'd0; IsSta<= 1'b0;
if( !RxdD2 )begin s <= SAMP; end
end
SAMP:
if(Clk16)begin 
if(C2 < 4'd15) begin 
C2 <= C2 + 1'b1;
if(!RxdD2) C3 <= C3+1; else C3 <= C3;
if( i==4'd8&&C2==4'd12 )begin
s <= IDLE; if( C3 <4'd6 )IsDone <= 1'b1;
end
end
else begin
C2 <= 4'd0; C3 <= 4'd0;
if( !IsSta )begin 
i <= 4'd0; if( C3 > 4'd7) IsSta <= 1'b1; else begin IsSta <= 1'b0;
s<= IDLE; end
end
else if( i< 4'd8 )begin
if( C3 > 4'd7 ) Dout[i] <= 1'b0; else Dout[i] <= 1'b1; i <= i
+ 1'b1;
end
end
end
endcase
end
endmodule