• 奇偶校验位产生器


    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

    仿真波形:

  • 相关阅读:
    青檬音乐台闲时听听电台吧
    [转]What is AOP?
    实现页面元素拖动效果的JS函数
    gorithms.算法概论.习题答案
    Asp.Net读取并显示Excel文件中的内容(OleDb方式)
    收藏的一些小软件
    Master Page Path (MasterPage 相对路径)
    rundll32 netplwiz.dll,UsersRunDll
    关于锁
    我的回帖保存
  • 原文地址:https://www.cnblogs.com/wen2376/p/3459534.html
Copyright © 2020-2023  润新知