奇偶校验位产生器

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

仿真波形:

原文地址:https://www.cnblogs.com/wen2376/p/3459534.html