http://blog.sina.com.cn/s/blog_6c7b6f030101hj8p.html
1、奇偶校验位于数据位之后,占1位,用于表示串口通信中的校验方式。该位有用户根据需要决定,有奇校验,偶校验,无校验三种。一般都采用无奇偶校验的方式
2、所谓奇校验,就是判断发送方的数据位中1的个数是否是奇数。选择奇校验时,首先将数据位的各位进行“异或”操作,然后将结果与1相“异或”,得到的结果就是奇校验位的值。
说白了,奇校验就是确保发送的数据位中1的个数为奇数,如果数据位中1的个数是偶数,那就给校验位赋值1,如果数据位中1的个数是奇数,那就给校验位赋值0.这样就确保发送的数据中1的个数是奇数
3、偶校验跟奇校验相反,但处理步骤是一样的。偶检验位的计算方法是首先将数据位的各位进行“异或”操作,然后将结果与0相“异或”,得到的结果就是奇校验位的值。
4、串口发送时,先把奇偶校验位的值写入TB8,然后再将要发送的数据写入发送缓冲器SBUF
5、串口接收时,先接受数据缓冲器SBUF里面的数,并计算接收数据中的1的个数,然后读取RB8的值,进行比较,根据奇偶校验规则判断接收数据是否正确。
6、为什么奇偶校验不常用?
数据通信中的数据只能是1或者0,如果一个数据中的1位发生错误,那1的个数肯定就从奇数变为偶数(或者偶数变为奇数)。
但是如果数据中有多个数据位都发生错误了呢。举例来说,我们要发送11110000.如果有两位发生了错误,比如变成了11000000,那么1的个数还是偶数,那奇偶校验就检测不出来错误了。
所以说:如果数据中发生多位数据错误就可能检测不出来,更检测不到错误发生在哪一位;
7、关于TB8和RB8,这两位既可以作奇偶校验位。也可以做多机通信的数据,地址选择位
module parity(even_numbits,odd_numbits,input_bus);
output even_numbits,odd_numbits;
input [7:0] input_bus;
assign odd_numbits = ^input_bus;
assign even_numbits=~odd_numbits;
endmodule