1.什么是奇偶校验?(验证数据传输的正确性)
通常通过设置一个奇偶校验位,来使需要校验的数据中”1“的个数为奇数或者偶数。
偶校验:数据和校验位中的 ”1“ 的总数为偶数,视为数据无误,否则数据有误。
奇校验:数据和校验位中的 ”1“ 的总数为奇数,视为数据无误,否则数据有误。
2.如何校验?
(1)结论1:^data_in=1,则data_in中有奇数个”1“。
对输入数据进行按位异或(假设输入数据是4位二进制数):^data_in =data_in[0] ^data_in[1] ^data_in[2] ^data_in[3]
比如:
data_in | ^data_in的值 |
---|---|
0011 | 0 |
1101 | 1 |
0001 | 1 |
1001 | 0 |
不难发现,当data_in中”1“的个数为奇数时,^data_in的值为1;
当data_in中”1“的个数为偶数时,^data_in的值为0。
(2)结论2:^data_in的值和偶校验位的值是相同的。
对data_in二进制码中所有的比特位进行求和:
· 当求和结果最低位为1时,data_in中”1“的数量为奇数(^data_in=1),偶校验位应当为1,从而使得data_in和校验位中”1“的总数为偶数。
· 当求和结果最低位为0时,data_in中”1“的数量为偶(^data_in=0),偶校验位应当为0,从而使得data_in和校验位中”1“的总数为偶数。
(3)结论3:数据和校验位满足偶校验的需求,则数据和取反的校验位合起来就能满足奇校验的需求。
3.题目
4.verilog代码
`timescale 1ns/1ns
module odd_sel(
input [31:0] bus,
input sel,
output check
);
//*************code***********//
wire even_bit;
wire odd_bit;
assign even_bit= ^bus; //偶校验码
assign odd_bit= ~even_bit; //奇校验码, 结论3
assign check=sel? even_bit : odd_bit;
//*************code***********//
endmodule
这里需要看题目的波形确定sel为1时,是什么校验。
分析波形图,可以看到,当sel=1时,check和 ^bus的值相同,根据结论2可知,此时为偶校验;sel=0时,check和 ^bus值相反,为奇校验。所以有assign check=sel? even_bit : odd_bit