【红色飓风Nano二代测评】 串口接收模块设计优化
0赞
发表于 2014/6/3 12:02:59
阅读(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