文章目录
- 奇偶校验
- 单目运算符(|,^,&)
- verilog code
- verilog code
- testbench code
 
- 问题总结
 
奇偶校验
现在需要对输入的32位数据进行奇偶校验,根据sel输出校验结果。
 
实际上这里做的是奇偶检测,如果是奇数个 1 则结果为 1,使用单目运算符 ^ 即可。
输入描述:
- 输入信号 data_in, sel
- 类型 wire
输出描述:
- 输出信号 q
- 类型 wire
单目运算符(|,^,&)
假设 d = 3'b100;则:
e =& d= d[2] & d[1] & d[0];= 1'b0; 
f =^ d= d[2] ^ d[1] ^ d[0];= 1'b1
所以:
- e =& d; ----> 可以用于检测是否为全1(是否含0)
- f =^ d; -----> 奇偶校验
- g =| d; -----> 检测是否全为0
verilog code
在Verilog中,^运算符作为单目运算符时的功能是"按位异或",作为双目运算符时的功能是"异或"。当data_in是一个8 bit,的数据时:
 ^data_in = data_in[0] ^ data_in[1] ^ data_in[2] ^ data_in[3] ^ data_in[4] ^ data_in[5] ^ data_in[6] ^ data_in[7];
简言之,就是^bus,就是检查bus中1的个数是否是成对的,如果成队,那就是为0,也就是偶校验,所以奇校验刚好取反。
此外,还会根据 sel 的值来选择 校验结果是正常输出还是取反输出。
verilog code

testbench code


问题总结
在使用VCS 仿真是一开始出现了如下面问题:
 
 从波形上可以看到数据总线上是没有数据输入的,导致了 out 信号输出的问题,所以在复位以后就需要将数据总线赋值,这里在 testbench 中是将 数据总线在复位后赋值为0,最后结果如下图:
 
在 sel == 1'b1:
- 当有奇数个1时,校验结果为1,例如当 data 为 7,e, 1 时(校验结果在时钟上升沿时变化);
- 当有偶数个1时,校验结果为0,例如当 data 为 0,6 时;
在 sel == 1'b0 时输出结果正好相反。