题解 | #奇偶校验#
奇偶校验
https://www.nowcoder.com/practice/67d4dd382bb44c559a1d0a023857a7a6
1.题目:对输入的32位数据d[31:0]进行奇偶校验,如果sel=0,则此次进行偶校验,即check输出的值要保证{d,check}中有偶数个“1”;如果sel=1,则为奇校验,即数据d加上check的值要有奇数个‘’1”
2.解题思路:
考虑到异或的功能是:相同为0,不同为1,那么数据d中所有的“0”可以不用考虑(所有“0”异或为0),那么数据d[31:0]按位异或结果为“0”,说明d中 有偶数个“1”;
如果数据d[31:0]按位异或的结果为“1”,则说明d中存在奇数个“1”。将所有情况列出如下表所示:
例如:当sel=0时,校验方式位偶校验,如果按位异或^d的结果为0(说明d中偶数个“1”),因为是偶校验,check的结果给“0”即可;同理,如果^d的结果为“1”,则说明d中奇数个“1”,因为是偶校验,所以check输出1
备注:
奇校验: 数据d[31:0]和校验位check中“1”的个数总和为奇数个
偶校验:数据d[31:0]和校验位check中“1”的个数总和为偶数个
但是可以发现,如果按照sel =0 作为偶校验,sel=1作为奇校验得到的波形和参考波形相反,所以按照本题的参考波形 应该把sel=1作为偶校验,sel=0为奇校验。
3.参考代码:
`timescale 1ns/1ns
module odd_sel(
input [31:0] bus,
input sel,
output check
);
//*************code***********//
wire sum_odd;
assign sum_odd = ^bus;
assign check = (sel == 0) ? (sum_odd ? 1'b1 : 1'b0) : (sum_odd ? 1'b0: 1'b1);
//*************code***********//
endmodule
module odd_sel(
input [31:0] bus,
input sel,
output check
);
//*************code***********//
wire sum_odd;
assign sum_odd = ^bus;
assign check = (sel == 0) ? (sum_odd ? 1'b1 : 1'b0) : (sum_odd ? 1'b0: 1'b1);
//*************code***********//
endmodule
Sel |
校验方式 |
^d的值 |
含义 |
check |
0 |
偶校验 |
“0” |
d 中偶数个1 |
Check = “0” |
“1” |
d 中奇数个1 |
Check = “1” |
||
1 |
奇校验 |
“0” |
d 中偶数个1 |
Check = “1“ |
“1” |
d 中奇数个1 |
Check
= “0“
|