myshworks 发表于 2017-12-1 20:03:50

UART通信过程中,奇偶校验的理解

不明白下面程序奇偶校验的原理,还有,在接收第0位数据的时候为什么是计数24的时候?采样设置的是16X波特率,不应该是计数16的时候开始读取第0位数据吗?
//********************************************
// 检测线路的下降沿
//********************************************
        always@(posedge clk)
        begin
                rxbuf <= rx;
                rxfall <= rxbuf & (~rx);
        end

//*************************************************
// 当检测到线路的下降沿并且原先线路为空闲时,启动接收数据进程
//*************************************************       
        always@(posedge clk)
        begin
                if(rxfall && (~idle_n))
                begin
                        OpenRecevieSign <= 1'b1;
                end
                else if(cnt == 8'd168)
                begin
                        OpenRecevieSign <= 1'b0;         //接收数据完成
                end
        end

//********************************************
// 开始接收数据
//********************************************       
        always@(posedge clk)
        begin
                if(OpenRecevieSign == 1'b1)
                begin
                        case(cnt)
                        8'd0:
                        begin
                                idle_n <= 1'b1;       
                                cnt <= cnt + 8'd1;
                                rdsig <= 1'b0;
                        end
                        8'd24:                 // 这里为什么是24?
                        begin
                                idle_n <= 1'b1;
                                DataOut <= rx;         //接收第0位数据
                                presult <= ParityMode^rx;
                                cnt <= cnt + 8'd1;
                                rdsig <= 1'b0;
                        end
                        8'd40:
                        begin
                                idle_n <= 1'b1;
                                DataOut <= rx;         //接收第1位数据
                                presult <= presult^rx;
                                cnt <= cnt + 8'd1;
                                rdsig <= 1'b0;
                        end
                        8'd56:
                        begin
                                idle_n <= 1'b1;
                                DataOut <= rx;         //接收第2位数据
                                presult <= presult^rx;
                                cnt <= cnt + 8'd1;
                                rdsig <= 1'b0;
                        end
                        8'd72:
                        begin
                                idle_n <= 1'b1;
                                DataOut <= rx;         //接收第3位数据
                                presult <= presult^rx;
                                cnt <= cnt + 8'd1;
                                rdsig <= 1'b0;
                        end
                        8'd88:
                        begin
                                idle_n <= 1'b1;
                                DataOut <= rx;         //接收第4位数据
                                presult <= presult^rx;
                                cnt <= cnt + 8'd1;
                                rdsig <= 1'b0;
                        end
                        8'd104:
                        begin
                                idle_n <= 1'b1;
                                DataOut <= rx;         //接收第5位数据
                                presult <= presult^rx;
                                cnt <= cnt + 8'd1;
                                rdsig <= 1'b0;
                        end
                        8'd120:
                        begin
                                idle_n <= 1'b1;
                                DataOut <= rx;         //接收第6位数据
                                presult <= presult^rx;
                                cnt <= cnt + 8'd1;
                                rdsig <= 1'b0;
                        end
                        8'd136:
                        begin
                                idle_n <= 1'b1;
                                DataOut <= rx;         //接收第7位数据
                                presult <= presult^rx;
                                cnt <= cnt + 8'd1;
                                rdsig <= 1'b1;
                        end
                        8'd152:
                        begin
                                idle_n <= 1'b1;                 // 接收奇偶校验位
                                if(presult == rx)
                                        DataError <= 1'b0;
                                else
                                        DataError <= 1'b1; //如果奇偶校验位不对,表示数据出错
                                cnt <= cnt + 8'd1;
                                rdsig <= 1'b1;
                        end
                        8'd168:
                        begin
                                idle_n <= 1'b1;         // 接收停止位
                                if(1'b1 == rx)
                                        FrameError <= 1'b0;
                                else
                                        FrameError <= 1'b1; //如果没有接收到停止位,表示帧出错
                                cnt <= cnt + 8'd1;
                                rdsig <= 1'b1;
                        end
                        default:        
                                cnt <= cnt + 8'd1;
                        endcase
                end
                else
                begin
                        cnt <= 8'd0;
                        idle_n <= 1'b0;
                        rdsig <= 1'b0;
                end
        end

bangbangji 发表于 2017-12-1 22:40:33

这还不简单,一个起始位占16周期,第一个bit占第16~32个周期,第24个周期的时候刚好是第一个bit的中点,难道不应该在中点采样?

jm2011 发表于 2017-12-3 15:22:10

二楼正解,在数据的中点采集比较好;

lanlibo 发表于 2017-12-3 16:29:10


二楼正解,在数据的中点采集比较好;

huangqi412 发表于 2017-12-3 21:28:13

串口过采样中点或择多

myshworks 发表于 2017-12-5 21:40:05

bangbangji 发表于 2017-12-1 22:40
这还不简单,一个起始位占16周期,第一个bit占第16~32个周期,第24个周期的时候刚好是第一个bit的中点,难 ...

原来是这样,谢谢,那这个程序里面的奇偶校验是什么意思?它是如何检验数据没有出错的呢?

myshworks 发表于 2017-12-6 19:05:32

明白奇偶校验了的原理了,谢谢大家。

myshworks 发表于 2017-12-6 19:19:29

通过统计数据位和奇偶校验位中“1”的位数来判断数据传输的正确性。“1”的位数为奇数是奇校验,“1”的位数为偶数是偶校验。
就比如传输“A”(01000001)为例。
当为奇校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为1才能满足1的个数为奇数。

当为偶校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为0才能满足1的个数为偶数。
页: [1]
查看完整版本: UART通信过程中,奇偶校验的理解