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
这还不简单,一个起始位占16周期,第一个bit占第16~32个周期,第24个周期的时候刚好是第一个bit的中点,难道不应该在中点采样? 二楼正解,在数据的中点采集比较好;
二楼正解,在数据的中点采集比较好; 串口过采样中点或择多 bangbangji 发表于 2017-12-1 22:40
这还不简单,一个起始位占16周期,第一个bit占第16~32个周期,第24个周期的时候刚好是第一个bit的中点,难 ...
原来是这样,谢谢,那这个程序里面的奇偶校验是什么意思?它是如何检验数据没有出错的呢? 明白奇偶校验了的原理了,谢谢大家。 通过统计数据位和奇偶校验位中“1”的位数来判断数据传输的正确性。“1”的位数为奇数是奇校验,“1”的位数为偶数是偶校验。
就比如传输“A”(01000001)为例。
当为奇校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为1才能满足1的个数为奇数。
当为偶校验:”A”字符的8个bit位中有两个1,那么奇偶校验位为0才能满足1的个数为偶数。
页:
[1]