1、如果数据位中包含偶数个1 校验位(P)就会置1,如果数据位中包含奇数个1,校验位(P)就会置0。数据位中1的个数加上校验位(P)总为奇数,这就是奇校验。
例:
0010_0001, P = 1 ===>Reslut=1_0010_0001,在Reslut中所有“1”加起为奇数
0000_0001, P = 0 ===>Reslut=0_0000_0001,在Reslut中所有“1”加起为奇数
2、如果数据位中包含偶数个1 校验位(P)就会置0,如果数据位中包含奇数个1,校验位(P)就会置1。数据位中1的个数加上校验位(P)总为偶数,这就是偶校验。
例:
0010_0001, P = 0 ===>Reslut=0_0010_0001,在Reslut中所有“1”加起为偶数
0000_0001, P = 1 ===>Reslut=1_0000_0001,在Reslut中所有“1”加起为偶数
3、如何求一组数据中的奇偶校验位(P)?
例偶校验:
(1)、a[3:0] = 0001;
a[0]与a[1]异或得1,1在与a[2]异或得1,1在与a[3]异或得1,那么P=1; 即P = a[0]^a[1]^a[2]^[3];Verilog 中可以这样写,p=^a; why?
(2)、b[3:0] = 0101;
b[0]与b[1]异或得1,1在与b[2]异或得0,0在与b[3]异或得0,那么P=0;同理p=^b;
好奇怪啊,书上说异或属于双目运算符,p=^a,那a跟谁异或呢?
摘自一位网友的解释“与、或、非以及异或等既可以作为位运算符,也可以作为一元约减运算符。作为位运算符时,除了“非”以外都是双目运算符,需要两个操作数;作为一元约减运算符时是单目运算符,即将操作数的第一位与第二位运算,得到结果与第三位运算……依次类推,最后得到一位运算结果”。
代码实现:
parity.v
1 module parity( 2 //input 3 input_bus, 4 5 //output 6 even_numbits, 7 odd_numbits 8 ); 9 input [7:0] input_bus; 10 output even_numbits; 11 output odd_numbits; 12 13 assign odd_numbits = ^input_bus; 14 assign even_numbits = ~odd_numbits; 15 16 endmodule
parity_top.v
1 `timescale 1ns/10ps 2 module parity_top; 3 reg [7:0] input_bus; 4 wire even_numbits,odd_numbits; 5 6 initial 7 begin 8 input_bus = 8'hzz; 9 #100; 10 input_bus = 8'b0000_0000; 11 #100; 12 input_bus = 8'b0000_0001; 13 #100; 14 input_bus = 8'b0001_0001; 15 #100; 16 input_bus = 8'b1001_1101; 17 #100; 18 input_bus = 8'b1111_1111; 19 #100; 20 end 21 parity parity_inst( 22 //input 23 .input_bus(input_bus), 24 25 //output 26 .even_numbits(even_numbits), 27 .odd_numbits(odd_numbits) 28 ); 29 endmodule
仿真结果:
其实在PS2鼠标实验有用到奇偶校验产生,但当时理解的不对,现在可以理解了。
既然上面说异或、与、或都可以作为单目运算符,那继续验证与吧。
带进位的加法器中:
1 module add(out,cin,cout); 2 input [7:0] out; 3 input cin; //进位 4 output cout; //产生进位 5 6 assign cout = &out &cin; 7 //只有当out[7:0]的所有各位都为1, 8 //并且进位cin也为1时才能产生进位cout 9 10 endmodule
激励文件:
1 `timescale 1ns/10ps 2 module add_top; 3 reg [7:0] out; 4 reg cin; 5 wire cout; 6 7 initial 8 begin 9 out = 8'hzz; 10 cin = 1'b0; 11 #100; 12 out = 8'b0000_0001; 13 cin = 1'b1; 14 #100; 15 out = 8'b1111_1111; 16 cin = 1'b1; 17 #100; 18 out = 8'b1111_1111; 19 cin = 1'b0; 20 #100; 21 end 22 add add_inst( 23 .out(out), 24 .cin(cin), 25 .cout(cout) 26 ); 27 endmodule
仿真波形: