文章目录
- 奇偶校验
- 单目运算符(|,^,&)
- 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
时输出结果正好相反。