您已经熟悉两个值之间的按位运算,例如,a & b 或 a ^ b。有时,你想创建一个宽门,对一个向量的所有位进行操作,比如(a[0] & a[1] & a[2] & a[3] ... ),如果向量很长,就会变得乏味。
约简运算符可以对矢量的位执行 AND、OR 和异或,从而产生一个位输出:
& a[3:0] // AND: a[3]&a[2]&a[1]&a[0]. Equivalent to (a[3:0] == 4'hf) | b[3:0] // OR: b[3]|b[2]|b[1]|b[0]. Equivalent to (b[3:0] != 4'h0) ^ c[2:0] // XOR: c[2]^c[1]^c[0]
这些是只有一个操作数的一元运算符(类似于 NOT 运算符 ! 和 ~)。您还可以反转这些门的输出以创建NAND,NOR和XNOR门,例如(~&d[7:0]))。
题目要求:
奇偶校验通常用作通过不完全通道传输数据时检测错误的简单方法。创建一个电路,该电路将计算 8 位字节的奇偶校验位(这将向字节添加第 9 位)。我们将使用"偶数"奇偶校验,其中奇偶校验位只是所有8个数据位的异或。
奇偶检验器的原理:
奇偶检验器的功能是检测数据中包含“1”的个数是奇数还是偶数。奇偶校验包含两种方式:奇检验和偶检验。奇校验保证传输数据和校验位中“1”的个数为奇数。如果数据中包含奇数个“1”,则校验位置0,如果数据中包含偶数个1,则校验位置1。偶检验保证传输数据和校验位中1的总数为偶数。如果数据中包含奇数个1,则校验位置1;如果数据中包含偶数个1,则校验位置0。
例如对8bit的奇偶校验(实际为9bit,1bit为校验位):10001101,如果采用偶检验,则偶校验位置0,对100011010取异或,得到的异或结果应当是:1。则此时的Fod=1,Fev = 0。(Fod表示偶校验,Fev表示奇校验)。
代码如下:
module top_module (
input [7:0] in,
output parity);
assign parity = ^ in[7:0];
endmodule